Как исправить странную проблему рендеринга в 2D Pygame с помощью математики - PullRequest
1 голос
/ 14 мая 2019

Я пытаюсь создать игровой движок 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) вверх и перемещать карту, но этого не происходит

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...