Some help with b3d animations, please?

Blitz3D Forums/Blitz3D Programming/Some help with b3d animations, please?

Newbie31(Posted 2012) [#1]
heyo,

I'm having some trouble with changing animations [between Idle, Walk and Run].

My code is a follows:


This works fine, but all it does is animates an Idle animation when standing still and walking when [W] is depressed.

I tried to add a third sequence with:



This doesn't work, it changes between animations but doesn't stop animating when the button is released.

I also tried to add a variable "seq%" in my For/next loop where I animate the root node. eg.



but altering the "seq%" outside of the function didn't change the animseq. And if I tried to put "If Keydown()" in the function I get an error.

Any Help would be appreciated. Any Ideas?


RemiD(Posted 2013) [#2]
Hello,

I don't have time to correct your code but i used these commands, this way :
;to load the animations of the character :
HumanMaleXMesh = LoadAnimMesh("Cosmonaut MaterialedRiggedAnimated 2012.04.03 14h49m.b3d")
ScaleEntity(HumanMaleXMesh,0.099,0.099,0.099)
PositionEntity(HumanMaleXMesh,0,0,0)
HideEntity(HumanMaleXMesh)

Global HumanMaleSeqStandIdle = ExtractAnimSeq(HumanMaleXMesh,1,1)
Global HumanMaleSeqRunForward = ExtractAnimSeq(HumanMaleXMesh,5,21)
Global HumanMaleSeqRunBackWard = ExtractAnimSeq(HumanMaleXMesh,5,21)
Global HumanMaleSeqJump = ExtractAnimSeq(HumanMaleXMesh,39,43)
Global HumanMaleSeqFall = ExtractAnimSeq(HumanMaleXMesh,43,43)
;Global HumanMaleSeqLandGravityLow = ExtractAnimSeq(HumanMaleXMesh,43,66)
Global HumanMaleSeqLand = ExtractAnimSeq(HumanMaleXMesh,43,66)
;Global HumanMaleSeqLandGravityHigh = ExtractAnimSeq(HumanMaleXMesh,43,66)
Global HumanMaleSeqPickUpItem = ExtractAnimSeq(HumanMaleXMesh,43,66)

;to init the different possible states :
;PositionState
Const OnGround% = 30
Const OnAir% = 31
Const OnWall% = 32

;MovementState
; OnGround
   Const Idle% = 40
   Const WalkForward% = 41
   Const WalkBackward% = 42
   Const RunForward% = 43
   Const RunBackward% = 44
   ;Const SprintForward% = 45
   ;Const SprintBackward% = 46
   ;Const CrouchForward% = 47 
   ;Const CrouchBackward% = 48
   ;Const SlideForward% = 49 
   ;Const SlideBackward% = 50
   Const Jump% = 51   
   ;Const Interact% = 52 ;(interuptor, Handle, furniture, Object, weapon, device, vehicle, character)
   ;Const Fight% = 53
; OnAir
   Const Fall% = 54
   Const Land% = 55 ;(slow, average, fast)
; OnWall
   Const Grab% = 56 ;(knee height, hip height, shoulder height, hands above head height)
   Const Climb% = 57 ;(flat platform,ladder, grid, net, gouti�re, poteau, trunk, rope, cable)
   Const Letgo% = 58

;to update the animations depending on the character state:
For ChaId% = 1 To CharactersCount%
  If(CharacterPositionState%(ChaId%) = OnWall%)
   ;
  ElseIf(CharacterPositionState%(ChaId%) = OnGround%)
   RotateEntity(CharacterFeet(ChaId%),0,CharacterYaw#(ChaId%),0)
   If(CharacterMovementState%(ChaId%) = Idle%)
    CharacterMovementSpeed#(ChaId%) = 0
    ;Seq StandIdle
    If(AnimSeq(CharacterMesh(ChaId%)) <> HumanMaleSeqStandIdle)
     Animate(CharacterMesh(ChaId%),1,0.1*SpeedCoeff#,HumanMaleSeqStandIdle)
    EndIf
   ElseIf(CharacterMovementState%(ChaId%) = RunForward%)
    CharacterMovementSpeed#(ChaId%) = 0.1*SpeedCoeff#
    ;Seq RunForward
    If(AnimSeq(CharacterMesh(ChaId%)) <> HumanMaleSeqRunForward)
     Animate(CharacterMesh(ChaId%),1,0.2*SpeedCoeff#,HumanMaleSeqRunForward)
    EndIf
   ElseIf(CharacterMovementState%(ChaId%) = RunBackward%)
    CharacterMovementSpeed#(ChaId%) = -0.1*SpeedCoeff#
    ;Seq RunBackward
    If(AnimSeq(CharacterMesh(ChaId%)) <> HumanMaleSeqRunBackward)
     Animate(CharacterMesh(ChaId%),1,0.2*SpeedCoeff#,HumanMaleSeqRunBackward)
    EndIf
   ElseIf(CharacterMovementState%(ChaId%) = Jump%)
    CharacterJumpState%(ChaId%) = 1
    CharacterJumpSpeed#(ChaId%) = 0.2*SpeedCoeff#  
    ;Seq Jump
    If(AnimSeq(CharacterMesh(ChaId%)) <> HumanMaleSeqJump)
     Animate(CharacterMesh(ChaId%),3,0.2*SpeedCoeff#,HumanMaleSeqJump)
    EndIf 
   ElseIf(CharacterMovementState%(PId%) = Land%)
    ;Seq Land	
    If(AnimSeq(CharacterMesh(ChaId%)) <> HumanMaleSeqLand)
     Animate(CharacterMesh(ChaId%),3,1.0*SpeedCoeff#,HumanMaleSeqLand)
    EndIf
    If(AnimTime(CharacterMesh(ChaId%)) = 23)			
     CharacterLandState%(ChaId%) = 0
    EndIf	 
   EndIf
  ElseIf(CharacterPositionState%(ChaId%) = OnAir%)
   TranslateEntity(CharacterFeet(ChaId%),CharacterVX#(ChaId%),0,CharacterVZ#(ChaId%))
   CharacterGravitySpeed#(ChaId%) = CharacterGravitySpeed#(ChaId%) - Gravity#*SpeedCoeff#
   CharacterVY#(ChaId%) = CharacterJumpSpeed#(ChaId%) + CharacterGravitySpeed#(ChaId%)
   TranslateEntity(CharacterFeet(ChaId%),0,CharacterVY#(ChaId%),0)
   ;Seq Fall
    If(AnimSeq(CharacterMesh(ChaId%)) <> HumanMaleSeqFall)
     Animate(CharacterMesh(ChaId%),3,1.0*SpeedCoeff#,HumanMaleSeqFall)
    EndIf
  EndIf
 Next


Please note this is an old code, so it can probably be improved but maybe it can help you.

PS : forget about the symbols "%" "#" "$", they are needed only when you create a new variable but not everywhere like in this code, this is an old bad habit that i had.

Last edited 2013