Я пытаюсь создать игровой движок 2D, который позже будет обновлен до 3D в стиле Duke Nukem 3D. Прямо сейчас я делаю двухмерный вид сверху вниз, где я могу проверить, все ли координаты находятся в нужном месте, а затем я могу начать работу над трехмерным движком. Он предназначен для работы, позволяя игроку двигаться в 2D и показывая, где находится игрок и в каком направлении он смотрит, а также рисует одну «стену». Когда я двигаюсь, я хочу, чтобы игрок оставался неподвижным, а карта двигалась, но рендеринг стены не работает правильно, и я получаю неправильные линии, которые медленно удаляются. Это видео, из которого я получил концепцию: https://www.youtube.com/watch?v=HQYsFshbkYw
Он объяснит, как все должно работать.
import pygame, math
pygame.init()
CLOCK = pygame.time.Clock()
DISPLAYWIDTH, DISPLAYHEIGHT = 200, 200
YELLOW, RED, GREEN, BLUE, BLACK, WHITE, GREY = (255, 255, 0), (255, 0, 0), (0, 255, 0), (0, 0, 255), (0, 0, 0), (255, 255, 255), (128, 128, 128)
#players starting coords, angle they are facing, how much they are rotating between frames and how much they move forward between frames
px, py, pf, pr, pm = 50, 50, -90, 0, 0
#position of wall
x1, y1, x2, y2 =10, 10, 150, 60
DISPLAYSURF = pygame.display.set_mode((DISPLAYWIDTH, DISPLAYHEIGHT))
#This returns the coords of the point (x, y) after rotating around (a, b) by theta degrees
def rotAroundPoint(x, y, a, b, theta):
theta = theta * (math.pi/180) #convert to radians
return (math.cos(theta) * (x - a) - math.sin(theta) * (y-b) + x, math.sin(theta) * (x - a) + math.cos(theta) * (y-b) + y)
while True:
DISPLAYSURF.fill(BLACK)
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
#check for keys (w for forward, a and d for rotating)
keys = pygame.key.get_pressed()
if keys[pygame.K_w]:
pm = 2
else:
pm = 0
if keys[pygame.K_a]:
pr = -3
elif keys[pygame.K_d]:
pr = 3
else:
pr = 0
#rotate the player
pf += pr
#move the player forward along the direction they are facing
px += pm * math.cos(math.radians(pf))
py += pm * math.sin(math.radians(pf))
#the coords of where to draw the wall
rotPoint1 = rotAroundPoint(x1, y1, px, py, pf)
rotPoint2 = rotAroundPoint(x2, y2, px, py, pf)
#draw everything and update
pygame.draw.line(DISPLAYSURF, YELLOW, rotPoint1, rotPoint2)
pygame.draw.aaline(DISPLAYSURF, GREY, (50, 50), (50 + math.cos(math.radians(pf)) * 10, 50 + math.sin(math.radians(pf)) * 10))
pygame.draw.circle(DISPLAYSURF, WHITE, (50, 50), 2)
pygame.display.flip()
CLOCK.tick(35)
он должен держать игрока в положении (50, 50) вверх и перемещать карту, но этого не происходит