297. Main 键盘事件控制器更新

使用 pygame 按键事件更新 main_only_background.py 中的 controller_1。

297 / 356 · tests/chapter_08_manual_main/test_297_main_keyboard_event_controller_update.py

需要更新的文件

main_only_background.py

为什么需要这一步

模拟器核心已经通过 CpuBus $4016 暴露了控制器端口 1。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
  • 从 pytest 调用 main()

运行本课

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