Pygame中按键无法移动游戏中的对象

111 阅读2分钟

在使用Pygame编写一个简单的游戏中,玩家需要使用按键来控制汽车左右移动。但是,当按下按键时,汽车并没有移动。

以下是在Python中实现移动汽车代码:

import pygame
from pygame.locals import *
pygame.init() 

black = (0,0,0)
white = (255,255,255)

GD1 = pygame.display.set_mode((800, 600))
pygame.display.set_caption("Racing!") 
clock = pygame.time.Clock() 

carimg = pygame.image.load("C:/Users/Abdulaziz/Downloads/my_app___car_sprite_5_by_nicolaspok-d65xysp.png")

def car(x,y):
    GD1.blit(carimg,(x,y))

x = (800 * 0.45)
y = (600 * 0.7)

x_change = 0

crashed = False 

while not crashed: 

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

        if event.type == pygame.KEYDOWN:
            if event.type == pygame.K_LEFT:
                x_change = -5
            elif event.type == pygame.K_RIGHT:
                x_change = 5


        if event.type == pygame.KEYUP:
            if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
               x_change = 0

    x += x_change

    GD1.fill(white)
    car(x,y)



    pygame.display.flip() 
    clock.tick(60) 
pygame.quit()
quit()

在代码中,汽车的位置由变量x和y表示。x_change变量记录了汽车的移动速度,当按下左键右键时,x_change会相应地改变,从而实现汽车左右移动。

但是,在运行游戏时,按下按键并没有使汽车移动。经查,问题出在以下部分:

if event.type == pygame.KEYDOWN:
            if event.type == pygame.K_LEFT:
                x_change = -5
            elif event.type == pygame.K_RIGHT:
                x_change = 5


    if event.type == pygame.KEYUP:
        if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
           x_change = 0

在按下按键时,程序会正确地将x_change的值设置为-5或5,但在松开按键时,由于event.type仍然是KEYDOWNx_change会被立即重置为0。因此,汽车无法移动。

2、解决方案

为了解决此问题,需要在判断事件类型时使用event.key来区分是按下按键还是松开按键。将上述代码修改为:

if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                x_change = -5
            elif event.key == pygame.K_RIGHT:
                x_change = 5


    if event.type == pygame.KEYUP:
        if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
           x_change = 0

在该代码中,在按下按键时,event.key会记录下按下的键的键值,然后根据键值来改变x_change的值。在松开按键时,event.key也会记录下松开的键的键值,然后根据键值来将x_change的值重置为0。

修正后,汽车能够左右移动了。

另外,还有另一种解决方案是将x_change的更新移到循环的开头:

for event in pygame.event.get(): 
    # modifications to x_change

x += x_change

这样做的目的是确保x_change的值在每次循环时都能更新,即使在事件循环中处理了多个事件。