From 6b4846a6468b40ee169ca56f91178cea5d1ec639 Mon Sep 17 00:00:00 2001 From: william Date: Thu, 3 Sep 2026 16:43:08 +0200 Subject: [PATCH] =?UTF-8?q?Fix=20vrai=20bug=20:=20un=20objet=20plus=20gran?= =?UTF-8?q?d=20que=20la=20sc=C3=A8ne=20(fond/cam=C3=A9ra)=20restait=20fig?= =?UTF-8?q?=C3=A9=20=C3=A0=20(0,0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Confirmé par l'utilisateur : lié à l'introduction du fond/caméra (voir add_scene_object.py — un "fond" est posé à sa taille RÉELLE, souvent bien plus grande que la scène, exprès, pour que la caméra le suive en défilant sur un monde plus grand que le viewport). Le glisser en position utilisait Math.max(0, Math.min(SCENE_WIDTH - width, ...)) — cette formule suppose SCENE_WIDTH - width POSITIF (objet plus petit que la scène). Pour un objet plus GRAND (ex. un fond de 1920px sur une scène de 960px), cette différence est NÉGATIVE, et Math.max(0, négatif) ramenait TOUJOURS la position à 0 quel que soit le glisser — l'objet restait donc figé, impossible à repositionner. Le redimensionnement plafonnait aussi la largeur/hauteur à "ce qui reste dans la scène depuis son coin" (SCENE_WIDTH - left) — empêchant justement de rendre un objet plus grand que la scène par glisser (un fond ne pouvait être agrandi qu'en le recréant via la galerie). Les deux bornes sont corrigées pour fonctionner quel que soit lequel (scène ou objet) est le plus grand. Co-Authored-By: Claude Sonnet 5 --- static/js/scenes/scene-editor.js | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/static/js/scenes/scene-editor.js b/static/js/scenes/scene-editor.js index 5a0d36a8..c14a1c28 100644 --- a/static/js/scenes/scene-editor.js +++ b/static/js/scenes/scene-editor.js @@ -96,9 +96,22 @@ function onSceneObjectMouseDown(e, id) { // à sa valeur d'origine à la fin. var previousZIndex = el.style.zIndex; + // Bug corrigé ("toujours bloqué", confirmé lié à l'introduction du fond/ + // caméra, voir add_scene_object.py) : un "fond" est posé à sa taille + // RÉELLE (souvent bien plus grande que la scène, ex. 1920px pour une + // scène de 960px — exprès, pour que la caméra puisse le suivre en + // défilant) — Math.max(0, Math.min(SCENE_WIDTH - width, ...)) suppose + // SCENE_WIDTH - width POSITIF (objet plus petit que la scène) : pour un + // objet plus GRAND, cette différence est négative, et Math.max(0, ...) + // ramenait alors TOUJOURS la position à 0 quel que soit le glisser — un + // fond (ou tout autre objet plus grand que la scène) restait donc figé + // à (0,0), impossible à repositionner. min/max sont maintenant calculés + // dans le bon ordre quel que soit lequel des deux est le plus grand. function applyDelta(dx, dy) { - curLeft = Math.max(0, Math.min(SCENE_WIDTH - width, curLeft + dx)); - curTop = Math.max(0, Math.min(SCENE_HEIGHT - height, curTop + dy)); + var minLeft = Math.min(0, SCENE_WIDTH - width), maxLeft = Math.max(0, SCENE_WIDTH - width); + var minTop = Math.min(0, SCENE_HEIGHT - height), maxTop = Math.max(0, SCENE_HEIGHT - height); + curLeft = Math.max(minLeft, Math.min(maxLeft, curLeft + dx)); + curTop = Math.max(minTop, Math.min(maxTop, curTop + dy)); el.style.left = curLeft + 'px'; el.style.top = curTop + 'px'; } @@ -143,9 +156,15 @@ function onSceneObjectResizeMouseDown(e, id) { var previousZIndex = el.style.zIndex; el.style.zIndex = 9999; + // Pas de plafond à "SCENE_WIDTH - left" ici (bug corrigé) : un objet + // (typiquement un "fond", voir add_scene_object.py) doit pouvoir être + // redimensionné plus GRAND que la scène elle-même — c'est précisément + // le principe de la caméra qui suit le personnage sur un monde plus + // grand que le viewport. Seul un minimum (8px, jamais un objet + // invisible) reste imposé. function applyDelta(dx, dy) { - curWidth = Math.max(8, Math.min(SCENE_WIDTH - left, curWidth + dx)); - curHeight = Math.max(8, Math.min(SCENE_HEIGHT - top, curHeight + dy)); + curWidth = Math.max(8, curWidth + dx); + curHeight = Math.max(8, curHeight + dy); el.style.width = curWidth + 'px'; el.style.height = curHeight + 'px'; }