Files
Forge-Engine/screens/scenes/render_scene_object.py
T
williamandClaude Sonnet 5 c240181518
Build and deploy / test-python (push) Failing after 1m52s
Build and deploy / test-js (push) Successful in 6s
Build and deploy / build-and-push (push) Skipped
Build and deploy / deploy (push) Skipped
Fix éditeur de scène 2D : personnage déformé, animations muettes, galerie petite
Trois correctifs remontés en test manuel sur l'éditeur de scène :

1. Personnage écrasé/déformé dans sa boîte de sélection : les frames
   CraftPix (screens/labels/animal_sprite_library.py) sont de grands
   canevas très paddés (~788×504 px), très différents des sprites Kenney
   déjà recadrés serré (~96×128 px) — sans object-fit, l'image remplissait
   quand même sa boîte (width/height:100%, voir la règle
   .canvasElementInner > img de scene_edit.html) mais DÉFORMÉE. Nouvelle
   classe .sceneObjectSprite (object-fit:contain) posée sur le <img> rendu
   par render_scene_object.py, éditeur ET jeu jouable.

2. Aucun clip de Timeline (sprite, Animate.css ou personnalisé) ne se
   jouait jamais sur un objet de scène : applyAnimationClip()
   (static/js/play/screens.js) et animation-timeline.js sélectionnent
   TOUJOURS leur cible via l'attribut data-anim-target (posé sur
   .canvasElement/.playElement pour le DOM), jamais data-element-id/
   data-object-id — cet attribut n'était simplement jamais posé sur les
   objets de scène. Ajouté sur le <img> rendu (render_scene_object.py).

3. Boîte par défaut d'un nouvel objet de scène trop petite (64×64 px sur
   une scène de 960×540) pour bien voir le personnage ou saisir la
   poignée de redimensionnement confortablement — portée à 128×128
   (ensure_scene_schema.py ; n'affecte que les NOUVEAUX objets, les
   objets déjà posés gardent leur taille actuelle).

Au passage : galerie de personnages ~3x plus grande (2 colonnes au lieu
de 6 dans .iconGallery.personnageGallery) — les tuiles étaient trop
petites pour bien distinguer les personnages.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-31 21:52:46 +02:00

51 lines
3.2 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import html as html_lib
from ..rendering.personnage_data import resolve_personnage_idle_frame
def render_scene_object(obj):
"""HTML d'un objet de scène — positionnement en PIXELS ABSOLUS (pas de
% fluide, voir ensure_scene_schema.py), mirror volontairement plus
simple que render_element_html.py (pas d'arbre de nesting, pas de
palette de widgets à gérer) : juste kind="personnage" (réutilise
resolve_personnage_idle_frame, même _personnage_data que le widget
"personnage" de l'éditeur document) ou kind="decor" (image fixe,
attributes.src). data-object-id/data-personnage jouent le même rôle
que data-element-id/data-personnage côté DOM (voir
static/js/screen_edit/personnage-preview.js, static/js/play/actions.js)."""
style = (
f"position:absolute; left:{obj['x']}px; top:{obj['y']}px; "
f"width:{obj['width']}px; height:{obj['height']}px; z-index:{obj['z_index']};"
)
# data-element-id (en plus de data-object-id) : réutilise TELS QUELS
# tous les sélecteurs [data-element-id=...] déjà écrits pour l'éditeur
# document (collision, animation de sprites, "Modifier un élément") —
# voir static/js/play/actions.js/conditions.js. Sans risque de
# collision d'id : un jeu est ENTIÈREMENT "document" (_screen_elements)
# OU "jeu_2d" (_scene_objects), jamais les deux à la fois.
# data-anim-target (Timeline d'animation, Bug corrigé) : applyAnimationClip()
# (static/js/play/screens.js) et son équivalent d'aperçu éditeur
# (animation-timeline.js) sélectionnent TOUJOURS leur cible via
# [data-anim-target=...] (jamais data-element-id/data-object-id, posé
# sur .canvasElement/.playElement pour le DOM, voir visible_attrs.py) —
# un objet de scène n'ayant pas de wrapper équivalent, cet attribut est
# posé directement sur son <img> : SANS lui, aucun clip de Timeline (ni
# même une action de flow "Jouer une animation") ne trouvait jamais sa
# cible pour un objet de scène, quel que soit son type d'animation.
# class="sceneObjectSprite" (object-fit:contain, voir static/style.css) :
# les frames CraftPix (screens/labels/animal_sprite_library.py) sont de
# GRANDS canevas très paddés (~788×504 px, très différent des sprites
# Kenney déjà bien recadrés, ~96×128 px) — sans object-fit, l'image
# remplirait quand même son cadre (width/height:100%, voir la règle
# `.canvasElementInner > img` dans scene_edit.html) mais DÉFORMÉE,
# rendant le personnage minuscule/écrasé dans sa boîte de sélection.
if obj["kind"] == "personnage":
src = resolve_personnage_idle_frame(obj)
src_attr = f' src="{html_lib.escape(src)}"' if src else ""
return (f'<img class="sceneObjectSprite" data-object-id="{obj["id"]}" data-element-id="{obj["id"]}" '
f'data-anim-target="{obj["id"]}" data-personnage="1" style="{style}"{src_attr}>')
src = (obj.get("attributes") or {}).get("src", "")
src_attr = f' src="{html_lib.escape(src)}"' if src else ""
return (f'<img class="sceneObjectSprite" data-object-id="{obj["id"]}" data-element-id="{obj["id"]}" '
f'data-anim-target="{obj["id"]}" style="{style}"{src_attr}>')