【问题标题】:I want to prevent diagonal movement in Pygame我想防止 Pygame 中的对角线运动
【发布时间】:2020-02-16 20:09:21
【问题描述】:

我正在制作游戏蛇的版本,并试图防止对角线移动。有没有办法防止多个KEYDOWN 事件

这是检测KEYDOWN 事件的辅助函数。

def _keydown_events(self, event):
    '''Responds to pressing keystrokes'''
    if event.type == pg.KEYDOWN:
        if event.key == pg.K_q:
            pg.display.quit()
            running = False
            sys.exit()
        elif event.key == pg.K_RIGHT:
            self.snake.move_right = True
        elif event.key == pg.K_LEFT:
            self.snake.move_left = True
        elif event.key == pg.K_UP:
            self.snake.move_up = True 
        elif event.key == pg.K_DOWN:
            self.snake.move_down = True

【问题讨论】:

    标签: python python-3.x pygame


    【解决方案1】:

    您必须确保只设置了self.snake.move_rightself.snake.move_leftself.snake.move_upself.snake.move_down,但不能同时设置两个或多个状态。例如:

    def _keydown_events(self, event):
        '''Responds to pressing keystrokes'''
        if event.type == pg.KEYDOWN:
            if event.key == pg.K_q:
                pg.display.quit()
                running = False
                sys.exit()
            elif if event.key in [pg.K_RIGHT, pg.K_LEFT, pg.K_UP, pg.K_DOWN]:
                self.snake.move_right = False
                self.snake.move_left = False
                self.snake.move_up = False
                self.snake.move_down = False
                if event.key == pg.K_RIGHT:
                    self.snake.move_right = True
                elif event.key == pg.K_LEFT:
                    self.snake.move_left = True
                elif event.key == pg.K_UP:
                    self.snake.move_up = True
                elif event.key == pg.K_DOWN:
                    self.snake.move_down = True
    

    无论如何,我建议删除状态 self.snake.move_rightself.snake.move_leftself.snake.move_upself.snake.move_down
    使用单个状态来指示蛇的方向。添加状态move_dir 并分配pygame.key.name(event.key)。对于 RIGHTLEFTUP向下。例如:

    def _keydown_events(self, event):
        '''Responds to pressing keystrokes'''
        if event.type == pg.KEYDOWN:
            if event.key == pg.K_q:
                pg.display.quit()
                running = False
                sys.exit()
    
            elif if event.key in [pg.K_RIGHT, pg.K_LEFT, pg.K_UP, pg.K_DOWN]:
                # move_dir becomes "right", "left", "up" or "down"
                self.snake.move_dir = pygame.key.name(event.key)
    

    当然你可以直接声明移动向量:

    def _keydown_events(self, event):
        '''Responds to pressing keystrokes'''
        if event.type == pg.KEYDOWN:
            if event.key == pg.K_q:
                pg.display.quit()
                running = False
                sys.exit()
    
            elif if event.key in [pg.K_RIGHT, pg.K_LEFT, pg.K_UP, pg.K_DOWN]:
    
                move_dirs = {pg.K_RIGHT: (1, 0), pg.K_LEFT: (-1, 0), 
                             pg.K_UP: (0, -1), pg.K_DOWN: (0, 1)}
                self.snake.move_dir = move_dirs[event.key]
    

    【讨论】:

      【解决方案2】:

      您可能希望将运动方向变量转换为单个增量值:

      if event.key == pg.K_RIGHT:
          self.snake.move_dir = (+1, 0)
      elif event.key == pg.K_LEFT:
          self.snake.move_dir = (-1, 0)
      elif event.key == pg.K_UP:
          self.snake.move_dir = (0, -1)
      elif event.key == pg.K_DOWN:
          self.snake.move_dir = (0, +1)
      

      无论你将蛇移动到哪里,

      dx, dy = self.move_dir
      x += dx
      y += dy
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-26
        • 1970-01-01
        • 1970-01-01
        • 2019-11-20
        相关资源
        最近更新 更多