Sign in to follow this  

the best way of doing animation in SDL?

This topic is 3588 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

There's several ways, actually. One way is to hold the entire animation in one image, with each frame next to(or below) the previous.

You can then create a array of SDL_Rects that each hold a different frame, and cycle through the frames using SDL_BlitSurface(animationImageFile, rectArray[animationFrame], surfaceToDrawTo, NULL). You'd increment the int, animationFrame, after a set amount of time, for example, every 100 millaseconds, to get 10 frames per second animation.

This is very simular to what LazyFoo does in his SDL tutorial in lesson 20.

You could also have a array of SDL_Surfaces, instead of SDL_Rects. Same concept, pretty much.

'The best' way would be to wrap it in a class, or struct if using C and not C++, and allow for different sizes of animations, time between frames, etc... without having to hardcode it all, perhaps even loading a small .txt file that describes the animation.

Something like:
'myAnimation.txt'
NameOfImageFile
DelayBetweenFrames
FrameWidth
FrameHeight


If you want to make it even more flexible, for slightly more work you can even get the different frames in the same animation, to stay on-screen for longer or shorter periods of time. You could do this by having a structure like this:

struct AnimationFrame
{
SDL_Surface *frame; //Or 'SDL_Rect frame', if using tilesheets or spritesheets.
Uint32 delay; //Delay until the next frame.
AnimationFrame *nextFrame; //A pointer to the next frame.
};

struct Animation
{
AnimationFrame *frames; //Pointer to a array of frames.
int numFrames; //The number of frames in the array.
int currentFrame; //The current frame.
Uint32 lastChange; //The SDL_GetTicks() of when the frame last changed.
};

void UpdateAnimation(Animation *animation)
{
Uint32 currentTime = SDL_GetTicks();
Uint32 lastChange = animation->lastChange;
Uint32 delay = animation->frames[animation->currentFrame].delay;

if((lastChange + delay) < currentTime)
{
animation->lastChange = SDL_GetTicks();
animation->currentFrame++;
if(animation->currentFrame >= animation->numFrames)
animation->currentFrame = 0;
}
}

/*
To draw, just draw:
myAnimation.frames[animation->currentFrame].frame.

To update, just call:
UpdateAnimation(&myAnimation);

This is just a general idea, didn't try it in a compiler. You'll want to code a function to load a animation from a text file or custom filetype, and to load and fill the structure with the proper delays and images.
*/




This is simular to what a article I read a while back did. I don't remember the article's name, though. Hope it helps give you ideas on how to do it in your project.

Share this post


Link to post
Share on other sites

This topic is 3588 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this