fangka 2019-06-27
自从买了 Switch 手柄后一直想试试给自己写的小游戏增加手柄支持。今天终于抽出时间搞了一把。以下是笔记 ;)
HTML5 中获取游戏手柄的 API 是 navigator.getGamepads()。navigator.getGamepads
会返回一个可能包含 null
的数组。标准规定,对于同一个游戏手柄会在同一个下标中返回,不同的手柄必须不能使用其他手柄用过的下标——即便前者已经中断连接。如果没有检测到任何游戏手柄,实测在 Firefox 中会返回一个空数组,而在 Chrome、Safari 中会返回 [null, null, null, null]
。
当浏览器检测到手柄后,navigator.getGamepads
就会返回包含该手柄对象的数组,每一个手柄对象都是 Gamepad
类型
实测笔者的 NS Pro
手柄在 Chrome、Safari 浏览器上有兼容性问题(不能识别左摇杆),所以下面测试均以 Firefox 为准(Edge 也正常)。同事表示他的 PS4 手柄没有问题。
Gamepad 类包含重要的属性,这里只介绍最重要的几个:
NS Pro
返回的是 57e-2009-Pro Controller
,可以用此字符串识别用户的手柄提供默认的按键映射。Gamepad
对象所表示的手柄是否还保持连接。standard
,否则返回空字符串(笔者的 NS Pro
识别不了)。axes
返回的数组值应该表示:[左摇杆的X轴偏向, 左摇杆的Y轴偏向, 右摇杆的X轴偏向, 右摇杆的Y轴偏向]
GamepadButton
对象数组。标准建议数组的顺序应该按照主要按键优先排列。实测对于我的 NS Pro
手柄来说顺序是 [B, A, Y, X, L, R ...]
,而方向键排在最后四个。建议实际应用中给用户提供专门的界面映射按键。每一个 GamepadButton 实例表示手柄上的一个按键(包括方向键),它包含三个属性(MDN 上只写了两个,实际按照标准返回了全部三个):
pressed
一致。浏览器提供了两个手柄相关的事件。
可以看到手柄没有类似键盘鼠标那样的 keydown、keyup 等事件,如需获取手柄的按键状态,需要在 raf 循环中使用 navigator.getGamepads
实时获取。
笔者给自己的贪食蛇小游戏增加了手柄摇杆控制蛇头方向功能:https://github.com/CarterLi/S...
之前笔者还写过俄罗斯方块之类的,代码找不到了/(ㄒoㄒ)/~~