【问题标题】:Python pygame need help disabling multiple keypresses at once [duplicate]Python pygame需要帮助一次禁用多个按键[重复]
【发布时间】:2020-12-01 15:09:49
【问题描述】:

我创建了一个Frogger 游戏原型,我希望不允许同时按下两个键来移动。目前在我的事件函数中,我有以下内容:

for event in pygame.event.get():
        # check for closing window
        if event.type == pygame.QUIT:
            if self.playing:
                self.playing = False
            self.running = False
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                self.player.speedx = -48
            if event.key == pygame.K_RIGHT:
                self.player.speedx = 48
            if event.key == pygame.K_UP:
                self.player.speedy = -48
            if event.key == pygame.K_DOWN:
                self.player.speedy = 48

            
    if event.type == pygame.KEYUP:
        if event.key == pygame.K_LEFT:
            self.player.speedx = 0
            self.player.speedy = 0
        if event.key == pygame.K_RIGHT:
            self.player.speedx = 0
            self.player.speedy = 0
        if event.key == pygame.K_UP:
            self.player.speedx = 0
            self.player.speedy = 0
        if event.key == pygame.K_DOWN:
            self.player.speedx = 0
            self.player.speedy = 0
                
    self.player.rect.x += self.player.speedx
    self.player.rect.y += self.player.speedy

这允许用户向左、向右、向上和向下移动。虽然我不希望用户能够同时按下两个键,例如:左、上或右、上,但它运行正常。也想排除其他方向,例如:左,下或右,下。基本上我希望用户一次只能向一个方向旅行。另外,有没有在按键之间设置时间限制?例如,在 1000 毫秒过去之前,您不能再次按下某个键。

【问题讨论】:

    标签: python oop pygame


    【解决方案1】:

    您所要做的就是评估按下某个键时速度为 0:

    for event in pygame.event.get():
            # check for closing window
            if event.type == pygame.QUIT:
                if self.playing:
                    self.playing = False
                self.running = False
            if event.type == pygame.KEYDOWN:
    
                if self.player.speedx == 0 and self.player.speedy == 0:
                    if event.key == pygame.K_LEFT:
                        self.player.speedx = -48
                    if event.key == pygame.K_RIGHT:
                        self.player.speedx = 48
                    if event.key == pygame.K_UP:
                        self.player.speedy = -48
                    if event.key == pygame.K_DOWN:
                        self.player.speedy = 48
                # [...]
    

    另一种选择是在按下 a 键时重置速度:

    for event in pygame.event.get():
            # check for closing window
            if event.type == pygame.QUIT:
                if self.playing:
                    self.playing = False
                self.running = False
            if event.type == pygame.KEYDOWN:
       
             if event.key == pygame.K_LEFT:
                    self.player.speedx = -48
                    self.player.speedy = 0
                if event.key == pygame.K_RIGHT:
                    self.player.speedx = 48
                    self.player.speedy = 0
                if event.key == pygame.K_UP:
                    self.player.speedx = 0
                    self.player.speedy = -48
                if event.key == pygame.K_DOWN:
                    self.player.speedx = 0
                    self.player.speedy = 48
    

    这两种实现的行为不同。虽然第一个实现不允许您在按下键时改变方向,但第二个实现会立即改变方向。两者都试一下,然后选择适合您需求的那个。

    【讨论】:

    • 好的,谢谢,第一个按我的预期工作。
    • @user321321 你为什么不接受这个答案?当您遇到新问题时,请提出新问题,但不要收回接受答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-06
    • 1970-01-01
    • 2020-12-12
    • 2021-03-19
    • 1970-01-01
    相关资源
    最近更新 更多