297. Actualización del mando mediante eventos de teclado en main

Usar eventos de teclas de pygame para actualizar controller_1 en main_only_background.py.

Lección 297 de 356 · tests/chapter_08_manual_main/test_297_main_keyboard_event_controller_update.py

Archivo a actualizar

main_only_background.py

Por qué existe este paso

El núcleo del emulador ya expone el puerto de mando 1 a través de CpuBus en $4016. main_only_background.py debe traducir los eventos de teclado de pygame en actualizaciones del objeto puro Controller:

pygame KEYDOWN Z -> cpu_bus.controller_1.a = True
pygame KEYUP Z   -> cpu_bus.controller_1.a = False

Ejemplo de implementación sugerido

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)

Límite importante

main_only_background.py puede importar pygame y manejar eventos de teclado porque es un ejecutor visual manual. emulator/input/controller.py debe permanecer libre de pygame.

Fuera de alcance

  • Soporte de joystick/mando de pygame
  • Asignaciones de teclas configurables
  • Puerto de mando 2
  • Llamar a main() desde pytest

Ejecutar esta lección

uv run pytest tests/chapter_08_manual_main/test_297_main_keyboard_event_controller_update.py -v