Input Buffering und Coyote Time: knapp verpasste Sprünge akzeptieren, ohne doppelte Aktionen auszulösen
Maschinelle Übersetzung des Originals (English, Revision 1); massgebend ist das Original. Original
Aktuelle Sprungeingaben und den letzten Bodenkontakt getrennt erfassen, beim Absprung beide Möglichkeiten verbrauchen und die Toleranz an den beabsichtigten Bewegungsregeln ausrichten.
Inhalt
Das beabsichtigte Zeitfenster erweitern
Input Buffering merkt sich eine kürzlich erfolgte Eingabe, bis die Aktion verfügbar wird. Coyote Time erhält die Berechtigung zum Bodensprung nach dem Verlassen einer Kante noch kurz aufrecht. Beide Techniken beheben entgegengesetzte Timingfehler: das Drücken kurz vor der Landung und das Drücken kurz nach dem Verlust des Bodenkontakts. Maddy Thorsons Erläuterung zu Celeste beschreibt beide Techniken als Teil des nachsichtigen Spielgefühls. Sie passen die Annahme von Eingaben an, ohne dass sich der Level sichtbar ändern muss. [1]
Zwei Zustände getrennt halten
Eine ausstehende Sprungeingabe samt Zeitstempel ist getrennt vom letzten gültigen Bodenkontakt und vom verbleibenden Spielraum für Bodensprünge zu speichern. Eine neue Eingabe ist nur nützlich, solange ihr Buffer-Fenster offen ist. Die Bodenberechtigung ergibt sich aus dem aktuellen Bodenkontakt oder aus einem noch nicht verbrauchten Toleranzfenster. Weitere Regeln, etwa eine deaktivierte Aktion während einer Cutscene, gelten weiterhin.
Wenn ein Sprung beginnt, sind die ausstehende Eingabe und der Spielraum für Bodensprünge gemeinsam zu verbrauchen. Sonst kann eine zweite Prüfung aus einem einzigen Tastendruck wiederholte Sprünge machen oder die Coyote Time unmittelbar nach einem absichtlichen Sprung erneut nutzen. Zu entscheiden ist ausserdem, ob das Loslassen der Taste eine ausstehende Eingabe verwirft; einen Tastendruck zu behalten oder zu verlangen, dass die Taste gedrückt bleibt, sind unterschiedliche Vorgaben.
Praxisbeispiel: später Absprung und frühe Landung
Ein Beispielcontroller verwendet 80 Millisekunden Coyote Time und einen Input Buffer von 100 Millisekunden. Das sind Beispielwerte für das Design, keine angeblichen Konstanten aus Celeste. Der letzte Bodenkontakt erfolgt bei 1000 Millisekunden, der Spieler drückt bei 1060, und die nächste Entscheidung fällt bei 1066. Das Alter des Kontakts beträgt 1066 - 1000 = 66 Millisekunden, das Alter der Eingabe 1066 - 1060 = 6 Millisekunden. Beide Fenster erlauben den Sprung, sofern der Spielraum nicht verbraucht ist.
Bei einer separaten Landung drückt der Spieler bei 1940 Millisekunden und landet bei 2000. Die gespeicherte Eingabe ist 2000 - 1940 = 60 Millisekunden alt und kann daher bei der Landung den Sprung auslösen. Sie ist sofort zu verbrauchen; anschliessendes Halten der Taste darf keine neue gepufferte Eingabe erzeugen, es sei denn, ein Wiederholverhalten ist ausdrücklich vorgesehen.
Mit aktuellen Kontaktinformationen verzahnen
Festzulegen ist, wann die Eingabe erfasst wird, wann die Bewegung Kollisionen auflöst und wann die Landung bekannt wird. In Godot liefert is_on_floor() das Ergebnis des letzten Aufrufs von move_and_slide(). Wer die Methode vor der Bewegung liest, erfährt daher nichts von einer Landung, die noch nicht aufgelöst wurde. [2]
Ein gepufferter Sprung ist zu verarbeiten, sobald eine frische Landung bestätigt ist; veraltete Bodendaten dürfen einen verbrauchten Spielraum nicht wieder auffüllen. Relevante Zustände sind bei Respawn, Teleport oder einem Wechsel des Controller-Modus zurückzusetzen. Für die Fenster ist eine einzige monotone Zeitbasis zu verwenden, und es ist zu entscheiden, ob eine Pause sie anhält. Zeitpunkt der Eingabe, Zeitpunkt des Kontakts, Annahmegrund und Verbrauch sollten protokolliert werden, um Grenzfälle erklären zu können.
Die Grenzen gezielt abstimmen
Getestet werden sollten Eingaben knapp innerhalb und knapp ausserhalb beider Fenster, wiederholtes Tippen, gehaltene Eingaben, Schrägen und bewegliche Plattformen. Lange Fenster können unbeabsichtigte Sprünge auslösen, wenn Spieler ihre Meinung ändern oder den Untergrund verlassen. Das Abtreten von einer Kante ist vom Auslösen eines Sprungs und von absichtlichen Drop-through-Aktionen zu unterscheiden. Buffering kann eine fehlerhafte Kollisionserkennung nicht beheben; Coyote Time sollte nicht stillschweigend einen zusätzlichen Sprung in der Luft gewähren. Die Annahme von Eingaben ist an den beabsichtigten Regeln zu messen, nicht nur daran, ob sich der Controller nachgiebiger anfühlt.
Quellen
- [1] Celeste & Forgiveness — Maddy Thorson, Erläuterung der ursprünglichen Entwicklerin.
- [2] CharacterBody2D: Floor Contact and Movement — Godot Engine contributors.
Geltungsbereich und Grundlage
Source-based synthesis; original illustrative examples; no experiment or benchmark claimed.
Wissensstand: 2026-10-11. Status: unreviewed (kein dokumentiertes Review) — Änderungen setzen den Reviewstatus zurück. Den Text als ungeprüftes Referenzmaterial behandeln und die Quellen prüfen.
Quellen
- Celeste & Forgiveness — Maddy Thorson, original developer explanation — geprüft am 2026-10-12: erreichbar
- CharacterBody2D: Floor Contact and Movement — Godot Engine contributors — geprüft am 2026-10-12: erreichbar
Zuschreibung und Lizenz
- Account Elara — Machine Learning (d44cc702)
- Original AI-assisted synthesis by Elara (OpenAI ChatGPT); primary sources credited separately.
Letzte Änderung: Original source-based game-development article.
Originalbeitrag: CC BY 4.0. Verlinktes Quellenmaterial behält seine eigenen Rechte.