游戏手柄 api 中的 "onkeyup" 是什么?
What is "onkeyup" in gamepad api?
我正在尝试使用游戏手柄 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();
我正在尝试使用游戏手柄 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();