Start · Sprachen · JavaScript · Referenz · GamepadButton

GamepadButton

Schnittstelle

Beschreibt eine einzelne Taste eines Gamepads mit ihrem aktuellen Zustand: gedrückt, berührt und analoger Druckwert zwischen 0 und 1.

seit JavaScript Baseline: alle modernen Browser (Gamepad API) Kategorie: webapi

Signatur

interface GamepadButton

Beschreibung

Die Schnittstelle GamepadButton steht für eine einzelne Taste eines Gamepads oder eines anderen Controllers. Du bekommst die Instanzen über das Array Gamepad.buttons, das ein Gamepad-Objekt aus navigator.getGamepads() oder dem Event gamepadconnected liefert. Selbst erzeugen kannst du sie nicht, es gibt keinen öffentlichen Konstruktor.

Ein GamepadButton hat drei schreibgeschützte Eigenschaften:

  • pressed (boolean): true, wenn die Taste gerade gedrückt ist.
  • touched (boolean): true, wenn die Taste berührt wird. Das funktioniert nur, wenn die Hardware Berührungen erkennt. Sonst entspricht der Wert pressed.
  • value (number): Analoger Wert zwischen 0.0 (nicht gedrückt) und 1.0 (voll durchgedrückt). Er ist vor allem bei Schultertasten und Triggern nützlich. Einfache Tasten liefern nur 0 oder 1.

Die Gamepad-API arbeitet mit Abfragen (Polling), nicht mit Ereignissen: Für Tastendrücke gibt es kein Event. Deshalb fragst du den Zustand typischerweise in jedem Frame innerhalb einer requestAnimationFrame-Schleife ab. Wenn der Controller das „Standard“-Layout meldet (gamepad.mapping === "standard"), ist die Belegung der Indizes festgelegt, zum Beispiel 0 = untere Aktionstaste (A/Kreuz), 6/7 = linker/rechter Trigger, 12–15 = Steuerkreuz.

Rückgabewert

Typ
GamepadButton
Beschreibung
Wird nicht direkt erzeugt, sondern als Element von Gamepad.buttons bereitgestellt. Enthält pressed, touched und value.

Beispiele

Tastenzustand bei Verbindung auslesen

window.addEventListener('gamepadconnected', (event) => {
  const { gamepad } = event;
  console.log(`Verbunden: ${gamepad.id} (${gamepad.buttons.length} Tasten)`);

  gamepad.buttons.forEach((button, index) => {
    console.log(index, button.pressed, button.touched, button.value);
  });
});
Verbunden: Xbox Wireless Controller (STANDARD GAMEPAD) (17 Tasten) 0 false false 0 1 false false 0 ...

Game-Loop: Sprung-Taste per Flankenerkennung

let previouslyPressed = false;

const loop = () => {
  const [gamepad] = navigator.getGamepads();
  if (gamepad) {
    const jumpButton = gamepad.buttons[0]; // A / Kreuz im Standard-Layout
    // Nur beim Übergang von „losgelassen“ zu „gedrückt“ reagieren
    if (jumpButton.pressed && !previouslyPressed) {
      console.log('Sprung!');
    }
    previouslyPressed = jumpButton.pressed;
  }
  requestAnimationFrame(loop);
};

requestAnimationFrame(loop);
Sprung!

Analogen Trigger als Gaspedal nutzen

const DEADZONE = 0.05;

const readThrottle = () => {
  const gamepad = navigator.getGamepads().find((gp) => gp && gp.mapping === 'standard');
  if (!gamepad) return 0;

  const rightTrigger = gamepad.buttons[7];
  // Kleine Werte ignorieren (Sensorrauschen)
  return rightTrigger.value < DEADZONE ? 0 : rightTrigger.value;
};

const update = () => {
  const throttle = readThrottle();
  document.title = `Gas: ${Math.round(throttle * 100)} %`;
  requestAnimationFrame(update);
};

requestAnimationFrame(update);
Gas: 73 %

// Wichtig · Fallstricke

  • Keine Ereignisse für Tasten: Einen buttondown-Event gibt es nicht. Den Zustand musst du regelmäßig abfragen, etwa mit requestAnimationFrame. Wenn du einzelne Tastendrücke erkennen willst, vergleiche den aktuellen mit dem vorherigen Zustand.
  • Momentaufnahmen: In Chromium-Browsern sind die Gamepad- und GamepadButton-Objekte statische Momentaufnahmen. Rufe deshalb in jedem Frame erneut navigator.getGamepads() auf, statt dir Referenzen zu merken.
  • Belegung: Die Indizes sind nur bei mapping === "standard" garantiert. Bei anderen Controllern hängen sie vom Gerät und vom Browser ab.
  • touched wird nur von wenigen Geräten wirklich unterstützt. Bei den meisten entspricht es pressed.
  • Sicherheit/Kompatibilität: Die Gamepad-API ist nur in sicheren Kontexten (HTTPS) verfügbar und kann per Permissions Policy (gamepad) eingeschränkt werden. Gamepads werden erst sichtbar, nachdem der Nutzer eine Taste gedrückt hat. Das schützt vor Fingerprinting. Alle modernen Browser unterstützen die API.
  • Analoge Werte schwanken leicht. Plane eine Totzone (Deadzone) ein.