Fixes apres test in-game (4)
Apres test in-game, le joueur a constate :
– « je ne vois pas car soit c’est trop rapide » : animation invisible en patrouille
– Avertissements Cannot locate resource: alien2_f19.png (Flipped) repetes en boucle
Quatre causes identifiees et corrigees :
Fix 1 : timer2 jamais incremente en mode DEFAULT/FOLLOWUP (root cause du « static »)
Dans core/ai/AlienAI.java::doDefault, le {@code timer2} (= driver de l’anim
de marche) n’etait jamais incremente. Resultat : pickFrame recevait
toujours timer2=0, donc affichait la frame 0 de la vue courante en
permanence. L’alien marchait visuellement comme une statue glissante.
Ajoute :
// Phase 2.E (fix) : incrementer timer2 chaque frame pour faire avancer
// l'animation de marche. Sans ca, l'alien reste fige sur la frame 0.
a.timer2 += frames;
if (a.timer2 > 100000) a.timer2 = a.timer2 % 24;
Meme fix dans doFollowup (sinon l’alien restait fige pendant la pause
apres une attaque).
Fix 2 : conflit timer3 prowl vs death
prowlRandom utilisait a.timer3 pour le tick de changement de direction.
Mais timer3 est aussi le compteur de fade-out de la mort (utilise dans
doDie et isDeadAndGone()). Resultat : un alien en train de mourir
pouvait « changer de direction » pendant son anim de mort.
Fix : ajout d’un nouveau champ {@code prowlTicker} dans AlienRuntimeState
dedie au prowl, separe de timer3. ASM-fidele : dans le binaire original,
les aliens utilisent un timer different pour le random walk vs la mort.
Fix 3 : animation trop rapide
WALK_TICK_DIVISOR=6 donnait ~10 frames/sec a 60Hz JME, ce qui faisait
un cycle complet en 0.5 sec – trop rapide pour qu’on identifie
visuellement les frames individuelles.
Ajuste a 12 (= ~4 frames/sec, cycle complet en 1 sec). Idem
ATTACK_TICK_DIVISOR 4 -> 8 pour les anims d’attaque.
Les tests JUnit AlienAnimTableTest ont ete mis a jour pour les nouvelles
valeurs.
Fix 4 : warnings JME repetes pour frames manquantes
Les avertissements guard_f21.png / alien2_f19.png etaient emis car :
countSpriteFramesutilisaitassetManager.locateAsset(TextureKey),
qui emet un warning JME pour CHAQUE fichier non trouve. Avec une boucle
0..32, ca polluait les logs au load.AlienSpriteController.loadFrame: le cache utilisait
Map.get() != nullpour decider si une frame etait cachee. Comme on
cachenullpour les frames absentes, le test echouait et on retentait
leloadTexturea chaque appel (= warning JME chaque fois).
Deux corrections :
AlienControlSystem.countSpriteFrames: maintenant teste l’existence via
Files.exists()sur le filesystem directement (silencieux), au lieu de
passer par JME.AlienSpriteController.loadFrame: utiliseMap.containsKeypour
distinguer « absent du cache » de « cache avec valeur null ».
Fichiers modifies (5)
src/main/java/com/ab3d2/core/ai/AlienAI.java:
–doDefault: ajouttimer2 += frames+ bornage
–doFollowup: meme ajout
–prowlRandom: utiliseprowlTickerau lieu detimer3src/main/java/com/ab3d2/core/ai/AlienRuntimeState.java: ajout
du champpublic int prowlTickersrc/main/java/com/ab3d2/core/ai/AlienAnimTable.java: divisors
ajustes (6 -> 12 walk, 4 -> 8 attack)src/main/java/com/ab3d2/world/AlienControlSystem.java:
countSpriteFramesutiliseFiles.existsau lieu de
assetManager.locateAssetsrc/main/java/com/ab3d2/world/AlienSpriteController.java:
loadFrameutiliseMap.containsKeypour le cache
Tests mis a jour
AlienAnimTableTest: 12 tests mis a jour pour les nouveaux divisors
(frame 6 -> 12, 18 -> 36, 4 -> 8, etc.)AlienAITest::prowlMovesAlienWithoutControlPoints: utilise
a.prowlTicker = 0et verifiea.prowlTicker > 0apres update.
Resultat attendu apres fixes
- Plus de
Cannot locate resource:en boucle dans les logs. - Animation de marche visible : 4 frames qui se succedent ~1 par 250ms
(cycle complet en 1 sec, lisible a l’oeil). - Alien qui change correctement de viewpoint quand on tourne autour.
- La fade de mort n’est plus interrompue par un changement de direction
prowl.