Countdown-HUD: Pause- und Fokus-Knopf sind 3,45 s lang sichtbar, fokussierbar und beschriftet – aber beide ohne jede Funktion #27
Labels
No labels
accessibility
bug
cleanup
consistency
crash
critical
game-feel
gameplay
high
input
level-generation
low
maintainability
medium
pause
physics
responsive
security
spec-gap
ui
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
gilli/pulse-sprint#27
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Komponente: GAME (
setState2873,pauseGame2940–2944,tryFocus3192–3201,updateCOUNTDOWN-Zweig 3233–3257,togglePause2953–2956,bindUI3562–3564),Markup 303–306, Tastatur (
INPUT→hooks.onPause/onFocus)Betroffene Version:
main@86a481d,index.html(3.684 Zeilen, MD5777d18c3edbb834aa41fccc7d10a7d18)Beschreibung
setStateschaltet das HUD für zwei Zustände sichtbar:Im HUD sitzen
#btnPause(aria-label="Spiel pausieren") und#btnFocus(
aria-label="Fokus-Zeitlupe aktivieren"). Beide Handler verlangen aberPLAYING:togglePause(2953) und der Tastatur-HookP/Escapelaufen überpauseGame/resumeGame—im
COUNTDOWNalso ebenfalls ins Leere. Ergebnis: 3,0 s Countdown + 0,45 s Nachlauf(
S.countdown = 3.0, Übergang beiS.countdown <= -0.45, Zeilen 2922 / 3251) lang zeigen zweibedienbar aussehende, mit
aria-labelversehene Knöpfe genau daneben zu liegen, was sie tun —nämlich nichts. Kein
disabled, keinaria-disabled, kein optischer Hinweis, kein Ton.Für Tastaturnutzer ist das schlimmer als nur „tut nichts“: Beide Knöpfe liegen in der
Tab-Reihenfolge,
Tab+Leertasteauf#btnPauselöst den Klick aus, der Klick tut nichts, undes gibt keinerlei Rückmeldung woran es liegt (Issue #20 hat die Leertaste erst bedienbar gemacht
— hier trifft sie auf einen Handler, der früh zurückkehrt).
Messprotokoll
Echtes Dokument über die von
tests/testpage.pygebaute Testseite (Bridge nur für denZugriff auf
S.state, Messung an echten Klicks/Tastendrücken), Viewport 1100×640:Der Fokus-Knopf ist im COUNTDOWN doppelt grundlos:
S.focusMetersteht zu dem Zeitpunkt auf0,25 (
startRun, Zeile 2920) —tryFocuswürde auch imPLAYINGablehnen, weil die Anzeige„Fokus 25 %“ heißt. Der Pause-Knopf ist der eigentliche Defekt: während des Countdowns gibt es
keinen Weg zurück ins Menü. Wer
Startenversehentlich ausgelöst hat (undLeertasteist seit#20 genau dafür die Hauptaktion im Menü — ein zu frühes Drücken auf dem Start-Knopf genügt) muss
3,45 s warten, danach erst pausieren und dann „Zum Menü“.
Ursache im Code
Der COUNTDOWN-Zustand wurde als „schon fast
PLAYING“ gebaut (HUD an, Welt steht, Figur läuftauf der Stelle, Zeile 3255) und die beiden Knopf-Handler fragen
S.statehart gegenPLAYINGab. Es gibt keine dritte Möglichkeit („Knopf ist sichtbar, aber außer Kraft“) und kein Feedback.
Folgeverhalten
R(Neu starten) ist ebenfalls gesperrt(
onRestart, Zeile 3660: nurPLAYING/PAUSED/GAME_OVER).Name/Role/Value-Problem (WCAG 4.1.2), nicht nur Kosmetik. Sehende Nutzer erkennen den
Unterschied zu einem funktionierenden Knopf nicht.
Nicht verletzt (bewusst abgegrenzt)
Overlay-Hauptaktion funktioniert, ohne Overlay gehören die Tasten dem Spiel.
visualTimesteht still, Audio friert ein — #7):Im PAUSED-Zweig bleibt
S.visualTimenachweislich konstant (gemessen über 400 ms).COUNTDOWN → PLAYINGbei-0,45).Lösungsvorschlag
Zwei saubere Varianten — die erste ist die mit dem geringsten Eingriff:
setStatezusätzlichel.btnPause.disabled = (next === "COUNTDOWN"); el.btnFocus.disabled = (next === "COUNTDOWN");(bei Bedarf nur für
btnPause), plus CSS-Regel für:disabledundaria-disabledautomatischüber das Attribut. Ein deaktivierter Knopf ist bedienbar verstanden; ein Follow-up-Knopf
„Zum Menü“ im Countdown erübrigt sich damit nicht, wäre aber die zweite Variante:
pauseGame()auch fürCOUNTDOWNerlauben (Pause merkt sichden Rückkehr-Zustand) oder direkt
Escape/„Zum Menü“ im Countdown auftoMenu()schalten.Das ist die funktionale Antwort auf „versehentlich gestartet“.
Welche auch immer: Der Zustand muss am Knopf ablesbar sein, nicht nur im Code.
Erwarteter Test
tests/browser_issue27.py— echtes Dokument, echter Klick/Tastendruck imCOUNTDOWN:(a)
#btnPauseund#btnFocussind entwederdisabled(dann: Klick ändert den Zustand nicht,disabled-Attribut und geänderte Erscheinung sind gesetzt), oder (b) der Klick wirkt(Zustand wechselt). Gemessen wird zusätzlich die Gegenseite: im
PLAYINGmuss#btnPauseweiterhin
PAUSEDergeben. Vorher rot: sichtbar + nicht disabled + kein Zustandswechsel.Dokumentiert in
issues/27-countdown-hud-knoepfe-sichtbar-ohne-funktion.md(Commit86a481d).