Aller au contenu principal

Session 132duodecimus (suite 13e) — Phase C portes : exclure le plafond mobile de la collision

Bug fix : porte intraversable meme ouverte

Bug observe Fix
Joueur ne peut pas passer la porte meme ouverte Exclure le faceType=bottom de createMeshShape

Cause racine

La logique canPass etait theoriquement correcte (currentRoofY <
corridorFloorY - PLAYER_HEIGHT - 0.05
), et le PhysicsSpace.remove(rbc)
etait bien appele a l’ouverture. Mais :

Dans s13b, le shape de collision Bullet etait construit via :

CollisionShape shape = CollisionShapeFactory.createMeshShape(doorNode);

doorNode contient TOUS les enfants :
– Les panneaux verticaux (faceType="front") — attendus, ils bloquent
Le plafond mobile (faceType="bottom") — polygonal horizontal qui
couvre toute la zone-porte. Au repos il est PLAQUE AU SOL de la zone-
porte (= sol du couloir). C’est exactement la zone que le joueur veut
traverser !

Donc le shape Bullet incluait un grand triangle-fan horizontal au sol,
juste devant la porte, qui bloquait le mouvement horizontal du joueur
independamment des panneaux verticaux. Quand on retirait rbc du
PhysicsSpace, on retirait tout (panneaux + sol), donc en theorie c’etait
bon — mais le rbc restait dans le space si jamais le joueur etait deja
dessus, ou si la collision avait deja ete poussee dans le solveur.

Fix : creer le shape uniquement a partir des panneaux

Dans setSpatial, avant createMeshShape :

  1. Detacher temporairement tous les enfants dont faceType != "front"
  2. Construire le shape sur le doorNode reduit (uniquement panneaux)
  3. Rattacher les enfants detaches (dans un finally pour gerer les erreurs)
for (Spatial child : doorNode.getChildren()) {
    String ft = child.getUserData("faceType");
    if (ft != null && !"front".equals(ft)) detached.add(child);
}
for (Spatial s : detached) doorNode.detachChild(s);
try {
    CollisionShape shape = CollisionShapeFactory.createMeshShape(doorNode);
    // ... add control + add to PhysicsSpace
} finally {
    for (Spatial s : detached) doorNode.attachChild(s);
}

Effet

La collision Bullet de chaque porte n’inclut plus que les panneaux
verticaux
(4 vertices, 2 triangles par seg). C’est :
– Suffisant pour bloquer le joueur quand la porte est fermee
– Permet au joueur de traverser quand la porte ouvre (rbc retire et
espace horizontal libre, plus aucun mesh au sol pour bloquer)

Fichiers modifies

  • DoorControl.java : detacher/rattacher les enfants bottom autour
    de createMeshShape dans setSpatial.

Tests prevus

  • Approcher la porte zone 5 : elle s’ouvre.
  • Marcher dessous : le joueur doit passer librement.
  • Reculer : la porte se referme apres le delai, joueur a nouveau bloque.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *