没有适当输入的Pygame图像移动

时间:2018-02-10 14:45:03

标签: python image animation pygame mouse

我最近开始使用pygame进行修补,我制作了这段代码(遵循教程):

import pygame

pygame.init()
display_width = 1920
display_height = 1080
black = (0,0,0)
white = (255,255,255)
red = (255,0,0)
gameDisplay = pygame.display.set_mode((display_width,display_height))

pygame.display.set_caption("Galvadon's Adventure")

clock = pygame.time.Clock()

galvadon = pygame.image.load("galvadonModelVersion1.0.png")

def galvadonIsHere(x,y):
    gameDisplay.blit(galvadon,(x,y))

x = (display_width * 0.30)
y = (display_height * 0.2)
y_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.key == pygame.K_DOWN:
                y_change = 5
            elif event.key == pygame.K_UP:
                y_change = -5
            if event.type == pygame.KEYUP:
                if event.key == pygame.K_UP or event.key == pygame.K_DOWN:
                    y_change = 0
        y += y_change

        gameDisplay.fill(white) 
        galvadonIsHere(x,y)
        print(event)
        pygame.display.update()
        clock.tick(30)

pygame.quit()
quit() 

并且在这个代码有效的范围内,问题是在使用向上和向下箭头移动图像之后,图像开始响应任何鼠标移动,只是沿着它最后移动的方向滑动。我可能错过了一些东西,但我似乎无法找到它是什么。我看了各种寻找答案的网站,但我找不到有人提出类似的问题,所以我为什么要这个话题。

2 个答案:

答案 0 :(得分:2)

有些事情你可以在这里做得更好。但我们先来解决问题。

'Bug'是按下按键后,y_change已设置,从不为下一个引擎循环重置。这应该可以帮到你:

...
while not crashed:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            crashed = True
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_DOWN:
                y_change = 5
            elif event.key == pygame.K_UP:
                y_change = -5
            if event.type == pygame.KEYUP:
                if event.key == pygame.K_UP or event.key == pygame.K_DOWN:
                    y_change = 0
        y += y_change

        gameDisplay.fill(white)
        galvadonIsHere(x, y)
        print(event)
        pygame.display.update()
        clock.tick(30)

        y_change = 0
...

请密切关注我的代码段中的最后一行。在这里你重置y_change所以在下一个引擎循环中,无论发生什么或不发生,它都不会影响图像的位置。

重构并改进

首先,您可以同意检查event类型是否为KEY_DOWN,并且嵌套检查是否为特定关键按钮是很难阅读和使用的。更不用说你检查event类型是KEYUP,即使你知道KEYDOWN在这里:

    if event.type == pygame.KEYDOWN:
    ...
        if event.type == pygame.KEYUP:
            if event.key == pygame.K_UP or event.key == pygame.K_DOWN:
                y_change = 0

所以,我所做的是定义辅助函数,通常可以是lambda。现在,许多人会争辩lambda函数正在影响可读性,但在这里它肯定可以帮助你进行这些检查。

示例:

key_pressed = lambda event, key: event.type == pygame.KEYDOWN and event.key == key

while not crashed:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            crashed = True
            break
        elif key_pressed(event, pygame.K_DOWN):
            y_change = 5
        elif key_pressed(event, pygame.K_UP):
            y_change = -5
        else:
            y_change = 0

        y += y_change

        gameDisplay.fill(white)
        galvadonIsHere(x, y)
        print(event)
        pygame.display.update()
        clock.tick(30)

        y_change = 0

还有一点,请注意有pygame.QUIT事件的情况。 break退出for循环,然后while循环结束。这样您就不会处理任何排队的事件,也不会更新和blit图像。

答案 1 :(得分:0)

你的问题是在while循环中。 keyup的if语句位于keydown的if语句中,因此阻止了它的工作。以下解决了您的问题:

while not crashed:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            crashed = True
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_DOWN:
                y_change = 5
            elif event.key == pygame.K_UP:
                y_change = -5
        else:
            y_change = 0

希望这有帮助。