Когда луч идеально параллелен стене, кажется, что он «проходит» сквозь нее.
Существует реализация, предотвращающая это (строка 78 -> строка 82), но в определенных сценариях, например, когда игрок спаунится (coords=(450, 468) и (450, 570)), это не предотвращает этого.
Я пытался добавить интервал для ошибки в операторе if, что не удалось.
Я пытался задать ChatGPT, но это не удалось.
Понятия не имею.
Код:
##############################################################################
import pygame
import math
#######################################
pygame.init()
X, Y = 800, 800
DISPLAY = pygame.display.set_mode((X, Y))
clock = pygame.time.Clock()
FPS = 60
pygame.display.set_caption("2D Ray Tracing")
white = (255, 255, 255)
black = (0, 0, 0)
red = (255, 0, 0)
##############################################################################
def renderPlayer(playerXY):
return pygame.draw.rect(DISPLAY, red, (playerXY[0]-10, playerXY[1]-10, 20, 20))
#######################################
def renderObjects(map, mapDimensions):
wallRects = []
for tile in range(len(map)):
if map[tile] == 1:
wallRects.append(pygame.draw.rect(DISPLAY, white, ((tile%mapDimensions[0])*X/mapDimensions[0], (tile//mapDimensions[1])*Y/mapDimensions[1], X/mapDimensions[0], Y/mapDimensions[1])))
return wallRects
#######################################
def checkCollisions(playerRect, playerXY, wallRects):
playerRect.center = playerXY
for rect in wallRects:
if playerRect.left < rect.right and playerRect.right > rect.left and playerRect.top < rect.bottom and playerRect.bottom > rect.top:
return True
return False
#######################################
def drawRays(playerXY, wallRects):
rayEnds = []
for rayNum in range(numOfRays):
rayAngle = math.radians((360/numOfRays)*rayNum)
rayDir = (math.cos(rayAngle), math.sin(rayAngle))
rayEnd = (playerXY[0]+rayDir[0]*X, playerXY[1]+rayDir[1]*Y)
closest = None
closestDist = float("inf")
# Get wallRects that are touching the ray
collidedRects = []
for rect in wallRects:
if rect.clipline(playerXY, rayEnd):
collidedRects.append(rect)
# Of the wallRects that are touching the ray, get the nearest to the player
for wall in collidedRects:
x1, y1 = wall.topleft
x2, y2 = wall.topright
x3, y3 = wall.bottomleft
x4, y4 = wall.bottomright
# Check for intersection with each wall side
wallSides = [
((x1, y1), (x2, y2)), # Top side
((x2, y2), (x4, y4)), # Right side
((x4, y4), (x3, y3)), # Bottom side
((x3, y3), (x1, y1)), # Left side
]
for (x1, y1), (x2, y2) in wallSides:
x3, y3 = playerXY
x4, y4 = rayEnd
denominator = ((x1-x2)*(y3-y4))-((y1-y2)*(x3-x4))
if denominator == 0: # No intersection if lines are parallel
continue
t = ((x1-x3)*(y3-y4)-(y1-y3)*(x3-x4))/denominator
u = -((x1-x2)*(y1-y3)-(y1-y2)*(x1-x3))/denominator
if 0
Подробнее здесь: https://stackoverflow.com/questions/793 ... -in-pygame
Как мне это исправить (raycaster в pygame)? [дубликат] ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение