An Animated MNG
As a more complex example, let us take a closer look at how we might create
the animated reindeer example I described earlier. I will assume that a
single cycle of a reindeer's gallop can be represented by six poses
(sprite frames), and I'll further assume that all but the first pose can
be efficiently coded as delta-PNGs. The complete MNG of a single
reindeer galloping across the screen might be structured as shown in Figure 12-3.
As always, we begin with MHDR, which defines the overall size of the
image area. I've also included a gamma chunk so that the (nighttime)
animation won't look too dark or too bright on other computer
systems. The animation timing is set by the FRAM chunk, and then we
begin loading sprite data for
the six poses. The DEFI chunk (``define image'') is one I haven't
discussed so far; it is included here to set the potential visibility
of the first pose explicitly--in this case, we want the first pose
to be visible. After the IHDR, PLTE, IDAT, and IEND chunks defining
the first pose is a clone chunk, indicating that the second object
(the second pose in the six-pose sequence) is to be created
by copying the first object. The CLON chunk also indicates that the second
object is not potentially visible yet. It is followed by the delta-PNG
chunks that define the second image; we can imagine either that the IDAT
represents a complete replacement for the pixels in the first image, with
the delta part referring to the inheritance of the first image's palette
chunk, or perhaps the second image is truly a pixel-level delta from the
first image. Either way, the third through sixth images are defined similarly.
The heart of the animation is the loop at the end. In this case, I've
included a MOVE chunk, which moves the animation objects to the left by
a few pixels every iteration, and a SHOW chunk to advance the poses
in sequence. If there are 600 iterations in the loop, the animation
will progress through 100 six-pose cycles.
The complete eight-reindeer version would be very similar, but instead of
defining full clones of the sprite frames, each remaining reindeer would
be represented by partial clones of the six original poses. In effect,
a partial clone is an empty object: it has its own object ID, visibility,
and location, but it points at another object for its image data--in this
case, at one of the six existing poses. So the seven remaining
reindeer would be represented by 42 CLON chunks, of which seven would have
the potential-visibility flag turned on. The loop would now include a total
of eight SHOW chunks, each advancing one of the reindeer sprite's poses; a
single MOVE chunk would still suffice to move all eight forward. Of
course, this is still not quite the original design; this version has all
eight reindeer galloping synchronously. To have them gallop at different
rates would require separate FRAM chunks for each one.[98]
|