按含义和布局选择按键
如果操作应对应用户键盘布局产生的字符,请使用 KeyboardEvent.key;如果更重要的是按键的物理位置,请使用 KeyboardEvent.code。不同键盘布局会影响两者的区别。提供统一的按键映射并写入说明,不要假设所有人都使用 WASD。
文本框或可编辑控件获得焦点时,不要拦截按键。只有当游戏区域确实处理该按键时,才阻止浏览器默认行为,例如页面滚动。这样,玩家进入交互区域之前,游戏就不会吞掉普通输入或干扰浏览器导航。
跟踪按住状态并处理按键释放
对于连续移动,在收到 keydown 时设置按键的保持状态,在收到 keyup 时清除。按键按住期间,浏览器可能重复触发 keydown;因此,跳跃等一次性动作应忽略重复事件,除非设计本身需要重复触发。游戏失去焦点或窗口失焦时,清除所有保持状态,因为焦点转移后 keyup 可能不会再送达游戏。
测试同时按下两个键、长按、快速点按,以及游戏失去焦点后重新获得焦点的情况。对于一次性动作,除非设计需要重复触发,否则应忽略重复的 keydown。MDN 介绍了 KeyboardEvent.key、KeyboardEvent.code 和事件类型;请选择与按键映射相符的属性。
关于浏览器游戏的键盘控制的常见问题
游戏控制应该使用 KeyboardEvent.key 还是 KeyboardEvent.code?
如果操作应由字符值或键盘布局决定,请用 KeyboardEvent.key。如果操作取决于按键的物理位置,请用 KeyboardEvent.code。明确说明采用哪种方式,并测试其他键盘布局。
页面失去焦点时,为什么要清除保持按下的按键?
焦点改变后,浏览器可能不会再向游戏发送释放事件 keyup。清除输入状态可以防止玩家返回时游戏仍认为按键处于按下状态。
延伸阅读
发现信息过时了? 报告需要更正的内容