Panneau scène simplifié + boîte de collision + rôle joueur/ennemi/pnj
Trois retours utilisateur sur l'éditeur de scène 2D : - Retire l'arborescence "Objets de cette scène" (un objet reste sélectionnable en cliquant dessus sur le canevas) et le bouton "+ Ajouter un décor" (le type "decor" reste supporté côté serveur, juste plus accessible depuis ce menu). - Chaque objet de scène a désormais une boîte de collision AUTOMATIQUE (= sa propre boîte, comportement inchangé pour une condition de collision déjà posée) réglable dans un nouveau panneau "🧱 Collision" : activée/désactivée, forme (rectangle/cercle), taille et décalage — utile pour un sprite très paddé (CraftPix) dont la silhouette réelle est bien plus petite que son canevas. elementsOverlap() (conditions.js) applique ces réglages en restant identique par défaut. - Nouveau champ "🏷️ Rôle" (Joueur/Ennemi/PNJ) sur un personnage : SEUL un personnage "Joueur" est désormais déplacé/animé au clavier et suivi par la caméra (personnage-controller.js) — "Ennemi"/"PNJ" restent immobiles tant qu'aucune logique de flow ne les pilote (déplacement ennemi automatique/apparition, dialogue de PNJ... hors scope de ce réglage, qui ne fait qu'identifier "quel objet est le joueur"). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
9199897784
commit
bc3feb5080
+62
-15
@@ -45,20 +45,10 @@
|
||||
<a class="button is-small is-primary is-fullwidth mb-2" href="{{ url_for('game_play', slug=game.slug) }}" target="_blank">▶️ Jouer depuis le début</a>
|
||||
<hr style="border-color:var(--border); margin:10px 0;">
|
||||
|
||||
<h2 class="subtitle is-6">Objets de cette scène</h2>
|
||||
{% if objects %}
|
||||
<div class="elementTree">
|
||||
{% for o in objects %}
|
||||
<div class="treeNode" data-element-id="{{ o.id }}">
|
||||
<a class="treeNodeLabel {{ 'selected' if o.id == selected_id else '' }}" href="{{ url_for('screen_edit', slug=game.slug, screen_id=screen.id, selected=o.id) }}">
|
||||
{{ '🏃' if o.kind == 'personnage' else ('🏞️' if o.kind == 'fond' else '🖼️') }} <span class="treeLabel">{{ o.name or ('Personnage' if o.kind == 'personnage' else ('Fond' if o.kind == 'fond' else 'Décor')) }}</span>
|
||||
</a>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% else %}
|
||||
<p class="hint">Aucun objet pour l'instant.</p>
|
||||
{% endif %}
|
||||
<!-- "Objets de cette scène" (arborescence des objets déjà posés)
|
||||
retirée à la demande de l'utilisateur — un objet posé reste
|
||||
sélectionnable en cliquant directement dessus sur le canevas
|
||||
(voir onSceneObjectMouseDown, static/js/scenes/scene-editor.js). -->
|
||||
|
||||
<!-- Galerie de personnages Forge (VRAIES miniatures) — cliquer une
|
||||
tuile pose un personnage déjà configuré, animé immédiatement (voir
|
||||
@@ -77,7 +67,6 @@
|
||||
<p class="help">Personnage Kenney (licence libre CC0) ou animal Forge, avec toutes ses animations — les variantes de couleur d'un animal se choisissent depuis le panneau de propriétés.</p>
|
||||
</div>
|
||||
</details>
|
||||
<button type="button" class="button is-small is-fullwidth" onclick="addSceneObject('decor')">🖼️ + Ajouter un décor</button>
|
||||
{% if background_library %}
|
||||
<!-- Images de fond CraftPix (screens.BACKGROUND_LIBRARY, admin
|
||||
seulement — voir core/sprite_gate.py). Posée à la taille RÉELLE
|
||||
@@ -665,10 +654,68 @@
|
||||
</div>
|
||||
</details>
|
||||
|
||||
<!-- Boîte de collision (voir screens/rendering/collision_settings.py,
|
||||
static/js/play/conditions.js::elementsOverlap) : posée AUTOMATIQUEMENT
|
||||
sur tout objet (= sa boîte visuelle par défaut, tant que rien
|
||||
n'est changé ici) — désactivable, taille/forme/décalage réglables
|
||||
pour un sprite très paddé dont la silhouette réelle est plus
|
||||
petite que son canevas. -->
|
||||
<details class="propGroup">
|
||||
<summary>🧱 Collision</summary>
|
||||
<div class="propGroupBody" id="collisionPanelBody" data-element-id="{{ obj.id }}">
|
||||
<div class="field">
|
||||
<div class="control">
|
||||
<label class="checkbox">
|
||||
<input type="checkbox" id="collision-enabled" {{ 'checked' if collision_settings.enabled else '' }} onchange="saveSceneObjectCollision()">
|
||||
Boîte de collision activée
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="field"><label class="label is-small">Forme</label>
|
||||
<div class="control">
|
||||
<div class="select is-small">
|
||||
<select id="collision-shape" onchange="saveSceneObjectCollision()">
|
||||
<option value="rectangle" {{ 'selected' if collision_settings.shape == 'rectangle' else '' }}>Rectangle</option>
|
||||
<option value="cercle" {{ 'selected' if collision_settings.shape == 'cercle' else '' }}>Cercle</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="field is-grouped">
|
||||
<div class="control"><label class="label is-small">Largeur (px)</label>
|
||||
<input class="input is-small" type="number" min="1" id="collision-width" value="{{ collision_settings.width }}" onchange="saveSceneObjectCollision()"></div>
|
||||
<div class="control"><label class="label is-small">Hauteur (px)</label>
|
||||
<input class="input is-small" type="number" min="1" id="collision-height" value="{{ collision_settings.height }}" onchange="saveSceneObjectCollision()"></div>
|
||||
</div>
|
||||
<div class="field is-grouped">
|
||||
<div class="control"><label class="label is-small">Décalage X (px)</label>
|
||||
<input class="input is-small" type="number" id="collision-offset-x" value="{{ collision_settings.offset_x }}" onchange="saveSceneObjectCollision()"></div>
|
||||
<div class="control"><label class="label is-small">Décalage Y (px)</label>
|
||||
<input class="input is-small" type="number" id="collision-offset-y" value="{{ collision_settings.offset_y }}" onchange="saveSceneObjectCollision()"></div>
|
||||
</div>
|
||||
<p class="help">Taille/décalage réglés par rapport au centre de l'objet — laisse la taille par défaut (celle de l'objet) si son image n'a pas de marge inutile.</p>
|
||||
</div>
|
||||
</details>
|
||||
|
||||
{% if obj.kind == 'personnage' %}
|
||||
<details class="propGroup" open>
|
||||
<summary>🎭 Personnage</summary>
|
||||
<div class="propGroupBody" id="personnagePanelBody" data-element-id="{{ obj.id }}">
|
||||
<!-- Rôle (voir screens/rendering/personnage_role.py) : seul un
|
||||
personnage "Joueur" est déplacé/animé automatiquement au
|
||||
clavier et suivi par la caméra — "Ennemi"/"PNJ" restent
|
||||
immobiles tant qu'aucune logique de flow ne les pilote. -->
|
||||
<div class="field"><label class="label is-small">🏷️ Rôle</label>
|
||||
<div class="control">
|
||||
<div class="select is-small">
|
||||
<select id="personnage-role" onchange="saveSceneObjectRole(this.value)">
|
||||
{% for value in personnage_role_choices %}
|
||||
<option value="{{ value }}" {{ 'selected' if value == personnage_role else '' }}>{{ personnage_role_labels[value] }}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<p class="help">Personnage Forge — clique un autre pour en changer.</p>
|
||||
<div class="iconGallery personnageGallery" id="personnageGallerySwap">
|
||||
{% for slug_c, character in sprite_library_families %}
|
||||
|
||||
Reference in New Issue
Block a user