Sprite animation

This is an archive of a topic from NESdev BBS, taken in mid-October 2019 before a server upgrade.
View original topic
Sprite animation
by on (#105148)
I have been trying to locate any animation tutorials online but havent so far. I have gone over basic tutorials and have been learning quite a bit.

An example or two might go a long way. I have a few questions as well:

Can you run the animation routine during NMI?

Is there any built in PPU tricks, or is it all up to writing ASM?

How would you handle delays for slower animation or timed events?

Thanks!
Re: Sprite animation
by on (#105150)
johnnystarr wrote:
I have been trying to locate any animation tutorials online but havent so far.

Advanced topics are hardly covered in friendly tutorials, I'm not sure why.

Quote:
An example or two might go a long way.

I think memblers posted some animation code at some point... Search for his name and "animation" and you might find something.

Quote:
Can you run the animation routine during NMI?

you shouldn't, unless all your game logic is inside the NMI handler, running after the video and sound updates (like in SMB1, for example). Character animation would work better close to the character's AI.

Quote:
Is there any built in PPU tricks, or is it all up to writing ASM?

No tricks at all, there are absolutely no hardware functions that will help you with animations. All graphics are static unless you change them from frame to frame, which you do with pure logic.

Quote:
How would you handle delays for slower animation or timed events?

I'm not sure what you mean here... Could you provide an example?

Delays are often represented as numbers between 1 and 256 (which you can store as 0-255 and use the carry to compensate) that you add to an accumulator, and whenever that accumulator overflows (the carry flag will be set after the addition) you have a "tick" (in the case of animation this means you'd advance to the next frame). You can easily adjust this value to make the animations faster or slower, with a good deal of precision. This works for music too.
Re: Sprite animation
by on (#105160)
This tut is pretty decent: game engine. The first couple go into sprite animations.
Re: Sprite animation
by on (#105194)
The psuedo-code for the animation engine in my C++ fighting game works like so:

Code:
variable currentFrame;
variable advanceCounter;
variable frameLength[]; // each cell of this array corresponds to every frame of the animation
constant animationLength;
constant loopbackFrame;

updateAnimations:

if the currentFrame > animationLength:
  reset currentFrame to loopbackFrame;
else:
  increment advanceCounter;
  if advanceCounter > frameLength[currentFrame]:
    reset advanceCounter to 0;
    increment currentFrame;
display animation frame #[currentFrame]


I'm too tired to proofread that, but I hope that clarifies how you might structure animation playback.