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.pyPor 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 = FalseEjemplo 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