Pygame движущихся объектов при нажатии клавиши - PullRequest
0 голосов
/ 25 мая 2018

У меня проблема с непрерывным перемещением объектов при нажатии клавиши.Насколько я знаю, события Pygame запускаются только при получении нового сигнала, и нажатие клавиши не является сигналом, который продолжается с каждым кадром.Из приведенного ниже кода, например, когда я нажимаю w , объект перемещается только при нажатии и при отпускании клавиши.Я не могу достичь цели, чтобы двигаться, пока я продолжаю нажимать клавишу.Я также опробовал операторы if, проверив event.key вместо проверки списка get_pressed(), но я получил тот же результат.

while not crashed:
for event in pygame.event.get():
    if event.type == pygame.QUIT:
        crashed = True

    keys = pygame.key.get_pressed()
    print(keys[pygame.K_w])

    if keys[pygame.K_w] and keys[pygame.K_d]:
        x_change = 3
        x += x_change
        y_change = -3
        y += y_change
    elif keys[pygame.K_w] and keys[pygame.K_a]:
        x_change = -3
        x += x_change
        y_change = -3
        y += y_change
    elif keys[pygame.K_s] and keys[pygame.K_d]:
        x_change = 3
        x += x_change
        y_change = 3
        y += y_change
    elif keys[pygame.K_s] and keys[pygame.K_a]:
        x_change = -3
        x += x_change
        y_change = 3
        y += y_change

    elif keys[pygame.K_a]:
        x_change = -3
        x += x_change
    elif keys[pygame.K_d]:
        x_change = 3
        x += x_change
    elif keys[pygame.K_w]:
        y_change = -3
        y += y_change
    elif keys[pygame.K_s]:
        y_change = 3
        y += y_change


    #ERASE OLD
    screen.fill(WHITE)
    #FILL NEW
    all_sprites_list.draw(screen)
    wall.changePosition(x,y)
    player.draw(start_x,start_y)

    pygame.display.update()
    clock.tick(60)

1 Ответ

0 голосов
/ 26 мая 2018

Похоже, что строка keys = pygame.key.get_pressed() и следующие строки находятся в вашем цикле событий, и это означает, что они выполняются только один раз для каждого события в очереди событий.На самом деле они должны находиться во внешнем цикле while, поэтому просто выделите следующие строки:

while not crashed:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            crashed = True

    keys = pygame.key.get_pressed()

    if keys[pygame.K_w] and keys[pygame.K_d]:
        x_change = 3
    # etc.

Вы также можете немного сократить свой код:

x_change = 3
y_change = 3

crashed = False
while not crashed:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            crashed = True

    keys = pygame.key.get_pressed()

    if keys[pygame.K_a]:
        x += -x_change
    elif keys[pygame.K_d]:
        x += x_change

    if keys[pygame.K_w]:
        y += -y_change
    elif keys[pygame.K_s]:
        y += y_change

Другой альтернативой будет удалениеkey.get_pressed строк и просто установите x_change и y_change в цикле событий:

for event in pygame.event.get():
    if event.type == pygame.QUIT:
        crashed = True
    elif event.type == pygame.KEYDOWN:
        if event.key == pygame.K_d:
            x_change = 3
        # etc.
    elif event.type == pygame.KEYUP:
        if event.key == pygame.K_d and x_change > 0:
            x_change = 0
        # etc.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...