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
@@ -124,18 +124,25 @@ function applyElementProperty(targetEl, property, value) {
|
||||
targetEl.style[spec.css] = value + spec.suffix;
|
||||
}
|
||||
|
||||
// Bloque un objet de scène dans les limites de LA scène affichée (bug
|
||||
// signalé par l'utilisateur : un déplacement continu au clavier — voir
|
||||
// Bloque un objet de scène dans les limites du MONDE affiché (bug signalé
|
||||
// par l'utilisateur : un déplacement continu au clavier — voir
|
||||
// triggers.js/"touche_maintenue" — pouvait le faire sortir du cadre sans
|
||||
// rien pour l'en empêcher). scene_width/scene_height viennent de
|
||||
// screensData (voir full_game_payload.py, _screens.scene_width/height) ;
|
||||
// sans écran trouvé (jamais censé arriver pour un objet de scène), la
|
||||
// valeur n'est pas bornée plutôt que de risquer un blocage à 0.
|
||||
// rien pour l'en empêcher). world_width/world_height (voir
|
||||
// personnage-controller.js::forgeUpdateSceneWorldSize, appelée à chaque
|
||||
// tick AVANT tout déplacement) valent scene_width/scene_height tant
|
||||
// qu'aucun objet kind="fond" plus grand que la scène n'est posé — un jeu
|
||||
// sans fond XXL borne donc exactement comme avant. scene_width/height
|
||||
// viennent de screensData (voir full_game_payload.py,
|
||||
// _screens.scene_width/height) ; sans écran trouvé (jamais censé arriver
|
||||
// pour un objet de scène), la valeur n'est pas bornée plutôt que de
|
||||
// risquer un blocage à 0.
|
||||
function clampSceneObjectPosition(targetEl, css, rawValue) {
|
||||
const screenData = screensData.find(function(s){ return s.id === window.currentScreenId; });
|
||||
if (!screenData || screenData.scene_width == null) return rawValue;
|
||||
const size = parseFloat(targetEl.style[css === 'left' ? 'width' : 'height']) || 0;
|
||||
const max = (css === 'left' ? screenData.scene_width : screenData.scene_height) - size;
|
||||
const boundWidth = screenData.world_width != null ? screenData.world_width : screenData.scene_width;
|
||||
const boundHeight = screenData.world_height != null ? screenData.world_height : screenData.scene_height;
|
||||
const max = (css === 'left' ? boundWidth : boundHeight) - size;
|
||||
return Math.max(0, Math.min(max, rawValue));
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user