Fix vrai bug : un objet plus grand que la scène (fond/caméra) restait figé à (0,0)
Build and deploy / test-python (push) Failing after 1m22s
Build and deploy / test-js (push) Successful in 56s
Build and deploy / build-and-push (push) Skipped
Build and deploy / deploy (push) Skipped

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 <noreply@anthropic.com>
This commit is contained in:
william
2026-09-03 16:43:08 +02:00
co-authored by Claude Sonnet 5
parent 7c9b2c9b25
commit 6b4846a646
+23 -4
View File
@@ -96,9 +96,22 @@ function onSceneObjectMouseDown(e, id) {
// à sa valeur d'origine à la fin. // à sa valeur d'origine à la fin.
var previousZIndex = el.style.zIndex; 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) { function applyDelta(dx, dy) {
curLeft = Math.max(0, Math.min(SCENE_WIDTH - width, curLeft + dx)); var minLeft = Math.min(0, SCENE_WIDTH - width), maxLeft = Math.max(0, SCENE_WIDTH - width);
curTop = Math.max(0, Math.min(SCENE_HEIGHT - height, curTop + dy)); 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.left = curLeft + 'px';
el.style.top = curTop + 'px'; el.style.top = curTop + 'px';
} }
@@ -143,9 +156,15 @@ function onSceneObjectResizeMouseDown(e, id) {
var previousZIndex = el.style.zIndex; var previousZIndex = el.style.zIndex;
el.style.zIndex = 9999; 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) { function applyDelta(dx, dy) {
curWidth = Math.max(8, Math.min(SCENE_WIDTH - left, curWidth + dx)); curWidth = Math.max(8, curWidth + dx);
curHeight = Math.max(8, Math.min(SCENE_HEIGHT - top, curHeight + dy)); curHeight = Math.max(8, curHeight + dy);
el.style.width = curWidth + 'px'; el.style.width = curWidth + 'px';
el.style.height = curHeight + 'px'; el.style.height = curHeight + 'px';
} }