Fix bulle "Appuie sur X" invisible + retire Attaque/Événement du picker
Bug corrigé : la bulle "Appuie sur X" était ajoutée comme ENFANT de l'objet de scène (un <img> pour "personnage"/"decor"/"fond") — un élément REMPLACÉ dont les enfants DOM ajoutés en JS ne sont JAMAIS affichés par un navigateur, quel que soit son CSS. La bulle existait donc bien dans le DOM (aucune erreur) mais restait invisible à l'écran. Elle est maintenant ajoutée comme SŒUR de l'objet dans son parent (.sceneWorld/.sceneUI), positionnée en JS aux mêmes coordonnées. Assistant "+ Action" de l'éditeur de collision : "⚔️ Attaquer la cible" et "📣 Déclencher un événement" retirés des choix proposés (pas besoin pour le moment) — le serveur continue d'accepter/d'exécuter une règle déjà enregistrée avec l'un des deux, rien ne casse pour l'existant. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
726775fe4e
commit
00f9cf33e9
@@ -74,24 +74,41 @@ function forgeCollisionRuleTriggerActive(rule, objRect, playerRect) {
|
||||
return dist <= (rule.perimetre_px || 0);
|
||||
}
|
||||
|
||||
function forgeCollisionInteractBubbleEl(objectEl) {
|
||||
var bubble = objectEl.querySelector('.collisionInteractBubble');
|
||||
// La bulle "Appuie sur X" ne peut PAS être un enfant de objectEl : un
|
||||
// objet de scène (voir render_scene_object.py) est un <img> tout simple
|
||||
// pour "personnage"/"decor"/"fond" — un élément REMPLACÉ, sans modèle de
|
||||
// contenu, dont les enfants ajoutés en DOM ne sont JAMAIS affichés par
|
||||
// un navigateur (bug corrigé : la bulle existait bien dans le DOM mais
|
||||
// restait invisible). Ajoutée comme SŒUR de objectEl (dans son parent,
|
||||
// déjà position:relative — .sceneWorld/.sceneUI, voir static/style.css),
|
||||
// positionnée en JS aux mêmes coordonnées que l'objet.
|
||||
function forgeCollisionInteractBubbleEl(objectId, parentEl) {
|
||||
var bubble = parentEl.querySelector('.collisionInteractBubble[data-for-object-id="' + objectId + '"]');
|
||||
if (!bubble) {
|
||||
bubble = document.createElement('div');
|
||||
bubble.className = 'collisionInteractBubble';
|
||||
objectEl.appendChild(bubble);
|
||||
bubble.setAttribute('data-for-object-id', objectId);
|
||||
parentEl.appendChild(bubble);
|
||||
}
|
||||
return bubble;
|
||||
}
|
||||
|
||||
function forgeShowCollisionInteractBubble(objectEl, key) {
|
||||
var bubble = forgeCollisionInteractBubbleEl(objectEl);
|
||||
function forgeShowCollisionInteractBubble(objectEl, objectId, key) {
|
||||
var parentEl = objectEl.parentElement;
|
||||
if (!parentEl) return;
|
||||
var bubble = forgeCollisionInteractBubbleEl(objectId, parentEl);
|
||||
bubble.textContent = 'Appuie sur ' + key;
|
||||
bubble.style.display = 'block';
|
||||
var left = parseFloat(objectEl.style.left) || 0;
|
||||
var top = parseFloat(objectEl.style.top) || 0;
|
||||
var width = parseFloat(objectEl.style.width) || 0;
|
||||
bubble.style.left = (left + width / 2) + 'px'; // centrée horizontalement (voir transform:translateX(-50%), static/style.css)
|
||||
bubble.style.top = top + 'px'; // AU-DESSUS de l'objet (voir transform:translateY(-100%), static/style.css)
|
||||
}
|
||||
|
||||
function forgeHideCollisionInteractBubble(objectEl) {
|
||||
var bubble = objectEl.querySelector('.collisionInteractBubble');
|
||||
function forgeHideCollisionInteractBubble(objectId, objectEl) {
|
||||
var parentEl = objectEl && objectEl.parentElement;
|
||||
var bubble = parentEl && parentEl.querySelector('.collisionInteractBubble[data-for-object-id="' + objectId + '"]');
|
||||
if (bubble) bubble.style.display = 'none';
|
||||
}
|
||||
|
||||
@@ -141,7 +158,7 @@ function forgeCollisionRuleTick(screenData) {
|
||||
if (rule.action.type === 'interagir') {
|
||||
if (isActive) {
|
||||
anyInteractActive = true;
|
||||
forgeShowCollisionInteractBubble(targetEl, (player.personnage_commandes && player.personnage_commandes.interagir) || 'E');
|
||||
forgeShowCollisionInteractBubble(targetEl, obj.id, (player.personnage_commandes && player.personnage_commandes.interagir) || 'E');
|
||||
}
|
||||
forgeCollisionRuleActiveState[stateKey] = isActive;
|
||||
return;
|
||||
@@ -150,7 +167,7 @@ function forgeCollisionRuleTick(screenData) {
|
||||
if (isActive && !wasActive) forgeRunCollisionRuleAction(rule.action, targetEl, obj);
|
||||
forgeCollisionRuleActiveState[stateKey] = isActive;
|
||||
});
|
||||
if (!anyInteractActive) forgeHideCollisionInteractBubble(targetEl);
|
||||
if (!anyInteractActive) forgeHideCollisionInteractBubble(obj.id, targetEl);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user