Aller au contenu principal

Session 113 — Phase 2.E : animations sprites 4-directionnelles

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 :

  1. countSpriteFrames utilisait assetManager.locateAsset(TextureKey),
    qui emet un warning JME pour CHAQUE fichier non trouve. Avec une boucle
    0..32, ca polluait les logs au load.
  2. AlienSpriteController.loadFrame : le cache utilisait
    Map.get() != null pour decider si une frame etait cachee. Comme on
    cache null pour les frames absentes, le test echouait et on retentait
    le loadTexture a 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 : utilise Map.containsKey pour
    distinguer « absent du cache » de « cache avec valeur null ».

Fichiers modifies (5)

  1. src/main/java/com/ab3d2/core/ai/AlienAI.java :
    doDefault : ajout timer2 += frames + bornage
    doFollowup : meme ajout
    prowlRandom : utilise prowlTicker au lieu de timer3
  2. src/main/java/com/ab3d2/core/ai/AlienRuntimeState.java : ajout
    du champ public int prowlTicker
  3. src/main/java/com/ab3d2/core/ai/AlienAnimTable.java : divisors
    ajustes (6 -> 12 walk, 4 -> 8 attack)
  4. src/main/java/com/ab3d2/world/AlienControlSystem.java :
    countSpriteFrames utilise Files.exists au lieu de
    assetManager.locateAsset
  5. src/main/java/com/ab3d2/world/AlienSpriteController.java :
    loadFrame utilise Map.containsKey pour 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 = 0 et verifie a.prowlTicker > 0 apres update.

Resultat attendu apres fixes

  1. Plus de Cannot locate resource: en boucle dans les logs.
  2. Animation de marche visible : 4 frames qui se succedent ~1 par 250ms
    (cycle complet en 1 sec, lisible a l’oeil).
  3. Alien qui change correctement de viewpoint quand on tourne autour.
  4. La fade de mort n’est plus interrompue par un changement de direction
    prowl.

Laisser un commentaire

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