Symptômes (après session 101)
- Les portes présentaient toujours l’effet « découpé » : panneau chevron en
haut, bande noire au milieu, panneau chevron en bas. La fusion par edge
de la session 101 était insuffisante car les segments étaient en réalité
des walls distincts (un ZDoorWall étroit + un linteau séparé +
parfois un step-wall en bas), pas plusieurs ZDoorWalls sur le même edge. - Le lift de level A apparaissait comme une cabine totalement fermée
(chevrons sur les 4 côtés) : le joueur arrivait à l’étage et restait
prisonnier. Leslift_side_*créés en session 99 étaient appliqués sur
TOUS les côtés du polygone, y compris les ouvertures de la cabine.
Fix portes : extension à la hauteur du couloir
Dans LevelSceneBuilder.buildScene, quand un wall est détecté comme
ZDoorWall, on crée maintenant le panneau à la hauteur complète du
couloir (yF/yR = sol/plafond de la zone courante), pas à la hauteur
limitée du wall original.
// Avant :
final float fSegBot = yBot; // = -botWallH/SCALE (hauteur du ZDoorWall)
final float fSegTop = yTop;
// Après :
final float fSegBot = yF; // sol du couloir (zone courante)
final float fSegTop = yR; // plafond du couloir
Conséquence : le panneau couvre toute l’ouverture quand fermé, cachant
le linteau et le step-wall qui auraient pu rester visibles. Quand ouvert,
l’ouverture est complète du sol au plafond.
Fix portes (suite) : skip des walls statiques sur les edges-portes
Après extension du panneau, il faut empêcher les linteaux/step-walls de
se rendre par-dessus. On précalcule doorEdgesGlobal (Set de tous les
edges porteurs d’au moins un ZDoorWall) puis on skip dans la boucle des
walls :
int wallEid2 = findEdgeIdForSegment(lpi, rpi, pts, edgesFull, z.edgeIds());
if (wallEid2 >= 0 && doorEdgesGlobal.contains(wallEid2)) continue;
Résultat : un seul panneau plein par edge-porte, pas de doublon visuel.
Fix lifts : skip des sides sur les ouvertures de cabine
La méthode parseLiftWallEdges(json) ajoutée à la session 100 est
maintenant utilisée. Lors de la création des lift_side_*, on garde
un tableau parallèle sideEdgeIds[] indexant les edgeIds, puis :
int sideEid = (i < sideEdgeIds.size()) ? sideEdgeIds.get(i) : -1;
if (sideEid > 0 && liftWallEdges.contains(sideEid)) continue;
Conséquence : les côtés correspondant aux passages couloir↔cabine ne
reçoivent pas de paroi solide. Le joueur peut entrer/sortir librement.
Pour tester
./gradlew buildScenes run
Zones à vérifier :
– Porte zone 5 (entrée level A) : panneau plein chevron, glissement
uniforme vers le haut, plus de bande noire au milieu.
– Lift zone 104 : la cabine doit avoir une (ou plusieurs) ouverture
visible correspondant aux edges 500, 510 (les 2 portes du lift).
Le joueur doit pouvoir entrer et ressortir.
– Porte zone 30 (6 walls) et zone 132 (rouge, large) : panneau
uniforme, glissement complet du sol au plafond.
Note sur « la porte 130 ne s’ouvre pas progressivement en approche »
Le symptôme peut venir de l’openSpeed du binaire (zone 132 rouge a
openSpeed=4, soit ~7 secondes pour s’ouvrir complètement) ou d’un
triggerDist insuffisant. Avec ce fix, le panneau étendu est plus haut,
ce qui peut affecter la distance perçue. À retester après buildScenes.
Si le problème persiste, on inspectera la zone exacte dans le JSON.
Fichiers modifiés
tools/LevelSceneBuilder.java:- ajout calcul
doorEdgesGlobal(set tous edges porte) - extension panneau ZDoorWall à la hauteur couloir (yF/yR)
- ajout skip des walls statiques sur edges-portes
- tracking
sideEdgeIds[]parallèle aux coords du polygone lift - ajout skip des sides du lift sur
liftWallEdges