Fix "à la collision" qui ne se déclenchait jamais
Cause réelle : un objet portant une règle de collision est presque toujours AUSSI un obstacle solide (collision activée par défaut, voir forgeWouldCollide, personnage-controller.js) — le déplacement du joueur est donc bloqué PILE au contact, sans jamais laisser les deux boîtes se chevaucher réellement. Le déclencheur "collision" testait un chevauchement STRICT (forgeShapesOverlap nu), qui n'était donc jamais atteint : la règle ne se déclenchait jamais en jeu réel, malgré un contact visible à l'écran. Le déclencheur teste maintenant la boîte de l'objet élargie d'une petite marge (3px) — assez pour détecter un simple contact — SANS toucher au blocage physique du déplacement (resté strict, inchangé). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
5e17e42dfa
commit
3a67ba622b
@@ -49,7 +49,7 @@ function rect(left, top, width, height) {
|
||||
return { left, top, width, height, right: left + width, bottom: top + height, shape: 'rectangle' };
|
||||
}
|
||||
|
||||
test('forgeCollisionRuleTriggerActive — trigger "collision" : vrai seulement si les boîtes se chevauchent', () => {
|
||||
test('forgeCollisionRuleTriggerActive — trigger "collision" : vrai si les boîtes se chevauchent, faux si loin', () => {
|
||||
const objRect = rect(0, 0, 20, 20);
|
||||
const overlapping = rect(10, 10, 20, 20);
|
||||
const far = rect(200, 200, 20, 20);
|
||||
@@ -57,6 +57,18 @@ test('forgeCollisionRuleTriggerActive — trigger "collision" : vrai seulement s
|
||||
assert.equal(forgeCollisionRuleTriggerActive({ trigger: 'collision' }, objRect, far), false);
|
||||
});
|
||||
|
||||
test('forgeCollisionRuleTriggerActive — trigger "collision" : vrai aussi pour un simple CONTACT (bords qui se touchent sans se chevaucher)', () => {
|
||||
// Bug corrigé : cet objet est presque toujours aussi un obstacle
|
||||
// SOLIDE (forgeWouldCollide, personnage-controller.js) — le joueur ne
|
||||
// peut donc jamais dépasser un contact tangent, et un chevauchement
|
||||
// STRICT n'était donc jamais atteint : "à la collision" ne se
|
||||
// déclenchait jamais en jeu réel. objRect va de x=[20,40], playerRect
|
||||
// juste à côté en x=[0,20] : bord à bord, AUCUN chevauchement géométrique.
|
||||
const objRect = rect(20, 0, 20, 20);
|
||||
const touchingPlayer = rect(0, 0, 20, 20);
|
||||
assert.equal(forgeCollisionRuleTriggerActive({ trigger: 'collision' }, objRect, touchingPlayer), true);
|
||||
});
|
||||
|
||||
test('forgeCollisionRuleTriggerActive — trigger "perimetre" : distance entre centres <= perimetre_px', () => {
|
||||
const objRect = rect(0, 0, 10, 10); // centre (5,5)
|
||||
const near = rect(10, 0, 10, 10); // centre (15,5) -> distance 10
|
||||
|
||||
Reference in New Issue
Block a user