Appearance
输入系统 (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 → A、KeyX → B、ArrowUp → Up等。 - 触摸控制 (Touch Controls):为移动设备提供的虚拟按键界面,通过触摸事件(
touchstart/touchend)触发与键盘相同的按键状态更新。 - Gamepad API:浏览器原生的手柄支持接口,通过
navigator.getGamepads()轮询读取手柄状态,映射到 GBA 按键。
前置知识
- JavaScript 事件监听(
addEventListener) - DOM 事件模型(
event.preventDefault()、事件冒泡等) - 基本的位运算(AND、OR、NOT)
学习路径
下一步: 存档系统 -- 了解游戏存档如何在浏览器中持久化。