About Color Animation
Volume Number: 6
Issue Number: 5
Column Tag: Pascal Procedures
Related Info: Vert. Retrace Mgr Event Manager Color Quickdraw
Color Animation
By Ajay Nath, Oakland Gardens, NY
Note: Source code files accompanying article are located on MacTech CD-ROM or
source code disks.
[Ajay Nath has B.A. degrees in Mathematics and Chemistry from New York
University and is currently a third year medical student at the Mount Sinai School of
Medicine where he tries to find the time to program and to learn medicine.]
It all started when I started playing with a shareware breakout game. Paul, a
friend of mine who saw me playing it, thought it was neat and liked playing it but there
were a few problems with the game. It was an old game and didn’t use the larger screen
of my Mac IIcx or color and it had other annoying things about it. Well I’ve been much
too busy to write a new game for my friend, but I was able to discover a method for
doing simple animation that will work well on a Mac II or better machine.
When I first sat down and thought about the problem I thought, well I’ll simply
use a vbl task to set a global variable and my program’s main loop will examine that
variable and know when to draw. To do this I declared a variable of the following
simple type:
{1}
XVBLRec = RECORD
xVBLTask : VBLTask;
xDoTask : INTEGER;
END;
The first field of the record (xVBLTask) is used in the calls to install and remove
the vbl task, the second field xDoTask is an integer which the vbl task I use will set to
1 when it runs. My programs main loop just has to examine the xDoTask field and
draw when it is non-zero.
This technique is not very different from the method which involves examining
the current value of the Mac global variable TickCount and drawing when it changes,
i.e. (in pseudocode):
{2}
count = TickCount;
while count = TickCount do nothing;
{ start drawing real fast! }.
On older Macs the TickCount was changed when vbl tasks were run so the above
method was really very similar to using a vbl task to set a global variable.
I took a quick look in Inside Mac Vol. V (pp. 566-567) before I started writing
my vbl task and found some interesting information there. The new Macs have vertical
retrace interrupts which can vary according to their video card and we can create vbl
tasks which run at the ‘heart rate’ of the whichever video card we want. Well, the
obvious thing to do is to run our vbl task at the rate of the video card of our main
screen, and we then should be able to do simple animation easily! The new calls are
called SlotVInstall and SlotVRemove and just like the old calls need a pointer to a
vbltask record but in addition, need a slot number so they know which slot to attach the
vbl task to. All we need to know then is the slot number of the video card which drives
our main screen. After a quick five minute search through IM V I found a call,
“GetVideoDefault”, which would give me the slot number of the default video card and I
was on my way.
I used TML Pascal II to write my main program and used MPW Assembler to
write the vbl task. I’ll explain the vbl tasks code first since its so simple (only three
lines). When the task runs, register A0 is a ptr to our vbltask record and this allows
us to reset our tasks vblcount. Since we defined an integer that comes right after this
record in our XVBLRec type (see above), we can change its value to 1 at this point
since A0 points to our record. The three lines of the vbl task do the following (in
pseudocode):
1) reset the vblcount
2) set the xDoTask variable to 1
3) return (exit) from the vbl task.
All the main program loop has to do is (in pseudocode):
repeat
if (xDoTask <> 0) begin
DrawStuff;
set xDoTask to 0
endif
until done
The following MPW commands will build and run the example program (you may
need to change the paths to build it on your hard disk):
# 3
####
Asm vbltask.a
TMLPascal slotvbltaskdemo.p
Link -w -t ‘APPL’ -c ‘????’ ∂
slotvbltaskdemo.p.o vbltask.a.o ∂
“HD-80:MPW:Libraries:Libraries:”Runtime.o ∂
“HD-80:MPW:Libraries:Libraries:”Interface.o ∂
“HD-80:MPW:Libraries:TMLPLibraries:”TMLPasLib.o ∂
“HD-80:MPW:Libraries:TMLPLibraries:”SANELib.o ∂
-o SlotVBLTaskDemo
Rez -append -o SlotVBLTaskDemo slotvbltaskdemo.r
SlotVBLTaskDemo
####
Note that the code does check to make sure that the machine its running on is a
Mac II or better before running, since the new calls are not available on lower end
machines. On lower machines using regular vbl tasks is probably sufficient to do
simple animation. That’s about all the explanation the code needs other than to say that
it ‘bounces’ a red string vertically in its draggable window and can run in the
background.
There is a bug which occurs when things are being drawn at the top of the screen
and when you use the simple method of ‘erase old stuff then draw new stuff’ as I do in
this example. You may see things start to flicker when drawing at the top of the
screen. The problem I think is in the way the screen is drawn which is left to right
and from top to bottom. I haven’t thought of a solution for this problem yet other than
to use a call to CopyBits to blast in whatever your drawing, rather then to use straight
QuickDraw calls. If anyone can think of a good explanation of this problem and how to
solve it I’d like to hear about it.
Much love and thanks to the boys of ‘9A’ and of course, to K.S.
Listing: vbltask.a
INCLUDE ‘SysEqu.a’
EXPORT MyVBLTask