Start · Sprachen · JavaScript · Referenz · GamepadButton.pressed

GamepadButton.pressed

Eigenschaft

Schreibgeschützter <code>boolean</code>, der angibt, ob eine Taste des Gamepads im Moment gedrückt ist (<code>true</code>) oder nicht (<code>false</code>).

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

Signatur

GamepadButton.pressed

Beschreibung

Die Eigenschaft pressed eines GamepadButton-Objekts zeigt an, ob die Taste gerade gedrückt ist. Die Tasten eines Controllers bekommt man über das Array gamepad.buttons, das man wiederum über navigator.getGamepads() erhält.

Bei digitalen Tasten (A/B/X/Y, Schultertasten, Steuerkreuz) entspricht pressed einfach dem Zustand der Taste. Bei analogen Tasten wie den Triggern (Index 6 und 7 im Standard-Mapping) gibt es zusätzlich GamepadButton.value mit einem Wert zwischen 0.0 und 1.0. Ab welcher Schwelle pressed auf true springt, hängt vom Browser bzw. Gerät ab.

Die Gamepad API arbeitet mit Polling: Es gibt kein Ereignis für einzelne Tastendrücke. Man fragt den Zustand deshalb in jedem Frame ab, typischerweise in einer Schleife mit requestAnimationFrame(). Wenn man den Zustand des vorherigen Frames speichert, kann man Flanken erkennen, also den Moment, in dem eine Taste gerade gedrückt oder gerade losgelassen wird.

Rückgabewert

Typ
boolean
Beschreibung
true, wenn die Taste gerade gedrückt ist, sonst false. Die Eigenschaft ist schreibgeschützt.

Beispiele

Zustand der A-Taste abfragen

window.addEventListener('gamepadconnected', (event) => {
  const pad = navigator.getGamepads()[event.gamepad.index];
  // Index 0 = untere Aktionstaste (A bzw. Kreuz) im Standard-Mapping
  console.log('A gedrückt:', pad.buttons[0].pressed);
});
A gedrückt: false

Spielschleife mit Erkennung von Drücken und Loslassen

let previous = [];

const loop = () => {
  // Zustand jedes Frame neu abfragen, da die Objekte Momentaufnahmen sein können
  const pad = navigator.getGamepads().find(Boolean);
  if (pad) {
    pad.buttons.forEach((button, i) => {
      const wasPressed = previous[i] ?? false;
      if (button.pressed && !wasPressed) console.log(`Taste ${i} gedrückt`);
      if (!button.pressed && wasPressed) console.log(`Taste ${i} losgelassen`);
    });
    previous = pad.buttons.map((b) => b.pressed);
  }
  requestAnimationFrame(loop);
};

requestAnimationFrame(loop);
Taste 0 gedrückt Taste 0 losgelassen

Analogen Trigger mit eigener Schwelle auswerten

const isFiring = (pad) => {
  const trigger = pad.buttons[7]; // rechter Trigger (RT/R2)
  // pressed hängt vom Browser ab; mit value lässt sich die Schwelle selbst festlegen
  return trigger.pressed || trigger.value > 0.3;
};

const pad = navigator.getGamepads().find(Boolean);
if (pad) console.log('Feuern:', isFiring(pad));
Feuern: true

// Wichtig · Fallstricke

  • Momentaufnahme: In Chrome sind die Gamepad-Objekte Schnappschüsse. Man muss navigator.getGamepads() deshalb in jedem Frame neu aufrufen. Wer eine alte Referenz aufbewahrt, sieht einen veralteten pressed-Wert.
  • Kein Tasten-Ereignis: Einen Tastendruck erkennt man nur durch Polling. gamepadconnected und gamepaddisconnected melden lediglich, ob ein Controller verbunden oder getrennt wurde.
  • Aktivierung durch den Nutzer: Viele Browser melden einen Controller erst, wenn auf ihm eine Taste gedrückt wurde. Vorher liefert getGamepads() leere Einträge (null).
  • Mapping: Die Indizes sind nur dann verlässlich, wenn gamepad.mapping === 'standard' ist. Bei anderen Controllern kann die Belegung abweichen.
  • Sicherer Kontext: Neuere Browser stellen die Gamepad API nur über HTTPS bereit. Außerdem kann eine Permissions Policy (gamepad) den Zugriff in iframes sperren.
  • Soll eine Taste nur berührt, aber nicht gedrückt werden (bei manchen Controllern möglich), ist GamepadButton.touched die passende Eigenschaft.