Start · Sprachen · JavaScript · Referenz · Gamepad.buttons

Gamepad.buttons

Eigenschaft

Schreibgeschützte Eigenschaft, die ein Array von <code>GamepadButton</code>-Objekten liefert, die die Tasten des Controllers mit Druckzustand und analogem Wert beschreiben.

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

Signatur

Gamepad.buttons

Beschreibung

Die Eigenschaft buttons eines Gamepad-Objekts enthält ein Array von GamepadButton-Objekten, eines für jede Taste des Geräts. Jedes Objekt hat drei Eigenschaften: pressed (boolean, ob die Taste gedrückt ist), touched (boolean, ob sie berührt wird, sofern die Hardware das erkennt) und value (Zahl zwischen 0.0 und 1.0, bei analogen Tasten wie Schultertasten/Triggern ein Zwischenwert).

Wenn Gamepad.mapping den Wert "standard" hat, folgen die Indizes dem Standard-Gamepad-Layout der W3C-Spezifikation: 0 = unterer Aktionsknopf (A / Kreuz), 1 = rechter (B / Kreis), 2 = linker (X / Quadrat), 3 = oberer (Y / Dreieck), 4/5 = vordere Schultertasten, 6/7 = Trigger (analog), 8 = Select/Back, 9 = Start, 10/11 = Stick-Klicks, 12–15 = Steuerkreuz (oben, unten, links, rechts), 16 = Home/Guide-Taste.

Die Gamepad API ist abfragebasiert (Polling): Es gibt keine Ereignisse für einzelne Tastendrücke. Man liest die Tastenzustände typischerweise in jedem Frame innerhalb einer requestAnimationFrame-Schleife über navigator.getGamepads() aus und vergleicht sie mit dem vorherigen Zustand, um „gerade gedrückt“ bzw. „gerade losgelassen“ zu erkennen.

Rückgabewert

Typ
ReadonlyArray<GamepadButton>
Beschreibung
Ein schreibgeschütztes Array von GamepadButton-Objekten mit den Eigenschaften pressed, touched und value. Die Länge hängt vom Gerät und vom Mapping ab (beim Standard-Layout meist 17).

Beispiele

Tastenzustände in einer Spielschleife auslesen

const loop = () => {
  // Immer frisch abfragen – in Chrome sind Gamepad-Objekte Momentaufnahmen
  for (const pad of navigator.getGamepads()) {
    if (!pad) continue;
    pad.buttons.forEach((btn, i) => {
      if (btn.pressed) {
        console.log(`Pad ${pad.index}: Taste ${i} gedrückt (Wert ${btn.value.toFixed(2)})`);
      }
    });
  }
  requestAnimationFrame(loop);
};

window.addEventListener('gamepadconnected', (e) => {
  console.log(`Verbunden: ${e.gamepad.id} mit ${e.gamepad.buttons.length} Tasten`);
  requestAnimationFrame(loop);
});
Verbunden: Xbox Wireless Controller (STANDARD GAMEPAD) mit 17 Tasten Pad 0: Taste 0 gedrückt (Wert 1.00)

Analogen Trigger als Gaspedal nutzen

const RT = 7; // rechter Trigger im Standard-Layout
const LT = 6; // linker Trigger

const update = () => {
  const pad = navigator.getGamepads()[0];
  if (pad && pad.mapping === 'standard') {
    const gas = pad.buttons[RT].value;    // 0.0 – 1.0
    const bremse = pad.buttons[LT].value;
    const beschleunigung = gas - bremse;
    document.querySelector('#speed').textContent = beschleunigung.toFixed(2);
  }
  requestAnimationFrame(update);
};
requestAnimationFrame(update);

„Gerade gedrückt“ per Flankenerkennung

let previous = [];

const poll = () => {
  const pad = navigator.getGamepads()[0];
  if (pad) {
    const current = pad.buttons.map((b) => b.pressed);
    current.forEach((isDown, i) => {
      if (isDown && !previous[i]) console.log(`Taste ${i} neu gedrückt`);
      if (!isDown && previous[i]) console.log(`Taste ${i} losgelassen`);
    });
    previous = current;
  }
  requestAnimationFrame(poll);
};
requestAnimationFrame(poll);
Taste 9 neu gedrückt Taste 9 losgelassen

// Wichtig · Fallstricke

  • Momentaufnahme: In Chromium-Browsern ist das von navigator.getGamepads() gelieferte Objekt ein Schnappschuss – buttons aktualisiert sich nicht von selbst. Rufe getGamepads() daher in jedem Frame neu auf, statt das Objekt aus dem gamepadconnected-Ereignis zu speichern.
  • Mapping prüfen: Die Bedeutung der Indizes ist nur bei mapping === "standard" garantiert. Bei leerem Mapping ("") sind Reihenfolge und Anzahl herstellerabhängig – biete dann eine Tastenbelegung durch den Benutzer an.
  • Keine Tasten-Events: Es gibt keine standardisierten buttondown-Ereignisse; Zustandsänderungen müssen per Polling erkannt werden.
  • Nutzeraktivierung: Aus Datenschutzgründen (Fingerprinting) werden Gamepads erst sichtbar, nachdem der Benutzer eine Taste gedrückt hat, während die Seite fokussiert ist. Vorher liefert getGamepads() nur null-Einträge.
  • Sicherer Kontext: Neuere Browser stellen die API nur über HTTPS bereit; zudem kann sie per Permissions-Policy gamepad in iframes gesperrt sein.
  • touched wird nicht von jeder Hardware unterstützt und entspricht dann meist pressed. Analoge Werte können leicht rauschen – setze bei Bedarf einen Schwellwert.