自从买了Switch手柄后,我就一直想尝试为自己写的小游戏添加手柄支持。今天终于熬过来了。这是注释;)navigator.getGamepads在HTML5中获取游戏手柄的API是navigator.getGamepads()。navigator.getGamepads返回一个可能为空的数组。标准规定,对于同一个游戏手柄,将返回相同的下标,不同的控制器不得使用其他控制器使用的下标——即使前者已经断开连接。如果未检测到游戏手柄,measured在Firefox中返回一个空数组,在Chrome、Safari中返回[null,null,null,null]。当浏览器检测到游戏手柄时,navigator.getGamepads将返回一个包含游戏手柄对象的数组,每个游戏手柄对象都是Gamepad类型。笔者的NSPro游戏手柄与Chrome和Safari浏览器存在兼容性问题(无法识别左摇杆),因此以下测试均基于Firefox(Edge也正常)。一位同事说他的PS4控制器没问题。Gamepad类Gamepad类包含了重要的属性,这里只介绍最重要的几个:id。包含控制器驱动程序名称信息的字符串。比如笔者的NSPro返回57e-2009-ProController,可以用来识别用户的句柄,提供默认的按键映射。连接的。指示此Gamepad对象表示的控制器是否仍处于连接状态。时间戳。句柄对象的最后更新时间。虽然作者没有移动手柄,但是数值还在增加(可能是因为摇杆的数值在轻微变化),用处不大。映射。指示浏览器是否可以识别控制器的布局。当前的浏览器只能识别类似于PS4手柄的标准布局。如果能识别则返回standard,否则返回空串(作者的NSPro无法识别)。轴。该值表示手柄操纵杆的轴(操纵杆有两个轴,X和Y)。它的所有值都在-1~1之间。HTML使用右下坐标系,因此正值表示右或上,负值表示左或下。标准规定同一个摇杆的X、Y方向值必须相邻,X先Y后Y。标准还建议如果同时有多个摇杆,主摇杆先排列。所以如果有左右摇杆,axes返回的数组值应该表示:[左摇杆的X轴偏置,左摇杆的Y轴偏置,右摇杆的X轴偏置,Y轴偏置右摇杆的]按钮。该值是GamepadButton对象的数组。该标准建议数组的顺序应按主键在前的顺序排列。我的NSPro手柄实测是[B,A,Y,X,L,R...],方向键在后四位。建议在实际应用中为用户提供专用的界面映射按钮。GamepadButton类的每个GamepadButton实例代表了控制器上的一个按钮(包括方向键),它包含三个属性(MDN上只写了两个,但按照标准实际上三个都返回):pressed。指示当前键是否被按下的布尔值。价值。表示按键的深度(全按或半按),取值在0到1之间。大部分按键不支持压感,会直接返回0或1touched。如果句柄支持触摸,这个值可以表示按钮被触摸但没有被按下的当前状态。如果不支持触摸,则此值与按下相同。连接事件浏览器提供了两个句柄相关的事件。游戏手柄已连接。当浏览器检测到控制器已连接时触发。回调函数的事件参数包含gamepad属性,用户获取新连接的手柄对象gampaddisconnected。当浏览器检测到控制器失去连接时触发。可以看出控制器没有类似键盘鼠标的keydown、keyup等事件。如果需要获取控制器的按键状态,需要在raf循环中使用navigator.getGamepads实时获取。最后作者在自己的贪吃蛇游戏中加入了控制蛇头方向的手柄摇杆:https://github.com/CarterLi/S...之前也写过俄罗斯方块,但是找不到代码/(ㄒoㄒ)/~~
