首页 > 解决方案 > 什么是游戏手柄 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 每次按下而不是无限次的方法?

标签: javascriptgamepad-api

解决方案


您必须检查它是否是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();


推荐阅读