Aller au contenu principal

Session 135bis — Sprites Splutch reels (BulletSpriteRenderer sur pool alien)

Resume

Finition du splash de mort : les 7 bits de gore qui spawnent quand un alien
meurt utilisent maintenant les vrais sprites animes Splutch1-4 du WAD
plutot que les spheres colorees placeholder. Le BulletSpriteRenderer
existant (deja branche sur le pool joueur) est mutualise pour servir aussi
le pool alien (= AI_AlienShotDataPtr_l ASM).

Benefices :
– Les bits affichent les vraies frames du WAD splutch (animation gore
authentique Amiga).
– Le sizing automatique via byte 2 de la frame (scale * AMIGA_SIZE_TO_JME)
donne des taches proportionnees au gibier.
– Le blending alpha gere les pixels transparents naturellement (plus de
carres opaques visibles).

Les splat bits sont desormais marques power=0 (= ShotT_Power_w = 0
ASM dans newanims.s:605) et le test de collision joueur est skippe pour
ces bits : ils ne peuvent ni faire de damage ni s’effacer en effleurant
le joueur. Comportement ASM-fidele : les bits sont du pur effet visuel.

Fichiers modifies

  1. combat/AlienShot.java : nouveau champ animFrame (= ShotT_Anim_b
    ASM) pour suivre la frame courante du billboard et eviter de re-uploader
    la texture quand elle n’a pas change. Reset a -1 dans release().

  2. combat/BulletSpriteRenderer.java : refactor pour partager le code
    entre les 2 pools (joueur et alien).
    createBilletBoard(PlayerShot, BulletDef) delegue a une methode privee
    createBilletBoardInternal(int bulletType, float posX, float posY,
    float posZ, BulletDef def)
    .
    Nouvelle surcharge createBilletBoard(AlienShot, BulletDef) qui
    delegue a la meme methode.
    updateAnimation(PlayerShot) decoupe en 2 helpers : computeNextFrame
    (calcul de l’index de frame selon le lifetime) et applyFrameTexture
    (upload de la texture sur la geometry).
    Nouvelle surcharge updateAnimation(AlienShot) qui partage les 2
    helpers.

  3. combat/BulletUpdateSystem.java : ajout d’un getter
    getSpriteRenderer() pour permettre a GameAppState de partager le
    renderer cree pour le pool joueur avec le pool alien (= une seule
    instance pour les 2, evite les doublons d’atlas et de cache).

  4. combat/AlienBulletUpdateSystem.java :
    – Nouveau champ spriteRenderer + setter setSpriteRenderer().
    – Dans update() : si le renderer est branche, on tente d’abord
    createBilletBoard(shot, def) ; en cas d’echec (def sans AnimData, etc.)
    on retombe sur le placeholder sphere. Apres le mouvement, on appelle
    updateAnimation(shot) pour avancer le sprite.
    – Test collision joueur : skippe quand shot.power == 0 (= splat bits
    gore, ASM-fidele a newanims.s:605 qui pose ShotT_Power_w = 0).
    Permet aux 7 bits de mort d’etre visibles meme si l’alien est tue a
    bout portant.

  5. app/GameAppState.java : cablage dans setupPhysics(). Apres la
    creation de alienBulletUpdateSystem, on recupere le BulletSpriteRenderer
    deja attache au bulletUpdateSystem (pool joueur) via getSpriteRenderer()
    et on le branche sur le systeme alien.

Comment tester

Pas de rebuild scene necessaire (les .j3o ne sont pas modifies par cette
session). Lancer directement :

./gradlew run

Niveau A, tuer un Red Alien : les 7 bits doivent etre des sprites Splutch
animes (frames qui defilent au cours du vol) au lieu de spheres rouges
uniformes. Si on tue l’alien a bout portant, les bits qui partent vers le
joueur ne disparaissent plus instantanement.

Limitations connues / TODO restants

  • Splat bits qui s’enfoncent dans le sol : actuellement les bits meurent
    au raycast mur quand ils touchent le sol. Pour les laisser comme « taches
    permanentes au sol », il faudrait un sous-systeme dedie qui les colle a
    la geometrie. C’est ce que fait l’ASM via Status_b=1 (= « popping »)
    combine a BulT_PopData_vb (anim d’impact). Ce n’est pas encore porte
    pour les splat bits ; ils disparaissent au sol comme les autres bullets.
  • Boss spawning (splatType >= 20) : TODO non aborde cette session.
  • Son final scream : playPositionalSound toujours no-op.

Laisser un commentaire

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