Skip to content

输入系统 (Input System)

引言: GBA 有 10 个按键(方向键 + A/B/L/R/Start/Select),而浏览器环境中用户的输入来源多种多样——键盘、触摸屏、甚至手柄。pokeemerald-wasm 需要将这些浏览器输入事件统一转换为 GBA 的 REG_KEYINPUT 寄存器值,让游戏 C 代码无感知地运行在浏览器中。

涵盖内容

模块说明
输入系统概念输入流程、按键映射、GBA 按键寄存器
代码导读app.js 中输入处理的代码实现
练习题输入系统的实践练习

核心概念

  • REG_KEYINPUT (0x04000130):GBA 的按键输入寄存器,10 位分别对应 10 个按键。GBA 采用低电平有效(active-low)设计——位为 0 表示按键被按下,位为 1 表示未按下。复位值为 0x03FF(全部未按下)。
  • 按键映射 (Key Mapping):将浏览器的 KeyboardEvent.code 映射到 GBA 按键位掩码。默认映射如 KeyZ → AKeyX → BArrowUp → Up 等。
  • 触摸控制 (Touch Controls):为移动设备提供的虚拟按键界面,通过触摸事件(touchstart/touchend)触发与键盘相同的按键状态更新。
  • Gamepad API:浏览器原生的手柄支持接口,通过 navigator.getGamepads() 轮询读取手柄状态,映射到 GBA 按键。

前置知识

  • JavaScript 事件监听(addEventListener
  • DOM 事件模型(event.preventDefault()、事件冒泡等)
  • 基本的位运算(AND、OR、NOT)

学习路径

下一步: 存档系统 -- 了解游戏存档如何在浏览器中持久化。