问题:嗨,我遇到了一个问题,尝试使用键盘箭头键(K_LEFT,K_RIGHT等)更新播放器(马里奥)的位置。这些动作按预期工作,但由于我的播放器无法再移动,除非再次按下键,否则动作会“卡住”。我的播放器再次按4个箭头方向恢复正常运动,但是除非我再按两次相同的键(或另一个键)使其再次移动,否则很快就会再次卡住。
上下文信息:我加入了“ self.pause”,因为我想要一种方法来阻止玩家在KEYUP后继续移动并释放箭头键盘键。 “ self.move_left”,“ self.move_right”等都是布尔变量,“ self.move_rate”是任意数值。
到目前为止调试:我写了一些打印语句来弄清楚发生了什么(并删除了其中一些以避免混乱)。我看到代码片段中的分支按预期进行。例如,我可能会按K_DOWN向下移动,然后它会“卡住”,但我的打印语句会告诉我布尔值“ self.move_down”为True,而“ self.pause”为False(表示我可以移动)而且我目前位于move()函数中“ if self.move_down”下面的分支中。
感谢您的帮助
for event in pygame.event.get():
if event.type == QUIT:
terminate()
if event.type == KEYDOWN:
mario.pause = False
if event.key == K_LEFT:
mario.move_left, mario.move_right, mario.move_up, mario.move_down = True, False, False, False
elif event.key == K_RIGHT:
mario.move_left, mario.move_right, mario.move_up, mario.move_down = False, True, False, False
elif event.key == K_UP:
mario.move_left, mario.move_right, mario.move_up, mario.move_down = False, False, True, False
elif event.key == K_DOWN:
mario.move_left, mario.move_right, mario.move_up, mario.move_down = False, False, False, True
elif event.type == KEYUP:
# if event.key == K_LEFT:
# mario.move_left = False
# if event.key == K_RIGHT:
# mario.move_right == False
# if event.key == K_UP:
# mario.move_up == False
# if event.key == K_DOWN:
# move_down == False
mario.pause = True
以及其他相关代码段
def move(self, window_surface):
if not self.pause:
#print(f"""status: pause->{self.pause} up -> {self.move_up}, down -> {self.move_down} left -> {self.move_left} right -> {self.move_right}""")
if self.move_left:
#self.body.left -= self.move_rate
self.body.move_ip(-1 * self.move_rate, 0)
if self.move_right:
#self.body.left += self.move_rate
self.body.move_ip(self.move_rate, 0)
if self.move_up:
#self.body.top -= self.move_rate
self.body.move_ip(0, -1 * self.move_rate)
if self.move_down:
#self.body.top += self.move_rate
self.body.move_ip(0, self.move_rate)
self.body.clamp_ip(window_surface.get_rect())
答案 0 :(得分:3)
如果要实现连续移动,请使用pygame.key.get_pressed()
而不是键盘事件:
for event in pygame.event.get():
if event.type == QUIT:
terminate()
keys = pygame.key.get_pressed()
mario.move_left = keys[K_LEFT] and not keys[K_RIGHT]
mario.move_right = keys[K_RIGHT] and not keys[K_LEFT]
mario.move_up = keys[K_UP] and not keys[K_DOWN]
mario.move_down = keys[K_DOWN] and not keys[K_UP]
# [...]