Hey all,
My first post on this forum...so here goes nothing!
I was wondering if there was an elegant way of doing sprite based animations using BlitzMax? I have a series of animated strips and was wondering if anyone has implemented a way to display them in blitz without using messy loops?
Lets say that, for instance, I have an animation loaded as such:
Global Test_Animation:Timage=LoadAnimImage("images/testanim.png",190,187,0,4)
Is there a way to invoke the animation by telling Blitz to play frames in the order of 0, 1, 0, 2, 0, 3, 0, 4 over a period of 2 seconds? Or would I have to code a methd to do this on my own?
Thanks!
That's gonna be a decidedly roll-yer-own type of thing...
You would have to code your own method.
Hey guys,
Thanks for the speedy replies.
Not really what I wanted to hear, but my thoughts have been confirmed. Looks like I have a long afternoon ahead of me! :)
something like this should do it.
type foo
field image:TImage =...
field animspeed:long = 60
field lasttime:long = 0
field curframe:int = 0
field frameorder:int[] = [0,1,0,2,2,3,4,5,0,2];
method update(curtime:long)
if curtime-lasttime>=animspeed then curframe:+1
if curframe>frameorder.length then curframe=0
lasttime = curtime
endmethod
method display()
drawimage image,x,y,frameorder[curframe]
endmethod
end type
Thanks Scott. I'll give it a try.
Hmmm...I've been working on my animation class this morning, and so far so good. The display method that Scott suggested doesnt seem to work properly though...
I tried debugging it by printing out the values of curtime - lasttime, but the values that I get are never really higher than 20. The animation that I'm testing needs a 250 millisecond gap between each frame. Any suggestions?
Hope this works, wrote it off the top of my head.
type TAnimation
Field Image:TImage, X:Int, Y:Int
Field Frames:Int[] = [0,1,2,2,1,0]
Field CurrFrame:int
Field AnimTimer:Int = Millisecs()
Field AnimSpeed:Int = 250
method Update()
if Millisecs() - AnimTimer > AnimSpeed then AnimTimer = Millisecs() ; CurrFrame:+1
If CurrFrame > Frames.Length - 1 then CurrFrame = 0
end method
method Render()
DrawImage Image,X,Y,Frames[CurrFrame]
end method
end type
Hey Helios!
Thanks for the quick reply!
Your Update() method seems to work as desired, but the Render() method that I have gives me an array out of bounds error :(
Here is the code that I have:
Method Display(xCoord:Int, yCoord:Int)
DrawImage strip, xCoord, yCoord,frameorder[curframe]
End Method
Hum, thats odd. Are you sure your loading your image correctly? This works fine on my computer....
Test.png should be a 32x32 image with 3 frames.
Type TAnimation
Field Image:TImage, X:Int, Y:Int
Field Frames:Int[] = [0,1,2,2,1,0]
Field CurrFrame:Int
Field AnimTimer:Int = MilliSecs()
Field AnimSpeed:Int = 250
Method Update()
If MilliSecs() - AnimTimer > AnimSpeed Then AnimTimer = MilliSecs() ; CurrFrame:+1
If CurrFrame > Frames.Length - 1 Then CurrFrame = 0
End Method
Method Render()
DrawImage Image,X,Y,Frames[CurrFrame]
End Method
End Type
Graphics 800,600,0,60
Local Anim:TAnimation = New TAnimation
Anim.Image = LoadAnimImage("Test.png",32,32,0,3)
Repeat
Anim.Update()
Anim.Render()
Flip;Cls
Forever
Hey!
I got it working. You were right, my array out of bounds problem had to do with the way I loaded my image.
thanks everyone for the help!
Hye thanks everybody for this. This is indeed more elegant!