297. Обновление геймпада по событиям клавиатуры в main
Использование событий клавиш pygame для обновления controller_1 в main_only_background.py.
Урок 297 из 356 · tests/chapter_08_manual_main/test_297_main_keyboard_event_controller_update.py
Файл для обновления
main_only_background.pyЗачем нужен этот шаг
Ядро эмулятора уже предоставляет порт геймпада 1 через $4016 в CpuBus. main_only_background.py должен преобразовывать события клавиатуры pygame в обновления чистого объекта Controller:
pygame KEYDOWN Z -> cpu_bus.controller_1.a = True
pygame KEYUP Z -> cpu_bus.controller_1.a = FalseПример предполагаемой реализации
from emulator.input.controller import Controller
...
def handle_key_event(controller: Controller, key: int, pressed: bool) -> None:
if key == KEYS["a"]:
controller.a = pressed
elif key == KEYS["b"]:
controller.b = pressed
elif key == KEYS["select"]:
controller.select = pressed
elif key == KEYS["start"]:
controller.start = pressed
elif key == KEYS["up"]:
controller.up = pressed
elif key == KEYS["down"]:
controller.down = pressed
elif key == KEYS["left"]:
controller.left = pressed
elif key == KEYS["right"]:
controller.right = pressed
...
# Inside pygame event loop:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.KEYDOWN:
handle_key_event(cpu_bus.controller_1, event.key, True)
elif event.type == pygame.KEYUP:
handle_key_event(cpu_bus.controller_1, event.key, False)Важная граница
main_only_background.py может импортировать pygame и обрабатывать события клавиатуры, поскольку это ручной визуальный запускатель. emulator/input/controller.py должен оставаться свободным от pygame.
Вне рамок этого шага
- поддержка джойстика/геймпада pygame
- настраиваемые привязки клавиш
- порт геймпада 2
- вызов main() из pytest
Запустить этот урок
uv run pytest tests/chapter_08_manual_main/test_297_main_keyboard_event_controller_update.py -v