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 <), et le
corridorFloorY - PLAYER_HEIGHT - 0.05PhysicsSpace.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 :
- Detacher temporairement tous les enfants dont
faceType != "front" - Construire le shape sur le doorNode reduit (uniquement panneaux)
- Rattacher les enfants detaches (dans un
finallypour 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 enfantsbottomautour
decreateMeshShapedanssetSpatial.
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.