Pygame KEYDOWN箭头键导致玩家在移动过程中被“卡住”

时间:2020-09-28 08:18:21

标签: python pygame

问题:嗨,我遇到了一个问题,尝试使用键盘箭头键(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())

1 个答案:

答案 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]

# [...]
相关问题