Aller au contenu principal

Session 132duodecimus (suite 7 etape B) — Animation de tir (recoil)

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 depuis numFrames / durationSec, met looping=false et active
    oneShotReturnToIdle
  • controlUpdate() : a la derniere frame, si oneShotReturnToIdle est
    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 + setter setWeaponView()
  • Dans update() apres consumeAmmo() : 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 < 2 dans 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)

Laisser un commentaire

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