Éditeur de collision (jeu 2D) : règles trigger -> action par objet
Build and deploy / test-python (push) Successful in 6m31s
Build and deploy / test-js (push) Successful in 50s
Build and deploy / build-and-push (push) Skipped
Build and deploy / deploy (push) Skipped

Nouvel onglet "🧩 Collision" dans l'éditeur de scène 2D : chaque objet
(hors joueur et fond) peut porter des règles "à la collision" ou "dans
un périmètre (px)" déclenchant une action (quête, attaque, événement,
ou interagir - qui affiche "Appuie sur [touche]" puis exécute une
sous-action à l'appui, un seul niveau d'imbrication). Backend
(sanitisation, route de persistance, exposition dans
full_game_payload) + assistant modal en cartes empilées côté client.

Ajoute le moteur d'exécution runtime (collision-rules-controller.js) :
détecte l'entrée en collision/périmètre avec le joueur à chaque tick,
déclenche l'action une seule fois par entrée, pur JS client sans appel
serveur (fonctionne à l'identique en ligne et en export SCORM).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
william
2026-09-02 17:11:42 +02:00
co-authored by Claude Sonnet 5
parent dfaf85fac1
commit ee270d0286
15 changed files with 989 additions and 0 deletions
+31
View File
@@ -669,6 +669,37 @@ body.builderBody > main.content{ flex:1 1 auto; min-height:0; overflow:hidden; d
background:#ff5c5c; border-radius:50%; border:2px solid #1a1d24;
}
/* Éditeur de collision (voir "🧩 Collision", templates/scene_edit.html,
static/js/scenes/collision-rules-editor.js) : une carte par objet
éligible, chaque règle déjà posée affichée comme une CHAÎNE de petits
maillons (déclencheur -> action -> sous-action éventuelle) — la
métaphore "pièces qui s'emboîtent" demandée, sans un vrai graphe à
tracer à la souris (l'assistant "+ Action" construit la chaîne pas à
pas, voir openCollisionRuleModal). */
.collisionRulesCards{ display:flex; flex-direction:column; gap:14px; margin-top:12px; }
.collisionRuleCard{
background:var(--panel); border:1px solid var(--border); border-radius:10px; padding:14px;
}
.collisionRuleCardHeader{ display:flex; align-items:center; gap:10px; margin-bottom:8px; }
.collisionRuleCardThumb{
width:36px; height:36px; border-radius:6px; overflow:hidden; background:var(--panel2);
display:flex; align-items:center; justify-content:center; flex-shrink:0;
}
.collisionRuleCardThumb img{ max-width:100%; max-height:100%; object-fit:contain; }
.collisionRuleCardTitle{ margin:0; font-size:14px; }
.collisionRuleCardRules{ display:flex; flex-direction:column; gap:8px; margin-bottom:10px; }
.collisionRuleChain{
display:flex; align-items:center; justify-content:space-between; gap:8px;
background:var(--panel2); border:1px solid var(--border); border-radius:8px; padding:6px 8px;
}
.collisionRuleChainLinks{ display:flex; align-items:center; flex-wrap:wrap; gap:6px; }
.collisionRuleLink{
background:var(--accent); color:#fff; border-radius:12px; padding:3px 10px; font-size:12px; white-space:nowrap;
}
.collisionRuleArrow{ color:var(--forge-text-muted, #8b95a7); font-size:12px; }
.collisionWizardChoices{ display:flex; flex-direction:column; }
.collisionInteractBubble{ display:none; position:absolute; left:50%; bottom:100%; transform:translateX(-50%); margin-bottom:6px; background:#111; color:#fff; border-radius:10px; padding:4px 10px; font-size:12px; white-space:nowrap; pointer-events:none; z-index:20; }
.listRow.selected{ border-color:var(--accent); background:var(--panel2); }
.childList{ display:flex; flex-direction:column; gap:6px; margin:2px 0 10px 18px; padding-left:10px; border-left:2px dashed var(--border); }