Pygame不会更新键盘事件,只有鼠标

问题描述 投票:0回答:1

我正在尝试移动图像,并想按键盘上的某些键以在窗口中动态移动。

我在下面这样做,但是请注意,只有当我按下键盘键并移动鼠标时,图像才会移动:

import sys
import pygame

UP = False
DOWN = False
LEFT = False
RIGHT = False

pygame.init()
screen = pygame.display.set_mode((800, 600))

clock = pygame.time.Clock()    
img = pygame.image.load('tank.png')

tank = [(img), (50, 50)]

while True:
    clock.tick(60)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()

        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_UP:
                UP = True
            elif event.key == pygame.K_DOWN:
                DOWN = True
            elif event.key == pygame.K_LEFT:
                LEFT = True
            elif event.key == pygame.K_RIGHT:
                RIGHT = True

        if event.type == pygame.KEYUP:
            if event.key == pygame.K_UP:
                UP = False
            elif event.key == pygame.K_DOWN:
                DOWN = False
            elif event.key == pygame.K_LEFT:
                LEFT = False
            elif event.key == pygame.K_RIGHT:
                RIGHT = False

        if (UP):
            tank = [tank[0], (tank[1][0], tank[1][1] - 10)]
        elif (DOWN):
            tank = [tank[0], (tank[1][0], tank[1][1] + 10)]
        elif (LEFT):
            tank = [tank[0], (tank[1][0] - 10, tank[1][1])]
        elif (RIGHT):
            tank = [tank[0], (tank[1][0] + 10, tank[1][1])]

    screen.fill((0,0,0))
    screen.blit(tank[0], tank[1])
    pygame.display.update()

我不希望发生这种情况,我只想按键盘键并自由移动图像,而不管鼠标是否在窗口中移动。

我该如何解决这个问题?

python pygame atom-editor
1个回答
1
投票

您的问题很简单-您的运动代码不是外部while的一部分,而是内部事件循环。这导致仅在事件发生时才执行运动。鼠标或键盘无关。请参阅此内容以得到一些改进和有效的版本:

import sys
import pygame

def main():
    pressed = set()

    pygame.init()
    screen = pygame.display.set_mode((800, 600))

    clock = pygame.time.Clock()
    img = pygame.image.load('tank.jpg')

    tank = [(img), (50, 50)]

    while True:

        clock.tick(60)
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()

            if event.type == pygame.KEYDOWN:
                pressed.add(event.key)

            if event.type == pygame.KEYUP and event.key in pressed:
                pressed.remove(event.key)

        if pygame.K_UP in pressed:
            tank = [tank[0], (tank[1][0], tank[1][1] - 10)]
        if pygame.K_DOWN in pressed:
            tank = [tank[0], (tank[1][0], tank[1][1] + 10)]
        elif pygame.K_LEFT in pressed:
            tank = [tank[0], (tank[1][0] - 10, tank[1][1])]
        elif pygame.K_RIGHT in pressed:
            tank = [tank[0], (tank[1][0] + 10, tank[1][1])]

        screen.fill((0,0,0))
        screen.blit(tank[0], tank[1])
        pygame.display.update()

if __name__ == '__main__':
    main()
© www.soinside.com 2019 - 2024. All rights reserved.