Sign in to follow this  
chrisprij

Control Structure for Animating Billboards

Recommended Posts

chrisprij    157

Currently I'm working on a 2.5D FPS game somewhat like Doom graphics-wise. Currently, I decided that before getting into polygon-structured enemies (especially in a Java software renderer), I would deal with 2D billboard sprites that emulate the behavior of a 3D character (animations for running sideways, forward, away, etc.), just like in Doom. I already can render sprites in the game, and have the animations face the correct way using vector math (the "look" vector). 

 

However, now I'm thinking about how to control the animations for the enemies; an attack or death animation each have multiple frames. If i wanted to stop an attack animation because they die, would I add a simple check for that, or is there a more elegant solution? Just trying to create a good structure for the animations in my game . . .

 

As of right now, I have a enum called AnimationFrames, which loads each frame of an animation into a variable, so there's an AttackFrame1, AttackFrame2, etc, as well as an endFrame to know when the animation is over. The renderFrame() method sends the frame to the rendering pipeline. The nextFrame() method decides what the next frame would be (hopefully all this is self explanatory). Would I structure the animation control schemes like this:

 

public void attackAnimation(/*stuff*/) {
	AnimationFrame frame = AnimationFrame.attackframe1;
	while (!dead && frame != Frame.endFrame) {
		renderFrame(frame);
		frame = nextFrame(“attack”, frame);
	}
}

public void dieAnimation(/*stuff*/) {
	AnimationFrame frame = AnimationFrame.dieFrame1;
	while (frame != Frame.endFrame) {
		renderFrame(frame);
		frame = nextFrame(“die”, frame);
	}
}

 

or is there a more elegant or obvious solution? Am I missing something? I'm not even exactly sure what to ask tongue.png I'm just wondering if this will work for a control scheme . . .I would start programming this into my game to test it out now, but I'm unfortunately behind code-wise than I am idea/planning-wise.

 

On a side note, does anyone have any useful links or books/articles that deal with controlling the flow of animation in a game? This seems to be the topic I'm currently addressing in my game.

 

--Chris

Share this post


Link to post
Share on other sites
ifthen    820

The way I have seen animation implemented in game engines has been quite the same everywhere: they define a class (let's say Animation) that has a method Update(timeFromLast) and a variable animationTime. Update adds timeFromLast to animationTime and finds the current frame (or interpolation of them). There is usually also an enum that specifies the behaviour at the beginning/end; without interpolation, loop and stop are probably the only reasonable behaviour.

 

Drawing an animated object is simple then: you usually take the current frame from Animation in draw() function of your model and make the magic there.

Share this post


Link to post
Share on other sites
chrisprij    157

The way I have seen animation implemented in game engines has been quite the same everywhere: they define a class (let's say Animation) that has a method Update(timeFromLast) and a variable animationTime. Update adds timeFromLast to animationTime and finds the current frame (or interpolation of them). There is usually also an enum that specifies the behaviour at the beginning/end; without interpolation, loop and stop are probably the only reasonable behaviour.

 

Drawing an animated object is simple then: you usually take the current frame from Animation in draw() function of your model and make the magic there.

 

ifthen,

 

That makes sense smile.png But how exactly does that fit in with a character being mid-attack animation to switch to the dying animation? Does the update() method then interpolate between the current attack frame and the first dying frame, and then continue with the dying frames, or something along those lines? Should I make another method for this? I might be getting too much into the details here...

Edited by chrisprij

Share this post


Link to post
Share on other sites

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