Leertaste auf einem fokussierten Button tut nichts: Menü, Pause, Game Over und die Einstellungen sind per Tastatur nur halb bedienbar #20
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#20
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?
Leertaste auf einem fokussierten Button tut nichts: Menü, Pause, Game Over und die Einstellungen sind per Tastatur nur halb bedienbar #20"
By gilli — Closed
accessibility
bug
input
medium
ui
3 comments
Behoben in
5c84877(Doku in38c101c)Geändert –
index.html, INPUT-Modul:NAV_KEYS,OVERLAY_IDSundINPUT.widgetOwns(target)– prüft, ob ein fokussiertesBedienelement (
button, input, select, textarea, a[href], [role="button"]) unter einemsichtbaren Overlay (
menu,pause,gameover,settings,help) steht.keydown-Listener: die Leertaste und die Pfeiltasten werden nicht mehr verhindert, wennwidgetOwns(ev.target)– in dem Fall wird die Taste außerdem komplett nicht alsSpielaktion umgesetzt (sonst läge beim „Fortsetzen“ per Leertaste ein Sprung im Puffer).
HUD-Knopf (
#btnPause,#btnFocus) den Fokus hält, sonst würde jeder Sprung pausieren.allen Aktionen, die Buchstabenkürzel (
P/R/M/F/W,Escape) laufen unabhängig vomFokusziel,
keyupebenfalls.Verifikation – neue Suite
tests/browser_issue20.py(60 Prüfungen, echtekeyboard-Eingaben, an der Messstelle kein einzigerPULSE.*-Aufruf):#btnStart→COUNTDOWN,#btnHelp→HELP,#btnSettings→SETTINGS,#btnResume→PLAYING,#btnRestart→COUNTDOWN,#btnPauseMenu/#btnGoMenu/#btnSettingsBack/#btnHelpBack→MENU; Enter als Kontrolle.checked, der Wert liegt inS.settingsundim
localStorage(pulseSprintSaveV1), kein Mitschleifen der Nachbarn, und nachreload()stehen die Werte aus dem Speicher wieder im Spiel.
ArrowDownauf dem fokussierten#btnHelpBackbleibt als Standardaktion erhalten und wird nicht zur Rolle umgebogen(
rollBuffer0, Zustand bleibtHELP), die Seite scrollt nicht.fokussierten HUD-Knopf weder per Klick noch über den Fokus aus;
ArrowDownrollt;Escapepausiert; Fortsetzen per Leertaste legt keinen Sprung in den Puffer.
Gegen
git show HEAD:index.htmlgemessen: 27 Prüfungen rot (MENUbleibtMENUin allendrei Menü-Fällen,
PAUSED/GAME_OVERebenso,checkedbleibt für alle vier Schaltertrue,ArrowDownprevented plusrollBuffer0,1,jumpBuffer0,12 beim Fortsetzen). Nach dem Fixgrün –
./tests/run-all.sh 1komplett: 12 Node-Suiten + Soak + 11 Browser-Suiten.Zwei Abweichungen vom Befund, beide messbar:
scrollTop-Prüfung ist in diesem Chromium nicht messbar: dieTastatur-Rollausführung findet dort gar nicht statt –
ArrowDown,PageDownundEndlassen auch ein nacktes Testdokument mit 3024 px Höhe bei
scrollTop0, mit und ohnepreventDefault, headless wie mit Fenster. Die Suite miselt deshalb die Ursache über eineSprosse, die nach dem Spiel-Listener auf
windowangemeldet ist unddefaultPreventedmeldet (mit Kreuzprobe: die Sonde muss im Lauf
prevented: truesehen, sonst wäre diePrüfung leer). Der Befund-Eintrag „
scrollTopbleibt 0“ war an dieser Stelle einMessartefakt – die beiden anderen Befundteile (Knöpfe tot, Schalter nicht schaltbar) sind
real und oben grün gemessen.
preventDefault): die Leertaste auf einem Overlay-Knopf soll nicht zusätzlich springen.Korrektur zweier Tippfehler oben: »die Suite miselt … über eine Sprosse« → »die Suite misst die Ursache über eine Sonde, die nach dem Spiel-Listener auf
windowangemeldet ist«. Inhaltlich nichts geändert – Fix5c84877, Suitetests/browser_issue20.py.Zweiter Teil: Leertaste war immer noch nichts wert, solange kein Knopf fokussiert war
Nach
5c84877war nur die Sabotage am fokussierten Bedienelement weg. Nachgemessen(Headless-Chromium, echte Tastatur, Fokus auf
body) klaffte genau die Lücke, um die esging – „Leer = Springen“ ist die beworbene Haupttat, auf den Bildschirmen, wo gar nicht
gespielt wird, tat sie aber weiter nichts:
MENUMENUbleibt, 0 KlicksCOUNTDOWN(#btnStart)PAUSEDPAUSEDbleibtPLAYING(#btnResume)GAME_OVERGAME_OVERbleibtCOUNTDOWN(#btnRetry)SETTINGS/HELPMENU(#…Back)MENU, Fokus#btnStartSETTINGS, Fokus#btnResetSave#btnSettingsBackSETTINGS/HELP, Fokus beliebigMENUPLAYING, FokusbodyUmgesetzt in
5446dcd(Dokud5c3cac):INPUT:focusWidget()/overlayVisible()statt des einenwidgetOwns()(das war nachdem Umbau toter Code – genau der Mustermangel aus #21). Leertaste und Eingabe gehen, wenn
kein Bedienelement fokussiert ist, an
hooks.onPrimary().GAME.clickPrimary(): klickt den Knopf, den das Markup mitdata-primaryauszeichnet(
#btnStart,#btnResume,#btnRetry,#btnSettingsBack,#btnHelpBack) – echterKlick, damit nicht eine zweite Zustandsmaschine neben den Buttons um den Zustand ringt.
false(= kein Overlay offen) heißt: die Taste gehört weiter dem Spiel. Sonst würde jederSprung im Lauf den Countdown neu anwerfen.
vorher zurück – die Suite zählt pro Eingabe genau einen Klick auf genau einen Knopf.
ev.repeatfiltert weiterhin vorher, eine gehaltene Leertaste wirft das Game Over nichtmehrfach neu an.
Escapeentlässt aus Einstellungen und Hilfe über dasselbe Feld. Bewusst nicht aus demMenü: dort wäre dasselbe Feld der Start – eine Haupttat, keine Flucht.
.btn-stack(Handler auf der Gruppe,Tabbleibt).preventDefaulterst ab zwei Knöpfen und nur mit Fokus in der Gruppe: der Einzelknopf in#helpmuss die Pfeiltaste zum Panel-Scrollen frei behalten (Teil 3 derselben Suite), unddie Schalter-Reihen in
#settingsliegen außerhalb jeder Gruppe, damit der Fokus nicht vomSchalter gerissen wird.
Leer/↵im Menü“,Escjetzt„Pause · zurück aus Einstellungen und Hilfe“, Erststart-Hinweis „Menü: Leertaste startet,
Pfeiltasten wandern durch die Knöpfe“.
Tests.
tests/browser_issue20.pyvon 60 auf 105 Prüfungen. Gegenmainvor5446dcdgemessen: 29 rot (alle acht Hauptaktionsfälle, beide Wander-Fälle, beide Escape-Fälle,
[data-primary]-Vertrag, drei Beschriftungen). Jetzt grün, und./tests/run-all.shkomplett(12 Node-Suiten + Soak + 11 Browser-Suiten) –
browser_issue8.py(Strg+F/Cmd+F/Alt+F,ev.repeat,Escape),browser_issue7.py(Bildschirmstillstand in der Pause) undbrowser_flow.py(echter Loop mit Leertasteneingaben) unverändert grün.Neu abgedeckt ist damit auch die Gegenseite, die bei so einer Änderung die teurere ist: im
Lauf springt die Leertaste weiter, startet aber keinen neuen Durchgang, und im Countdown
sammelt sie nur den Sprungpuffer, statt bei 3,0 zurückzuspringen.