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
-
combat/AlienShot.java: nouveau champanimFrame(=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 dansrelease(). -
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 surchargecreateBilletBoard(AlienShot, BulletDef)qui
delegue a la meme methode.
–updateAnimation(PlayerShot)decoupe en 2 helpers :computeNextFrame
(calcul de l’index de frame selon le lifetime) etapplyFrameTexture
(upload de la texture sur la geometry).
– Nouvelle surchargeupdateAnimation(AlienShot)qui partage les 2
helpers. -
combat/BulletUpdateSystem.java: ajout d’un getter
getSpriteRenderer()pour permettre aGameAppStatede 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). -
combat/AlienBulletUpdateSystem.java:
– Nouveau champspriteRenderer+ settersetSpriteRenderer().
– Dansupdate(): 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 quandshot.power == 0(= splat bits
gore, ASM-fidele anewanims.s:605qui poseShotT_Power_w = 0).
Permet aux 7 bits de mort d’etre visibles meme si l’alien est tue a
bout portant. -
app/GameAppState.java: cablage danssetupPhysics(). Apres la
creation dealienBulletUpdateSystem, on recupere leBulletSpriteRenderer
deja attache aubulletUpdateSystem(pool joueur) viagetSpriteRenderer()
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 viaStatus_b=1(= « popping »)
combine aBulT_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 :
playPositionalSoundtoujours no-op.