This time saving function will loop a certain animation ( currently idle,die,hit,move,attack ) for any monster, and can also check if the animation is already playing, or check which animation is playing.

The animation rule it follows is idle, die, hit, move, attack. (ie the monsters are appended in that order)

How to use it:

  • ani(monster, animation, play/playing)
  • to loop animation, ani(1,idle,play) < will loop the monster's idle animation
  • to check if a certain animation is playing, ani(1,die,playing) < will return 1 if playing and 0 if playing.
  • to find out what animation is playing, ani(1,0,playing) < will return what animation is playing

Notes

I have discovered that the DarkMatter models' (which i use for this example) movement animation does not loop properly because of an extra 5 frames at the beginning of the animation. if you look down through the ani() function, you will see that i have +5 to the looping of the movement animation. As you can see, the function is very specified by my mon(monster).types monster system. Feel free to change this if it does not suit you.

Give me a holler in the credits if you found this function useful! =)

Language: 
Dark Basic Pro
Code: 
sync on: sync rate 100

`I use this system for my monsters, and the ani() function is easily changed to suit your system
type monster
  ani_die as integer
  ani_hit as integer
  ani_move as integer
  ani_attack as integer
  model as integer
endtype

`just two monsters for this example
dim mon(2) as monster
mon(1).model = 1
mon(2).model = 2

`******Necessary variables******
global idle as integer : idle = 1
global die as integer : die = 2
global hit as integer : hit = 3
global move as integer : move = 4
global attack as integer : attack = 5

global playing as integer : playing = 1
global play as integer : play = 2
`****** End Necessary variables******

load object "res/models/enemies/alien hivebrain/H-Alien Hivebrain-Idle.x",mon(1).model
mon(1).ani_die = total object frames(mon(1).model)+1
append object "res/models/enemies/alien hivebrain/H-Alien Hivebrain-Die.x",mon(1).model,mon(1).ani_die
mon(1).ani_hit = total object frames(mon(1).model)+1
append object "res/models/enemies/alien hivebrain/H-Alien Hivebrain-Impact.x",mon(1).model,mon(1).ani_hit
mon(1).ani_move = total object frames(mon(1).model)+1
append object "res/models/enemies/alien hivebrain/H-Alien Hivebrain-Move.x",mon(1).model,mon(1).ani_move
mon(1).ani_attack = total object frames(mon(1).model)+1
append object "res/models/enemies/alien hivebrain/H-Alien Hivebrain-Attack1.x",mon(1).model,mon(1).ani_attack

load object "res/models/enemies/android/L-Android-Idle.x",mon(2).model
mon(2).ani_die = total object frames(mon(2).model)+1
append object "res/models/enemies/android/L-Android-Die.x",mon(2).model,mon(2).ani_die
mon(2).ani_hit = total object frames(mon(2).model)+1
append object "res/models/enemies/android/H-Android-Impact.x",mon(2).model,mon(2).ani_hit
mon(2).ani_move = total object frames(mon(2).model)+1
append object "res/models/enemies/android/L-Android-Move.x",mon(2).model,mon(2).ani_move
mon(2).ani_attack = total object frames(mon(2).model)+1
append object "res/models/enemies/android/L-Android-Attack1.x",mon(2).model,mon(2).ani_attack

spd = 20 `ideal speed in my opinion

position object mon(1).model,2,-2,0
position object mon(2).model,-2,-2,0


  do
    `just for convenience
    control camera using arrowkeys 0,0.2,1
    
    `i find having two sets of IF:THEN statements alot neater than having IF:ENDIF ones.
    if inkey$() = "1" then ani(1,idle,play)
    if inkey$() = "2" then ani(1,die,play)
    if inkey$() = "3" then ani(1,hit,play)
    if inkey$() = "4" then ani(1,move,play)
    if inkey$() = "5" then ani(1,attack,play)
    
    if inkey$() = "1" then ani(2,idle,play)
    if inkey$() = "2" then ani(2,die,play)
    if inkey$() = "3" then ani(2,hit,play)
    if inkey$() = "4" then ani(2,move,play)
    if inkey$() = "5" then ani(2,attack,play)
    
    `text to show you an aspect of the function
    text 0,0,"--alien hivebrain--"
    text 0,20,"die animation playing: "+str$(ani(1,die,playing))
    text 0,40,"rule: idle,die,hit,move,attack"
    text 0,60,"current animation playing: "+str$(ani(1,0,playing))
    
    sync
  loop

`rule: idle,die,hit,move,attack
function ani(mon,ani,mode)

   animation = 0

   if mode = play
      if ani = idle
         start = 1
         finish = mon(mon).ani_die-1
      endif

      if ani = die
         start = mon(mon).ani_die
         finish = mon(mon).ani_hit-1
      endif

      if ani = hit
         start = mon(mon).ani_hit
         finish = mon(mon).ani_move-1
      endif

      if ani = move
         start = mon(mon).ani_move + 5
         finish = mon(mon).ani_attack-1
      endif

      if ani = attack
         start = mon(mon).ani_attack
         finish = total object frames(mon(mon).model)
      endif

      loop object mon(mon).model,start,finish
   endif

   if mode = playing
      if object frame(mon(mon).model) < mon(mon).ani_die then animation = idle
      if object frame(mon(mon).model) > mon(mon).ani_die-1 and object frame(mon(mon).model) < mon(mon).ani_hit then animation = die
      if object frame(mon(mon).model) > mon(mon).ani_hit-1 and object frame(mon(mon).model) < mon(mon).ani_move then animation = hit
      if object frame(mon(mon).model) > mon(mon).ani_move-1 and object frame(mon(mon).model) < mon(mon).ani_attack then animation = move
      if object frame(mon(mon).model) > mon(mon).ani_attack-1 then animation = attack

      if ani>0
         if ani = animation
            animation = 1
         else
            animation = 0
         endif
      endif
   endif

endfunction animation
4
Average: 4 (1 vote)