Phase 3 : déclencheur clavier + minuteur récurrent
screens/flow/constants.py : TRIGGER_EVENTS += "clavier" (À l'appui sur une touche) et "minuteur" (Toutes les X millisecondes) — ni élément ni écran précis pour les deux, comme "evenement" déjà en place. FLOW_NODE_FIELDS += trigger_key/trigger_interval_ms. ensure_flow_schema.py : ALTER TABLE pour les 2 colonnes (patron trigger_custom_event_id). templates/screen_edit.html + static/js/screen_edit/flow-editor.js : - "clavier" : un champ "Touche à surveiller" qui capture lui-même la touche pressée (onkeydown sur l'input, captureFlowTriggerKey()) plutôt que de faire deviner la syntaxe attendue (ev.key du navigateur, ex. "ArrowUp", "a", " " pour Espace). - "minuteur" : un simple champ numérique (millisecondes). - nodeLabel() affiche "⌨️ Touche « X »"/"⏱️ Toutes les N ms" sur le nœud. static/js/play/triggers.js (moteur de jeu) : - bindKeyboardTriggers() : UN SEUL window.addEventListener('keydown', ...) posé une fois pour tout le jeu (voir l'amorçage en fin de templates/play.html) — même patron de scan global que dispatchGameEvent() pour "Sur un événement personnalisé". - runScreenTimerTriggers(screenId) : géré PAR ÉCRAN (appelé depuis showScreen(), static/js/play/screens.js) — démarre les setInterval des nœuds "minuteur" de l'écran affiché, arrête d'abord tous ceux de l'affichage précédent (même principe que runAnimationTimeline) pour ne jamais accumuler des minuteurs sur des écrans quittés. Vérifié : 255 tests passent (5 nouveaux, dont un qui verrouille que la touche Espace — très probablement utilisée en jeu — n'est pas filtrée comme une valeur "vide" par add_flow_node.py), 13 tests node:test toujours au vert, syntaxe JS validée sur tous les fichiers de static/js/play/ et static/js/screen_edit/. Comme le reste du graphe de logique côté client, le comportement RÉEL d'un keydown/setInterval n'est pas testable sans navigateur — test manuel recommandé (touche assignée à un saut, minuteur faisant avancer un compteur). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
7476ed229e
commit
727c3c97ba
@@ -50,6 +50,19 @@ TRIGGER_EVENTS = [
|
||||
# gameData.flows côté client (voir dispatchGameEvent() dans
|
||||
# templates/play.html), au même titre que findTriggerNode().
|
||||
("evenement", "Sur un événement personnalisé"),
|
||||
# Phase 3 (moteur) — ni élément ni écran précis : trigger_key (quelle
|
||||
# touche, ev.key du clavier) est le seul réglage propre à ce nœud,
|
||||
# écouté UNE SEULE FOIS pour tout le jeu (voir bindKeyboardTriggers()
|
||||
# dans static/js/play/triggers.js), même patron de scan global que
|
||||
# "evenement" ci-dessus.
|
||||
("clavier", "À l'appui sur une touche"),
|
||||
# Contrairement aux autres déclencheurs (réagissent à quelque chose),
|
||||
# celui-ci fait AVANCER le jeu tout seul, à intervalle régulier —
|
||||
# trigger_interval_ms (en millisecondes) est son seul réglage. Géré
|
||||
# PAR ÉCRAN (voir showScreen() dans static/js/play/screens.js) : ne
|
||||
# tourne que tant que l'écran qui le porte est affiché, jamais en
|
||||
# arrière-plan sur un écran quitté.
|
||||
("minuteur", "Toutes les X millisecondes"),
|
||||
]
|
||||
|
||||
CONDITION_OPERATORS = [
|
||||
@@ -91,4 +104,7 @@ FLOW_NODE_FIELDS = {
|
||||
# recrée puis supprime l'ancien) — le client doit donc renvoyer
|
||||
# block_id à chaque (ré)création, pas juste le poser une fois.
|
||||
"block_id",
|
||||
# Phase 3 — déclencheur clavier ("clavier") et minuteur récurrent
|
||||
# ("minuteur"), voir TRIGGER_EVENTS ci-dessus.
|
||||
"trigger_key", "trigger_interval_ms",
|
||||
}
|
||||
|
||||
@@ -96,5 +96,14 @@ def ensure_flow_schema(slug):
|
||||
# rattache paresseusement à un bloc "Bloc principal" généré à la
|
||||
# volée, la première fois que l'onglet Blocs est ouvert.
|
||||
conn.execute("ALTER TABLE _flow_nodes ADD COLUMN block_id INTEGER")
|
||||
if "trigger_key" not in cols:
|
||||
# Phase 3 — déclencheur clavier (trigger_event="clavier") : quelle
|
||||
# touche (ev.key du navigateur, ex. "ArrowUp", " ", "a") ; minuteur
|
||||
# récurrent (trigger_event="minuteur") : trigger_interval_ms, en
|
||||
# millisecondes entre deux déclenchements — voir TRIGGER_EVENTS
|
||||
# (screens/flow/constants.py) pour le détail des deux.
|
||||
conn.execute("ALTER TABLE _flow_nodes ADD COLUMN trigger_key TEXT")
|
||||
if "trigger_interval_ms" not in cols:
|
||||
conn.execute("ALTER TABLE _flow_nodes ADD COLUMN trigger_interval_ms INTEGER")
|
||||
conn.commit()
|
||||
conn.close()
|
||||
|
||||
@@ -5,4 +5,6 @@ TRIGGER_LABELS = {
|
||||
"survol": "Au survol",
|
||||
"fin_survol": "Fin du survol",
|
||||
"evenement": "Sur un événement personnalisé",
|
||||
"clavier": "À l'appui sur une touche",
|
||||
"minuteur": "Toutes les X millisecondes",
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user