Я работаю над созданием версии игры Snake и пытаюсь предотвратить движение по диагонали. Есть ли способ предотвратить несколько 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
2
Shyber 16 Фев 2020 в 23:09

2 ответа

Лучший ответ

Вы должны убедиться, что заданы только self.snake.move_right, self.snake.move_left, self.snake.move_up или self.snake.move_down, но никогда не должно быть 2 или более состояний одновременно. например:

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_right, self.snake.move_left, self.snake.move_up или self.snake.move_down.
Используйте одно состояние, которое указывает направление змеи. Добавьте состояние move_dir и назначьте {{X5} }. Значение move_dir становится «правым», «левым», «вверх» и соответственно «вниз» для ВПРАВО , ВЛЕВО , UP или ВНИЗ . например:

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]
3
Rabbid76 16 Фев 2020 в 20:45

Вы можете вместо этого преобразовать переменные направления движения в одно дельта-значение:

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
1
AKX 16 Фев 2020 в 20:25