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?
Advanced topics are hardly covered in friendly tutorials, I'm not sure why.johnnystarr wrote:I have been trying to locate any animation tutorials online but havent so far.
I think memblers posted some animation code at some point... Search for his name and "animation" and you might find something.An example or two might go a long way.
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.Can you run the animation routine during NMI?
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.Is there any built in PPU tricks, or is it all up to writing ASM?
I'm not sure what you mean here... Could you provide an example?How would you handle delays for slower animation or timed events?
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.
- Posts: 2097
- Joined: Mon Apr 04, 2011 11:49 am
- Location: WhereverIparkIt, USA
Code: Select all
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]