javascript - 什么是游戏手柄 api 中的“onkeyup”?
问题描述
我正在尝试使用游戏手柄 api。当一个按钮被按下时,它一直被“触发”,直到按钮被释放。这对于在游戏中跑步或射击之类的东西来说很酷,但是当我想在菜单中导航时(例如,向下移动 16 个菜单项而不是一个)时会出现问题。
在普通键盘上,我会使用 onkeyup/onkeydown 来查看按钮按下何时结束。但是在游戏手柄 api 上,我没有找到类似的东西。
JS:
var gamepadPressCounter = 0;
function update() {
const gamepads = navigator.getGamepads();
if (gamepads[0].buttons[0].pressed === true) {
gamepadPressCounter++;
}
window.requestAnimationFrame(update);
}
那么,您是否知道一种让 gamepadPressCounter 每次按下而不是无限次的方法?
解决方案
您必须检查它是否是pressed
您上次检查的时间。它不会触发事件,它是有状态的。您正在直接检查按钮是否被按下。
创建一个变量来存储您上次检查按钮的状态并比较它以查看它是否与上次相比发生了变化。
const anyButtonPressedChangeListener = {
listeners: [],
addListener(cb) {
this.listeners.push(cb);
},
signal(state) {
for (const cb of this.listeners) {
cb(state);
}
}
}
let buttonstate = false;
const loop = () => {
const gamepads = navigator.getGamepads();
const gamepad = gamepads[0];
if (gamepad) {
const statenow = gamepad.buttons.some(btn => btn.pressed);
if (buttonstate !== statenow) {
buttonstate = statenow;
anyButtonPressedChangeListener.signal(statenow);
}
} else {
console.log("Not connected");
}
setTimeout(loop, 1000);
}
anyButtonPressedChangeListener.addListener((buttonState) => {
console.log(`Any button pressed changed to ${buttonState}`);
});
loop();
推荐阅读
- python - 使用 python 创建解释器并希望从文件而不是 shell 命令中读取
- arrays - 谁记得根据有效位数将 4 字节整数打包为 1 到 4 字节数组的算法?
- c - 实现计数排序每次都会使我的程序崩溃,无法发现 malloc/free 错误
- python-3.x - Python3 无法解码 POST 请求结果
- html - 我需要帮助将文本置于 CSS 网格的中心
- python - Scrapy 抓取标签对象和聚合值
- firebase-realtime-database - 我想通过使用查询从这样的 firebase 数据库中查找数据。如果输入与存储的数据匹配,则显示手机号码
- angular - Angular 7/json 服务器:发布请求只接受 id
- java - 使用选项创建查询
作为参数 - linux - 在 Unix 中删除行之间的空格