110 lines
6.3 KiB
Markdown
110 lines
6.3 KiB
Markdown
------------------------ --------------------------------- --------------------
|
||
[Previous](43-03.html) [Table of Contents](index.html) [Next](43-05.html)
|
||
------------------------ --------------------------------- --------------------
|
||
|
||
For those of you who haven’t experienced the frustrations of animation
|
||
programming on a PC, there’s a *whole* lot of animation going on in
|
||
Listing 43.1. What’s more, the animation is virtually flicker-free,
|
||
partly thanks to bit-plane animation and partly because images are never
|
||
really erased but rather are simply overwritten. (The principle behind
|
||
the animation is that of redrawing each image with a blank fringe around
|
||
it when it moves, so that the blank fringe erases the part of the old
|
||
image that the new image doesn’t overwrite. For details on this sort of
|
||
animation, see the above-mentioned *PC Tech Journal* July 1986 article.)
|
||
Better yet, the red images take precedence over the green images, which
|
||
take precedence over the blue images, which take precedence over the
|
||
white backdrop, and all obscured images show through holes in and around
|
||
the edges of images in front of them.
|
||
|
||
In short, Listing 43.1 accomplishes everything we wished for earlier in
|
||
an animation technique.
|
||
|
||
If you possibly can, run Listing 43.1. The animation may be a revelation
|
||
to those of you who are used to weak, slow animation on PCs with EGA or
|
||
VGA adapters. Bit-plane animation makes the PC look an awful lot
|
||
like—dare I say it?—a games machine.
|
||
|
||
Listing 43.1 was designed to run at the absolute fastest speed, and as I
|
||
mentioned it puts in a pretty amazing performance on the slowest PCs of
|
||
all. Assuming you’ll be running Listing 43.1 on an faster computer,
|
||
you’ll have to crank up the **DELAY** equate at the start of Listing
|
||
43.1 to slow things down to a reasonable pace. (It’s not a very good
|
||
game where all the pieces are a continual blur!) Even on something as
|
||
modest as a 286-based AT, Listing 43.1 runs much too fast without a
|
||
substantial delay (although it does look rather interesting at warp
|
||
speed). We should all have such problems, eh? In fact, we could easily
|
||
increase the number of animated images past 20 on that old AT, and well
|
||
into the hundreds on a cutting-edge local-bus 486 or Pentium.
|
||
|
||
I’m not going to discuss Listing 43.1 in detail; the code is very
|
||
thoroughly commented and should speak for itself, and most of the
|
||
individual components of Listing 43.1—the Map Mask register, mode sets,
|
||
word versus byte **OUT** instructions to the VGA—have been covered in
|
||
earlier chapters. Do notice, however, that Listing 43.1 sets the palette
|
||
exactly as I described earlier. This is accomplished by passing a
|
||
pointer to a 17-byte array (1 byte for each of the 16 palette registers,
|
||
and 1 byte for the border color) to the BIOS video interrupt (**INT**
|
||
10H), function 10H, subfunction 2.
|
||
|
||
Bit-plane animation does have inherent limitations, which we’ll get to
|
||
in a second. One limitation that is *not* inherent to bit-plane
|
||
animation but simply a shortcoming of Listing 43.1 is somewhat choppy
|
||
horizontal motion. In the interests of both clarity and keeping Listing
|
||
43.1 to a reasonable length, I decided to byte-align all images
|
||
horizontally. This saved the many tables needed to define the 7
|
||
non-byte-aligned rotations of the images, as well as the code needed to
|
||
support rotation. Unfortunately, it also meant that the smallest
|
||
possible horizontal movement was 8 pixels (1 byte of display memory),
|
||
which is far enough to be noticeable at certain speeds. The situation
|
||
is, however, easily correctable with the additional rotations and code.
|
||
We’ll see an implementation of fully rotated images (in this case for
|
||
Mode X, but the principles generalize nicely) in Chapter 49. Vertically,
|
||
where there is no byte-alignment issue, the images move 4 or 6 pixels at
|
||
a times, resulting in considerably smoother animation.
|
||
|
||
The addition of code to support rotated images would also open the door
|
||
to support for internal animation, where the appearance of a given image
|
||
changes over time to suggest that the image is an active entity. For
|
||
example, propellers could whirl, jaws could snap, and jets could flare.
|
||
Bit-plane animation with bit-aligned images and internal animation can
|
||
look truly spectacular. It’s a sight worth seeing, particularly for
|
||
those who doubt the PC’s worth when it comes to animation.
|
||
|
||
### Limitations of Bit-Plane Animation {#Heading6}
|
||
|
||
As I’ve said, bit-plane animation is not perfect. For starters,
|
||
bit-plane animation can only be used in the VGA’s planar modes, modes
|
||
0DH, 0EH, 10H, and 12H. Also, the reprogramming of the palette registers
|
||
that provides image precedence also reduces the available color set from
|
||
the normal 16 colors to just 5 (one color per plane plus the background
|
||
color). Worse still, each image must consist entirely of only one of the
|
||
four colors. Mixing colors within an image is not allowed, since the
|
||
bits for each image are limited to a single plane and can therefore
|
||
select only one color. Finally, all images of the same precedence must
|
||
be the same color.
|
||
|
||
It is possible to work around the color limitations to some extent by
|
||
using only one or two planes for bit-plane animation, while reserving
|
||
the other planes for multi-color drawing. For example, you could use
|
||
plane 3 for bit-plane animation while using planes 0-2 for normal
|
||
8-color drawing. The images in plane 3 would then appear to be in front
|
||
of the 8-color images. If we wanted the plane 3 images to be yellow, we
|
||
could set up the palette registers as shown in Table 43.2.
|
||
|
||
As you can see, the color yellow is displayed whenever a pixel’s bit
|
||
from plane 3 is 1. This gives the images from plane 3 precedence, while
|
||
leaving us with the 8 normal low-intensity colors for images drawn
|
||
across the other 3 planes, as shown in Figure 43.5. Of course, this
|
||
approach provides only 1 rather than 3 high-precedence planes, but that
|
||
might be a good tradeoff for being able to draw multi-colored images as
|
||
a backdrop to the high-precedence images. For the right application,
|
||
high-speed flicker-free plane 3 images moving in front of an 8-color
|
||
backdrop could be a potent combination indeed.
|
||
|
||
------------------------ --------------------------------- --------------------
|
||
[Previous](43-03.html) [Table of Contents](index.html) [Next](43-05.html)
|
||
------------------------ --------------------------------- --------------------
|
||
|
||
* * * * *
|
||
|
||
Graphics Programming Black Book © 2001 Michael Abrash
|