Probleme
Les armes ne jouaient aucune animation au tir. La methode playFireAnimation()
existait dans WeaponViewAppState mais n’etait jamais appelee depuis
PlayerShootSystem. De plus, son implementation laissait l’arme figee sur la
derniere frame au lieu de revenir a la pose idle.
Reference ASM (newplayershoot.s)
Au tir, dans le label .okcanshoot :
move.w ShootT_Delay_w(a6), Plr1_TimeToShoot_w ; cooldown
move.b MaxFrame, Plr1_GunFrame_w ; init frame anim
Puis Plr1_GunFrame_w decremente a chaque tick jusqu’a 0 (= idle). La duree
totale de l’anim correspond donc au cooldown de l’arme.
Solution
Mode « one-shot return-to-idle » dans VectObjFrameAnimControl : joue de la
frame 0 a la derniere puis revient automatiquement a la frame 0 et stoppe.
La duree est calee sur ShootDef.delay() (cooldown ASM en frames @ 25 Hz),
ce qui assure que l’anim a fini juste avant le prochain tir possible.
Fichiers modifies
world/VectObjFrameAnimControl.java:- Nouveau champ
oneShotReturnToIdle(default false) - Nouvelle methode
playFireAnimation(float durationSec): initialise
fps depuisnumFrames / durationSec, metlooping=falseet active
oneShotReturnToIdle controlUpdate(): a la derniere frame, sioneShotReturnToIdleest
actif, reset a frame 0 et stoppe la lecture-
cloneForSpatial(): preserve le nouveau champ -
weapon/WeaponViewAppState.java: playFireAnimation(float durationSec): delegue a
VectObjFrameAnimControl.playFireAnimation()sur toutes les Geometry
animees du modele-
playFireAnimation()(sans param) marque@Deprecated(compat) -
combat/PlayerShootSystem.java: - Nouveau champ
weaponView+ settersetWeaponView() -
Dans
update()apresconsumeAmmo(): appelle
weaponView.playFireAnimation(shoot.delay() / 25f) -
app/GameAppState.java: - Cable
shootSystem.setWeaponView(weaponView)apres la creation des
deux composants
Comportement attendu
- A chaque tir, l’arme joue son animation de recul de la frame 0 a la fin,
puis revient a frame 0 (pose idle). - Pour tir rapide (cooldown court), l’animation se replay des le coup
suivant si elle n’avait pas fini. - Pour les armes sans animation (
numFrames < 2dans le vectobj), aucun
effet visuel (pas d’erreur). - La duree d’anim varie par arme via
ShootDef.delay(): - Plasma (rapide) : ~6 frames Amiga = 0.24s
- Shotgun (lent) : ~30 frames Amiga = 1.2s
- Etc.
Etapes restantes
- C : animation de selection (raise) + correction du viseur sniper
- D : sprite specifique mine + comportement (pose au sol, declenchement)