Sprung hat keine Untergrenze nach unten: 165 px Mindesthöhe lassen bei Hindernisfolgen nur ein Absprungfenster ab 17 ms #16
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#16
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?
Sprung hat keine Untergrenze nach unten: 165 px Mindesthöhe lassen bei Hindernisfolgen nur ein Absprungfenster ab 17 ms #16"
By gilli — Closed
bug
game-feel
gameplay
high
level-generation
physics
2 comments
Behoben in
249db31(Doku-Nachlauf45a2f87), alle 12 Node-Suiten und alle 9 Browser-Suiten grün.Was geändert wurde
1 · Sprungabbruch beim Loslassen (Kern, Vorschlag 1)
integrateFreekappt die Steiggeschwindigkeit beim Loslassen im Aufstieg einmalig:K.JUMP_CUT = 0.78, Flagb.jumpCutfällt indoJump()zurück.state === "JUMPING"würde jeder Aufstieg ausdem Schwingen (
SLACKnachreleaseHook) halbiert.autopilotsetztcmd.jumpHeldjetzt auch im Absprungschritt (Parität zum echtenTastendruck). Fehlt das, greift der Cut im Solver sofort und
s.holdist wirkungslos –gemessen: alle Haltezeiten flogen identisch.
Gemessene Hüllkurve bei 360 px/s (Scheitel / Luftzeit / Strecke):
Verhältnis kürzeste → längste Bahn: 1,38 → 2,30 (Strecke 1,21 → 1,56).
2 · Generierung gegen die gemessene Hüllkurve statt gegen die Formel (Vorschlag 3)
jumpEnvelope()fährt Kürzest- und Längstbahn einmalig aus (Vorrat über die beteiligtenKonstanten,
minJumpDistance(v)/maxJumpDistance(v)),jumpDistance()bleibt nur als Maßstab.Layout wird an der unteren Grenze gemacht:
maxGapJumpable = K.GAP_OF_MIN_ARC (0,86) × minJumpDistance→ Grubenwürfe ≤ 177 px beiStarttempo statt ≤ 194 px Formelware.
≥
K.HOP_TROUGH_OF_MIN_ARC (1,25) × minJumpDistance→ hüpfend und fliegend fahrbar.Die Mulde ist damit landbar, der Cluster-„eine Bahn für alles“-Zwang weg.
maxBlockHeight(v, w)(analytisch aus der Hüllkurve: Parabelstrecke oberhalbh + Marge), Breiten/Höhen alsK.BLOCK_*inK. Die Spanne 40–74 px bleibt erhalten –gedeckelt wird nur, was die losgelassene Bahn nicht überfliegt (beispielhaft: 62 px bei
Breite 48, 53 px bei Breite 62 im Starttempo).
K.PLATFORM_H_MAX(86 px), sonst steht die Plattform über der Tipp-Scheitelhöhe.3 · Toleranz statt Lösbarkeit in
verifyContent()takeoffWindow()zählt aufeinanderfolgende Absprungzeitpunkte auf dem 1/60-s-Raster(Verschub über
jumpLead), akzeptiert wird eine Strategie erst abK.MIN_TAKEOFF_FRAMES = 4– gemessen mit der losgelassenen Bahn, denn das ist der Sprungeines Spielers, der nicht hält. Muster mit 17-ms-Tor fallen zurück und die Kette bedient
JUMP/SAFE.
An Hakenmustern misst die Strategie-Schwingbahn: Hakengruben sind bewusst breiter als jeder
Sprung (1,04–1,42 ×
jumpDistance), die losgelassene Bahn trägt dort per Design nicht an denHaken.
verifyAllInputs()prüft deshalb ab 0,09 s Haltezeit statt ab 0 – sonst fiele dieKette von 231 auf 69 pro 10 000 Muster, weil ein Tipp an einer 300-px-Grube ins Leere führt.
4 · Mechanik beschriftet (Vorschlag 4)
Hilfetabelle: „Springen (halten = höher und weiter, im Aufstieg loslassen = kürzer) · in der
Luft: erreichbaren Haken greifen“. Erststart-Hinweis: „Springen: linke Bildschirmhälfte
(halten = höher und weiter, früh loslassen = flacher)“.
Messung nach dem Fix
10 Samen × 30 Bühnenbreiten, 484 Muster ohne Haken, Fenster mit
hold = 0:Cluster-Fenster 1 Bildrate (17 ms), 5 von 23 Clustern unter 100 ms.
PIT 706, … bei 10 000 Mustern),
forcedSafe0, HOOK_CHAIN 174.Tests
tests/issue16.mjs(neu, 33 Prüfungen): gegenHEADvor dem Fix rot (19 Prüfungen,u. a. Tipp-Scheitel 164,7 px, Cluster-Mulden 72–99 px, engstes Fenster 1 Bildrate, alter
Cluster wird von
verifyContentakzeptiert), jetzt grün. Misst die Hüllkurve durch eigeneFlüge statt über die ausgelieferten Helfer, dazu: Cut einmalig und nur im
JUMPING-Aufstieg,holdim Solver keine Attrappe, Blockhöhen/Mulden/Grubenwürfe gegen die Hüllkurve,Fenstertest über verlegte Muster, alter Cluster (228 px überbrückt, 67 px hoch, 430 px/s)
ist lösbar und wird trotzdem verworfen, Beschriftung in Hilfe und Erststart-Hinweis.
tests/issue2.mjsauf die neue Halte-Semantik nachgezogen (Dreierpack aus AGENTS.md Regel 4):Loslassen nach dem Haltebudget ist jetzt die gekappte Bahn, Differenz loser/gehaltener
Sprung ≥ 60 px.
tests/browser_issue14.pyundtests/browser_issue8.pymessen die losgelassene Bahn gegendie aus
K.JUMP_CUTrechnerische Tipp-Bahn (statt starrer 165 px) und prüfen den gehaltenenSprung über den echten Eingabeweg auf ≥ 220 px.
soak.mjs(10 000 Muster + 5 min Autopilot),browser_smoke/flow/issue5/issue7/issue9/issue10/issue11.Abgearbeitet in
249db31: Jump-Cut (K.JUMP_CUT) gibt dem Sprung eine Untergrenze (99,5 → 228,5 px Scheitel, Verhältnis 2,30), Generierung sized an der gemessenen minJumpDistance() (enger Block-Cluster weg, Gruben- und Muldenmaße, Blockhöhen-Deckel), verifyContent verlangt K.MIN_TAKEOFF_FRAMES = 4 aufeinanderfolgende Absprungzeitpunkte und die Mechanik ist in Hilfe + Erststart-Hinweis beschriftet. Abgedeckt von tests/issue16.mjs (gegen HEAD rot, jetzt 33 ok); alle übrigen Node- und Browser-Suiten grün. Details im Kommentar.