Spritesheet animation storage

Started by
1 comment, last by Strewya 10 years, 1 month ago

Hey,

First post one here :-)

I've been going through the SFML game dev book and so far I have learnt a lot. The one thing I am somewhat stuck on is the animation.

I am trying to make a platformer as an excuse to learn about all aspects of game making and the various systems necessary to make a game. Anyways, I have written an Animation class which is basically that used in the book with some minor alterations, you can see the vanilla Animation class here:

https://github.com/LaurentGomila/SFML-Game-Development-Book/tree/master/08_Graphics

This is the class described in the book, but functionally it is the same as mine. Essentially you load a spritesheet which contains all the frames of the animation sequence and shift the drawn sprite along the sheet to create the illusion of motion, so far nothing particularly earth-shattering. The issue that I am having is in trying to implement multiple animated actions into my player character and enemy mobs.

Most tutorials deal with the drawing and animation mechanic itself but never really go into too much detail as to how one would manage different mobs/players with different animated actions in a smart way without resorting to tonnes of subclasses or some unweildy case handling.

I was wondering if anybody could share some of their wisdom regarding this issue smile.png

Thanks

Advertisement

I was dealing with this a few moments ago, developing my first game made with my engine. You'll need logic to deal with it.

Suppose you have a player class and three animation-lists in it (I'm programming in Python, but anyway, the way you loop through the frames is irrelevant here (I'll use some half-python/half-pseudocode here)):


class Player():

   walk = [frame1, frame2, frame3, frame4, ...]
   run = [frame1, frame2, frame3, frame4, ...]
   die = [frame1, frame2, frame3, frame4, ...]

   def animate(animation):
       # Animate the whole sequence.

Now, in your event-handling part of the code:


while not done:

    # Here you're not mixing the animations by using some logic considering the nature of the animation and how it gets executed. At each frame, if shift is pressed, the "walk" animation never gets executed and, thefore, it does not get mixed.

    if keyRight or keyLeft:
        if keyShift: 
            Player.animate(run)
        if not:
            Player.animate(walk)

But, unfortunately, you'll need a bit more logic.


while not done:

    if Player not DEAD:
        if keyRight or keyLeft:
            if keyShift: 
                Player.animate(run)
            if not:
                Player.animate(walk)
    elif Player is DEAD:
        Player.animate(die)

You can't execute the enemy-walking animation if the enemy is dead, right? (Even if it is a zombie haha). The only way is logic.. Depending on the project, you can always develop a fancy procedure that can be reused in a clever way, but that depends on the game/situation.

Creator and only composer at Poisone Wein and Übelkraft dark musical projects:

I'll describe my way, which i've only started implementing, so i might miss some details.

I have several classes which are used for a specific task.

The Spritesheet class has a string name for identification, a list of images and a texture ID. The idea here is that a spritesheet is just a definition of where the individual sprites/images are on some texture.

Then i have an Animation class which also has a name for identification, has a spritesheet ID, a sequence of images (stored as indices for the spritesheets image list), and the default duration and repeat info. The idea is that an animation is just a sequence of images which are located on some spritesheet, and which has a default duration and whether it should be looped by default or not.

Then, i will have (not implemented yet) and AnimationSystem which internally has a list of current animations to update. Lets say, an AnimationController, which references an Animation instance and a Spritesheet instance, pulls data from them and executes certain animation logic. It all depends on a timer which controls the animation direction (feeding the timer a negative time delta will move the animation backwards), where each animation controller has its' own timer, and its' own internal set of control variables. The output of the whole system is the image which should be provided to the graphics system (along with the texture ID from the spritesheet) so the correct image can be drawn on the screen.

This all is just the animation part. In order to control which animation should be played, you need to have a separate system/logic which checks the animated objects' internal state, and depending on it sets which animation should be played by the animation system. For this, refer to what EricsonWillians said: if your object is running, set the animation to "running", if you press the key which translates to the WALK command, set the animation to "walking", if your object dies, play the "death" animation, which, when it finishes, does not have a next animation, but simply forever on draws the same image of the object being dead.

It would also be very useful to have some kind of notification/callback/flag that tells you when a non-looped animation has finished, so you can set the next animation to be played.

devstropo.blogspot.com - Random stuff about my gamedev hobby

This topic is closed to new replies.

Advertisement