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