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