Phase 7 : personnage animé par sprites (poses/images successives)
Build and deploy / test-python (push) Successful in 1m26s
Build and deploy / test-js (push) Successful in 6s
Build and deploy / build-and-push (push) Skipped
Build and deploy / deploy (push) Skipped

Ajoute une nouvelle action de flow "jouer_animation_sprite" qui joue une
séquence de PNG sur un élément image (cycle en boucle type marche, ou
une fois type saut) — réutilise target_element_id (déjà whitelisté) et
data_value en JSON {frames, fps, loop}, exactement le patron déjà établi
par "jouer_son" (Phase 6) et "alea" (Phase 2) : aucune nouvelle colonne,
aucune migration de schéma.

Ajoute une propriété d'élément "orientation" (Modifier un élément) pour
retourner un personnage en miroir (gauche/droite/bascule) sans nécessiter
une 2e feuille de sprites "vue de dos" — même patron que "surbrillance"/
"désactivé".

Étend aussi la Timeline d'animation existante (kind="sprite", aux côtés
de "animate_css"/"custom") pour qu'un personnage puisse animer tout seul
dès l'affichage de l'écran (ex. idle en boucle perpétuelle), pas
seulement en réaction à un événement — réutilise la colonne générique
custom_keyframes (JSON) et le réglage iteration_count déjà là pour la
boucle, aucune migration non plus. Les deux entrées (action de flow et
clip de timeline) partagent le même moteur côté client
(runSpriteAnimation()/activeSpriteAnimations dans static/js/play/
actions.js, indexé par nœud DOM plutôt que par id d'élément pour
supporter plusieurs instances d'un même écran-modèle animées
indépendamment).

Une bibliothèque de sprites Forge (2 personnages Kenney CC0, sous-
ensemble curé idle/marche/saut copié dans static/characters/) est
proposée dans l'éditeur, mais un créateur peut tout aussi bien utiliser
ses propres sprites uploadés (même route d'upload générique que le son
de la Phase 6).

Périmètre volontairement limité à ce qui a été demandé : pas d'avatar
modulable en couches (assemblage cheveux/haut/bas par le joueur),
écarté du plan initial à la demande de l'utilisateur.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
william
2026-08-30 19:18:07 +02:00
co-authored by Claude Sonnet 5
parent 76331f9285
commit d2c2f20b65
35 changed files with 519 additions and 3 deletions
+1
View File
@@ -11,5 +11,6 @@ ACTION_TYPE_LABELS = {
"declencher_evenement": "Déclencher un événement",
"ajouter_ligne": "Ajouter une ligne à un objet",
"jouer_son": "Jouer un son",
"jouer_animation_sprite": "Jouer une animation de sprites",
"rien": "Ne rien faire",
}
@@ -39,6 +39,12 @@ ELEMENT_ACTION_PROPERTIES = [
("pos_y", "Position verticale en % (absolue)"),
("pos_x_relatif", "Déplacer horizontalement de... % (relatif)"),
("pos_y_relatif", "Déplacer verticalement de... % (relatif)"),
# Phase 7 (moteur) — personnage animé par sprites : quel sens regarde
# l'élément (utile pour un personnage qui se déplace au clavier, voir
# applyElementProperty() dans static/js/play/actions.js — retourne
# l'élément en miroir plutôt que de nécessiter une 2e feuille de
# sprites "vue de dos").
("orientation", "Orientation — sens du personnage"),
]
ELEMENT_ACTION_PROPERTY_LABELS = dict(ELEMENT_ACTION_PROPERTIES)
@@ -55,3 +61,10 @@ ELEMENT_DESACTIVE_VALUES = [
("toggle", "Basculer désactivé / réactivé"),
]
ELEMENT_DESACTIVE_LABELS = dict(ELEMENT_DESACTIVE_VALUES)
ELEMENT_ORIENTATION_VALUES = [
("droite", "Faire face à droite"),
("gauche", "Faire face à gauche"),
("toggle", "Retourner (miroir)"),
]
ELEMENT_ORIENTATION_LABELS = dict(ELEMENT_ORIENTATION_VALUES)
+28
View File
@@ -0,0 +1,28 @@
# ---------- Bibliothèque de sprites bundlée avec Forge (Phase 7) ----------
#
# Sous-ensemble curé (idle/marche/saut, pas les packs complets HD/Parts/
# Tilesheet/Vector — inutiles pour un jeu 2D web) des personnages "Toon
# Characters" de Kenney (CC0, voir static/characters/LICENSE-kenney.txt),
# copiés dans static/characters/<slug>/*.png. Un créateur qui veut ses
# propres sprites n'utilise pas ce catalogue : il uploade ses images (voir
# routes/uploads/upload_file.py) et colle leurs URLs directement dans la
# même zone de frames — voir #nf-action-sprite-fields dans
# screen_edit.html.
SPRITE_LIBRARY = {
"male-adventurer": {
"label": "Aventurier",
"animations": {
"idle": ["/static/characters/male-adventurer/idle.png"],
"marche": [f"/static/characters/male-adventurer/walk{i}.png" for i in range(8)],
"saut": ["/static/characters/male-adventurer/jump.png"],
},
},
"zombie": {
"label": "Zombie",
"animations": {
"idle": ["/static/characters/zombie/idle.png"],
"marche": [f"/static/characters/zombie/walk{i}.png" for i in range(8)],
"saut": ["/static/characters/zombie/jump.png"],
},
},
}