31 lines
1.1 KiB
JavaScript
31 lines
1.1 KiB
JavaScript
/**
|
||
* Hilfen für Phaser-Tastaturereignisse.
|
||
* @module systems/keyboard
|
||
*/
|
||
|
||
/**
|
||
* Lässt jedes KeyboardEvent nur einmal zum Handler durch.
|
||
*
|
||
* Warum: Phaser 3.90 verarbeitet bei jedem neuen DOM-Tastaturereignis die gesamte
|
||
* Warteschlange des aktuellen Frames erneut und leert sie erst am Frame-Ende. Treffen
|
||
* drei oder mehr Tastenereignisse innerhalb eines Frames ein (schnelles Tippen, oder
|
||
* die automatische Wiederholung der gehaltenen Q-Taste während einer Befehlseingabe),
|
||
* meldet Phaser dasselbe `keydown` mehrfach. Für Orbital-Befehle hieße das: Aus
|
||
* „↓“ wird „↓ ↓“ und die Eingabe schlägt fehl. Das Ereignisobjekt selbst ist dabei
|
||
* identisch – daran erkennen wir Wiederholungen zuverlässig.
|
||
*
|
||
* @template {KeyboardEvent} E
|
||
* @param {(event: E) => void} handler
|
||
* @returns {(event: E) => void}
|
||
*/
|
||
export function oncePerEvent(handler) {
|
||
const seen = new WeakSet();
|
||
return (event) => {
|
||
if (event && typeof event === 'object') {
|
||
if (seen.has(event)) return;
|
||
seen.add(event);
|
||
}
|
||
handler(event);
|
||
};
|
||
}
|