运动代码在 pygame 2.0.1 中不起作用

问题描述

我正在 pygame 中制作一个简单的游戏。一切似乎都在正确运行并且没有错误,但是移动精灵的代码似乎不起作用。如果我将精灵设置为自动移动它工作正常,所以我认为这是按键检测系统的问题。这是主要的游戏循环:

running = True
while running:
    # basic game function checks
    pygame.display.flip()
    clock.tick(60)
    movementtest(testX,testY)

    # checking if the game has been closed
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_ESCAPE:
                running = False

    # movement code
    if movingleft:
        testX -= testX
    if movingright:
        testX += testX
    if movingup:
        testY += testY
    if movingdown:
        testY -= testY
    for event in pygame.event.get():
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_a:
                if not movingright:
                    movingleft = True
            if event.key == pygame.K_d:
                if not movingleft:
                    movingright = True
            if event.key == pygame.K_w:
                if not movingdown:
                    movingup = True
            if event.key == pygame.K_s:
                if not movingup:
                    movingdown = True
        if event.type == pygame.KEYUP:
            if event.key == pygame.K_a:
                movingleft = False
            if event.key == pygame.K_d:
                movingright = False
            if event.key == pygame.K_w:
                movingup = False
            if event.key == pygame.K_s:
                movingdown = False

为什么它没有检测到我的按键输入?如果需要,我会发布预循环代码

解决方法

pygame.event.get() 获取所有消息并将它们从队列中删除。请参阅文档:

这将获取所有消息并将它们从队列中删除。 [...]

如果在多个事件循环中调用 pygame.event.get(),则只有一个循环接收事件,但不会所有循环都接收所有事件。因此,似乎错过了一些事件。

要么实现单个事件循环,要么每帧获取一次事件并在多个循环中使用它们:

running = True
while running:
    # [...]

    event_list = pygame.event.get():

    # checking if the game has been closed
    for event in event_list :
        if event.type == pygame.QUIT:
            running = False
        # [...]

    # [...]

    for event in event_list:
        # [...]

另外,你需要通过常量来改变玩家的位置,而不是位置本身:

running = True
while running:
    # [...]

    if movingleft:
        testX -= 1
    if movingright:
        testX += 1
    if movingup:
        testY -= 1
    if movingdown:
        testY += 1 

但是,可以通过使用 pygame.key.get_pressed() 代替键盘事件来简化代码。

键盘事件(参见 pygame.event 模块)仅在键的状态改变时发生一次。 KEYDOWN 事件在每次按下键时发生一次。 KEYUP 每次释放键时出现一次。将键盘事件用于单个操作或逐步移动。

pygame.key.get_pressed() 返回一个包含每个键状态的列表。如果某个键被按下,则该键的状态为 True,否则为 False。使用 pygame.key.get_pressed() 评估按钮的当前状态并获得连续移动:

running = True
while running:
    # basic game function checks
    pygame.display.flip()
    clock.tick(60)
    movementtest(testX,testY)

    # checking if the game has been closed
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_ESCAPE:
                running = False

    # movement code
    keys = pygame.key.get_pressed()
    if key[pygae.K_a]:
        testX -= 1
    if key[pygae.K_d]:
        testX += 1
    if key[pygae.K_w]:
        testY -= 1
    if key[pygae.K_s]:
        testY += 1