/
kiraru
/
DeadBlocks
Обзор
Документация
Войти
/
kiraru
/
DeadBlocks
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
controllers/input_handler.py
121 строка
4 KB
kiraru
маленький фикс + коментарии
23 июн 2026, 09:51
23 июн 2026, 09:51
516b2d4
Код
Авторство
О чём код?
# input_handler.py — обработка ввода с клавиатуры import pygame from dataclasses import dataclass, field @dataclass class InputState: """ снимок состояния ввода за один кадр. Controller читает этот объект и применяет к игроку/GameState. """ # движение move_left: bool = False move_right: bool = False run: bool = False # действия (True только в момент нажатия) jump: bool = False attack: bool = False interact: bool = False # открыть сундук / войти в дверь # меню pause: bool = False confirm: bool = False cancel: bool = False # выбор артефакта artifact_choice: int = 0 # 0 = не нажато, 1–7 = номер # навигация в меню menu_up: bool = False menu_down: bool = False # выход из игры quit: bool = False class InputHandler: """ считывает pygame-события и текущее состояние клавиатуры, заполняет InputState. """ # бинд клавиш (легко переконфигурировать) KEY_LEFT = pygame.K_LEFT, pygame.K_a KEY_RIGHT = pygame.K_RIGHT, pygame.K_d KEY_RUN = pygame.K_LSHIFT, pygame.K_RSHIFT KEY_JUMP = pygame.K_SPACE, pygame.K_w, pygame.K_UP KEY_ATTACK = pygame.K_z, pygame.K_j, pygame.K_x KEY_INTERACT= pygame.K_e, pygame.K_RETURN KEY_PAUSE = pygame.K_ESCAPE, pygame.K_p KEY_CONFIRM = pygame.K_RETURN, pygame.K_z KEY_CANCEL = pygame.K_ESCAPE KEY_MENU_UP = pygame.K_UP, pygame.K_w KEY_MENU_DOWN = pygame.K_DOWN, pygame.K_s # цифры для выбора артефакта ARTIFACT_KEYS = { pygame.K_1: 1, pygame.K_2: 2, pygame.K_3: 3, pygame.K_4: 4, pygame.K_5: 5, pygame.K_6: 6, pygame.K_7: 7, } def __init__(self): self._state = InputState() # ставятся в True ровно на один кадр self._oneshot_keys: set[int] = set() def process_events(self, events: list[pygame.event.Event]) -> InputState: """ вызывать каждый кадр перед обновлением GameState. Принимает список событий из pygame.event.get(). Возвращает заполненный InputState. """ # сброс one-shot полей self._state.jump = False self._state.attack = False self._state.interact = False self._state.pause = False self._state.confirm = False self._state.cancel = False self._state.artifact_choice = 0 self._state.menu_up = False self._state.menu_down = False self._state.quit = False for event in events: if event.type == pygame.QUIT: self._state.quit = True elif event.type == pygame.KEYDOWN: self._handle_keydown(event.key) # удерживаемые клавиши pressed = pygame.key.get_pressed() self._state.move_left = any(pressed[k] for k in self.KEY_LEFT) self._state.move_right = any(pressed[k] for k in self.KEY_RIGHT) self._state.run = any(pressed[k] for k in self.KEY_RUN) return self._state def _handle_keydown(self, key: int) -> None: if key in {k for k in self.KEY_JUMP}: self._state.jump = True if key in {k for k in self.KEY_ATTACK}: self._state.attack = True if key in {k for k in self.KEY_INTERACT}: self._state.interact = True if key in {k for k in self.KEY_PAUSE}: self._state.pause = True if key in {k for k in self.KEY_CONFIRM}: self._state.confirm = True if key == pygame.K_ESCAPE: self._state.cancel = True if key in {k for k in self.KEY_MENU_UP}: self._state.menu_up = True if key in {k for k in self.KEY_MENU_DOWN}: self._state.menu_down = True if key in self.ARTIFACT_KEYS: self._state.artifact_choice = self.ARTIFACT_KEYS[key]