The two On key down fields read in milliseconds now, and say so in their labels. A number field shows three decimals unless a property asks for fewer, so both params set decimals: 0 – the field reads 300, not 300.000, and rounds to whole milliseconds while typing or scrubbing. The clock behind it still counts seconds; the conversion sits at the one place that reads the properties.
84 lines
4.2 KiB
Markdown
84 lines
4.2 KiB
Markdown
das on key down event node bräuchte ein "repeat"
|
||
sprich wie wenn man auf der tastatur eine taste länger drückt:
|
||
- man drückt die taste, das event wir ganz normal gefeuert
|
||
- man hält länger gedrückt, nach einem bestimmten delay, feuert das event nochmal
|
||
- hält man weiterhin gedrückt, feuert das event öfter hintereinandert
|
||
|
||
das ist ein beispiel szenario für tetris links/rechts shape bewegung
|
||
|
||
ich denk wir brauchen beim "on key down" event zwei properties:
|
||
- repeat after (seconds)
|
||
- repeat interval (seconds, nachdem das erstmal repeat after aufgerufen wurde)
|
||
|
||
ist repeat after auf 0 - kein effekt (alles wie bisher)
|
||
ist repeat interval auf 0 - jedes weitere frame aufrufen
|
||
|
||
---
|
||
|
||
## Umgesetzt
|
||
|
||
Genau die beschriebene Form: zwei Zahlen-Properties am `On key down`-Node.
|
||
|
||
| | |
|
||
|---|---|
|
||
| **Repeat after (ms)** | Haltedauer bis zur ersten Wiederholung. **0 = kein Effekt**, alles wie bisher |
|
||
| **Repeat interval (ms)** | Abstand der weiteren Wiederholungen. **0 = jedes Frame** |
|
||
|
||
Beide Felder sind **Millisekunden** — damit bleiben die ueblichen Werte ganze Zahlen (300, 50)
|
||
statt 0,3 und 0,05. Die Uhr dahinter rechnet weiter in Sekunden; umgerechnet wird beim Auslesen
|
||
der Node-Properties.
|
||
|
||
Beide tragen `decimals: 0`: das Inspector-Zahlenfeld zeigt sonst immer drei Nachkommastellen
|
||
(`NUMBER_DECIMALS`), also stand dort `300.000`. Der Node-Koerper war davon nie betroffen —
|
||
`formatValue` gibt ganze Zahlen bar aus.
|
||
|
||
Der erste Druck feuert immer sofort und unveraendert — die Wiederholung haengt nur hinten dran.
|
||
|
||
### Warum das nicht der Auto-Repeat des Browsers ist
|
||
|
||
Der Browser feuert bei gehaltener Taste selbst wiederholt `keydown`. Diese Ereignisse werden
|
||
seit jeher verworfen (`Input.press`: `if (!this.down.has(key)) ... // ignore auto-repeat`), und
|
||
das bleibt so: Verzoegerung und Rate sind eine **Betriebssystem-Einstellung des Spielers**,
|
||
kein Spielparameter. Die Wiederholung wird stattdessen aus der gemessenen Haltedauer gebaut —
|
||
damit ist sie auf jeder Maschine gleich und pro Node einstellbar.
|
||
|
||
Die Regel selbst steht als reine Funktion in `src/core/graph/keyRepeat.ts`, nicht als Bedingung
|
||
im Runtime-Code — deshalb ist sie ohne Browser pruefbar. Die Haltedauer pro Node liegt in
|
||
`nodeState`, derselben Ablage, aus der `On timer` seine Uhr bezieht.
|
||
|
||
### Eine Entscheidung, die ich getroffen habe
|
||
|
||
Ein sehr kleines, positives Intervall wird auf **10 ms** angehoben — dieselbe Untergrenze, die
|
||
`On timer` schon hat. Sonst wuerde ein vertipptes `0,0001` bei einem langen Frame tausende
|
||
Aufrufe in einem Bild ausloesen. **0 bleibt davon unberuehrt** und behaelt seine eigene
|
||
Bedeutung ("jedes Frame").
|
||
|
||
### Der Node bleibt schmal
|
||
|
||
Zwei Zeilen `Repeat after (ms): 0` an *jedem* Tastatur-Node waeren reiner Laerm gewesen — ich habe
|
||
mir das Bild angesehen, es war deutlich sichtbar. Beide Zeilen bleiben vom Node-Koerper weg,
|
||
solange die Verzoegerung 0 ist; der Inspector zeigt sie immer. Neu dafuer ist `NodeDef.hiddenParams`.
|
||
Sobald eine Verzoegerung gesetzt ist, erscheinen **beide** — auch ein Intervall von 0, denn das
|
||
ist dort eine Einstellung und keine Abwesenheit.
|
||
|
||
### Der Beweis
|
||
|
||
Zwei `On key down` auf **derselben** Taste, einer schlicht, einer wiederholend — ein einziges
|
||
Halten misst beide, damit "es hat wiederholt" nicht mit "die Taste kam oefter an" verwechselt
|
||
werden kann.
|
||
|
||
```
|
||
PASS a hold shorter than the delay fires once, repeat or not
|
||
– plain 0 → 1, repeating 0 → 1 over 120 ms with a 300 ms delay
|
||
PASS holding past the delay keeps the repeating node firing, while the plain one counts one press
|
||
– plain +1, repeating +12 over 800 ms (press + ~10 repeats expected)
|
||
PASS a node with no repeat set carries no repeat rows, the repeating one carries both
|
||
– plain ["Key: Right arrow"], repeating [… "Repeat after (ms): 300", "Repeat interval (ms): 50"]
|
||
PASS typing a new delay lands on the node – {"key":"ArrowRight","repeatAfter":750,"repeatInterval":50}
|
||
PASS the delay typed into the inspector is the one the run uses
|
||
– repeating 0 → 1 over 500 ms with the delay raised to 750 ms
|
||
```
|
||
|
||
Der letzte ist der wichtigste: derselbe Graph, nur die getippte Zahl geaendert — und der Node
|
||
schweigt. Damit haengt die Laufzeit nachweislich am Inspector-Wert und nicht an etwas anderem.
|