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