多次按下键可移动 pygame 中的图像

Key to be pressed multiple times to move image in pygame

当我学习如何在 pygame 中移动图像时,当我按住一个键(任意一个:上、下、左、右)来移动我的图像(赛车)时,只有图像移动了一次,即使按住该键应该会使图像在特定方向上连续移动,但它只移动了一个单位。我发现的修复是,用于更改原始位置的变量声明(x_vary 和 y_vary,原始位置:x 和 y)没有添加到我游戏的主 while 循环中.

我的问题是为什么?为什么我声明 x_vary 和 y_vary

会有所不同

这里是未修复的代码:

import pygame

pygame.init()

clock = pygame.time.Clock()

game_window = pygame.display.set_mode((800, 600))
game_icon = pygame.image.load('icon2.jpg')
game_caption = pygame.display.set_caption('Racecar Game')

x = 800 * 0.45
y = 600 * 0.08

racecar = pygame.image.load('racecar.png')

def car(x, y):
    game_window.blit(racecar,(x,y)) 

game_run = False

while game_run == False:

    x_vary = 0
    y_vary = 0

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            game_run = True
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                x_vary = -10
            elif event.key == pygame.K_RIGHT:
                x_vary = +10
            elif event.key == pygame.K_UP:
                y_vary = -10
            elif event.key == pygame.K_DOWN:
                y_vary = +10
        if event.type == pygame.KEYUP:
            if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT or event.key == pygame.K_UP or event.key == pygame.K_DOWN:
                x_vary = 0
                y_vary = 0

    x += x_vary
    y += y_vary

    game_window.fill((128, 0, 0))
    car(x, y)

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

pygame.quit()
quit()

键盘事件(pygame.KEYDOWNpygame.KEYUP)只在一个键被按下和松开时发生一次。

如果在主应用程序循环中声明了 x_vary = 0y_vary = 0,则它们会在按下按钮时设置,但会在下一帧立即重新初始化 (0)。你必须再次按下一个按钮来设置它们。

如果在主应用程序循环之前声明了 x_vary = 0y_vary = 0,那么它们将保留按下按钮时设置的值。如果释放一个按钮,则两者都设置为 0。

使用pygame.key.get_pressed(),判断按键的状态是否被按下。 pygame.key.get_pressed() 获取所有键盘按钮的状态,只要按下键盘,一个键的状态就是 True。例如:

game_run = False
while game_run == False:

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            game_run = True

    keys = pygame.key.get_pressed()
    x_vary, y_vary = 0, 0
    if keys[pygame.K_LEFT]:
        x_vary = -10
    if keys[pygame.K_RIGHT]:
        x_vary = +10
    if keys[pygame.K_UP]:
        y_vary = -10
    if keys[pygame.K_DOWN]:
        y_vary = +10

    x += x_vary
    y += y_vary

    game_window.fill((128, 0, 0))
    car(x, y)

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