Image de fond de scène + caméra qui suit le personnage, fps d'animation cohérent
Trois retours utilisateur : - fps d'idle/interagir/touches supplémentaires alignés sur celui de la marche (8 i/s partout, était 4 pour idle — perçu comme "les autres animations sont lentes à côté de la marche"). - Nouveau menu "🏞️ Images de fond" dans "Objets de cette scène" : pose un objet kind="fond" à la taille RÉELLE de l'image choisie (pack CraftPix intégré en galerie, admin seulement — licence, voir core/sprite_gate.py), derrière tout le reste, insensible au clic. - Si ce fond dépasse la scène, elle devient le "monde" : .playScreen. playScene est désormais le viewport (overflow:hidden, taille fixe), .sceneWorld le monde à l'intérieur — la caméra centre le premier personnage trouvé, bornée pour ne jamais montrer au-delà des bords (voir personnage-controller.js::forgeUpdateSceneCamera). Le personnage peut désormais se déplacer sur tout le monde, pas seulement le petit cadre visible (clampSceneObjectPosition, actions.js). Un jeu sans fond XXL garde un comportement strictement identique à avant (monde == scène, transform vide). Bibliothèque générée une fois par scripts/generate_background_manifest.py (assets/background/, non versionné, licence CraftPix) vers static/backgrounds/ (committé), même patron que generate_animal_sprite_manifest.py. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
5891c82c62
commit
9199897784
@@ -29,8 +29,9 @@ def render_scene_edit(slug, screen_id, game):
|
||||
personnage_data = screens.resolve_personnage_data(selected_obj)
|
||||
personnage_commands = screens.resolve_personnage_commands(selected_obj)
|
||||
|
||||
_DEFAULT_OBJECT_LABELS = {"personnage": "Personnage", "fond": "Fond"}
|
||||
object_labels = {
|
||||
o["id"]: (o.get("name") or ("Personnage" if o["kind"] == "personnage" else "Décor"))
|
||||
o["id"]: (o.get("name") or _DEFAULT_OBJECT_LABELS.get(o["kind"], "Décor"))
|
||||
for o in objects
|
||||
}
|
||||
element_animations_map = {
|
||||
@@ -54,6 +55,9 @@ def render_scene_edit(slug, screen_id, game):
|
||||
# "Bibliothèque de sprites animaux CraftPix").
|
||||
sprite_library = screens.SPRITE_LIBRARY if g.current_user["role"] == "admin" else screens.PUBLIC_SPRITE_LIBRARY
|
||||
sprite_library_families = screens.sprite_gallery_families(sprite_library)
|
||||
# Images de fond CraftPix (screens.BACKGROUND_LIBRARY) : même règle
|
||||
# d'accès que les sprites animaux — réservées au rôle admin.
|
||||
background_library = screens.BACKGROUND_LIBRARY if g.current_user["role"] == "admin" else {}
|
||||
|
||||
return render_template(
|
||||
"scene_edit.html",
|
||||
@@ -62,6 +66,7 @@ def render_scene_edit(slug, screen_id, game):
|
||||
personnage_commands=personnage_commands or screens.DEFAULT_PERSONNAGE_COMMANDS,
|
||||
sprite_library=sprite_library, sprite_library_families=sprite_library_families,
|
||||
sprite_library_json=json.dumps(sprite_library),
|
||||
background_library=background_library,
|
||||
element_animations_map_json=json.dumps(element_animations_map),
|
||||
element_orientation_values=screens.ELEMENT_ORIENTATION_VALUES,
|
||||
element_orientation_labels_json=json.dumps(screens.ELEMENT_ORIENTATION_LABELS),
|
||||
|
||||
@@ -3,7 +3,7 @@ from flask import request, redirect, url_for
|
||||
import screens
|
||||
|
||||
from core.flask_app import app
|
||||
from core.sprite_gate import forbid_admin_only_character
|
||||
from core.sprite_gate import forbid_admin_only_character, forbid_admin_only_background
|
||||
|
||||
|
||||
@app.route("/game/<slug>/screens/<int:screen_id>/scene-objects/add", methods=["POST"])
|
||||
@@ -13,9 +13,14 @@ def scene_object_add(slug, screen_id):
|
||||
add_scene_object.py)."""
|
||||
kind = request.form.get("kind", "personnage")
|
||||
forge_character = request.form.get("forge_character")
|
||||
background_slug = request.form.get("background_slug")
|
||||
if forge_character:
|
||||
forbid_admin_only_character(forge_character)
|
||||
new_id = screens.add_scene_object(slug, screen_id, kind=kind, forge_character=forge_character)
|
||||
if background_slug:
|
||||
forbid_admin_only_background(background_slug)
|
||||
new_id = screens.add_scene_object(
|
||||
slug, screen_id, kind=kind, forge_character=forge_character, background_slug=background_slug,
|
||||
)
|
||||
# Même route que l'éditeur document (/game/<slug>/screens/<id>/edit,
|
||||
# endpoint "screen_edit") — c'est CE dispatcher qui bascule vers la
|
||||
# vue de scène selon game_type, voir routes/screens/screen_edit.py.
|
||||
|
||||
Reference in New Issue
Block a user