TweetFollow Us on Twitter

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

MyVBLTask PROC
;
; On entry A0 is a ptr to our XVBLRec which was defined
; as follows:
;
;XVBLRec= RECORD
;xVBLTask : VBLTask;
;xDoTask: INTEGER;
;END;
;
; We can use MPW RECORDs to define it in assembly as follows:
;
XVBLRec RECORD 0
xVBLTaskDS.BvblPhase+2
xDoTask DS.W1
 ENDR

kVBLCount EQU    1

 WITH XVBLRec
 ; Reset the vblCount
 MOVE.W #kVBLCount,XVBLRec+xVBLTask+vblCount(A0)

 ; Make xDoTask non-zero
 MOVE.W #1,XVBLRec+xDoTask(A0)

 ; Exit Task
 RTS

ENDWITH
ENDP
 END  ; For Assembler
Listing:  slotvbltaskdemo.p

PROGRAM SlotVBLTaskDemo;

USES
 MemTypes, QuickDraw, OSIntf, ToolIntf;

{ Declare our external vbl task }
PROCEDURE MyVBLTask; EXTERNAL;

CONST
 F =  False;
 T =  True;
 kBallSpeed =  4;

TYPE
 XVBLRec= RECORD
 xVBLTask : VBLTask;
 xDoTask: INTEGER;
 END;

VAR
 gDone  : BOOLEAN;
 gVideoInfoRec : DefVideoRec;
 gEvt : EventRecord;
 gFontInfo: FontInfo;
 gBoxDir: INTEGER;
 gBoxRect : Rect;
 gBoxColor: RGBColor;
 gBoxString :  Str255;

 gDragRect,
 gRect  : Rect;
 gMainWindow:  WindowPtr;
 gWRec  : WindowRecord;

 gXVBLRec : XVBLRec;

{ Proc to run if a crash occurs }
PROCEDURE Crash;
BEGIN
 ExitToShell;
END;

{ Proc that does MacInits }
PROCEDURE MacInits;
BEGIN
 MaxApplZone;

 MoreMasters;
 MoreMasters;
 MoreMasters;
 MoreMasters;

 InitGraf (@thePort);
 InitFonts;
 InitWindows;
 InitMenus;
 TEInit;
 InitDialogs (@Crash);
 InitCursor;
END;

{ Proc that sets up our window }
PROCEDURE SetUpWindows;
BEGIN
 gRect := ScreenBits.bounds;
 WITH gRect DO BEGIN
 left := left + 20;
 right := left + 400;
 top := top + 40;
 bottom := bottom - 20;
 END;

 gMainWindow := NewCWindow (@gWRec, gRect,
 ‘SlotVBLTaskDemo - Click in this window to Exit’,
 T, noGrowDocProc, WindowPtr (-1), F, 0);
 SetPort (gMainWindow);
END;

{ Proc that sets up the box for our ball }
PROCEDURE SetUpBox;
VAR
 width  : INTEGER;
BEGIN
 gBoxDir := kBallSpeed;

 gBoxString := ‘I love you Manu’;

 width := StringWidth (gBoxString);

 GetFontInfo (gFontInfo);

 WITH gBoxRect DO BEGIN
 top := 10;
 bottom := top + gFontInfo.ascent + gFontInfo.descent;
 left := ((gRect.right - gRect.left) DIV 2) - (width DIV 2);
 right := left + width;
 END;

 WITH gBoxColor DO BEGIN
 red := -1;
 green := 0;
 blue := 0;
 END;

 RGBForeColor (gBoxColor);
END;

{ Proc that inits our globals }
PROCEDURE GlobalInits;
BEGIN
 SetUpWindows;
 SetUpBox;
 gDragRect := ScreenBits.bounds;
 InsetRect (gDragRect, 4, 4);

 gDone := F;
END;

{ Proc that cleans up before we exit }
PROCEDURE CleanUps;
BEGIN
 CloseWindow (gMainWindow);
END;

{ Func that makes sure we run in the currect environment }
FUNCTION EnvironmentOK : BOOLEAN;
VAR
 err  : OSErr;
 theWorld : SysEnvRec;
BEGIN
 EnvironmentOK := F; { Assume env is bad }

 err := SysEnvirons (curSysEnvVers, theWorld);

 IF (err = noErr) THEN BEGIN
 IF (theWorld.machineType >= envMacII) THEN
 EnvironmentOK := T;
 END; { IF }
END;

{ Func that sets up our vbl task }
FUNCTION VBLTaskSetUp : BOOLEAN;
VAR
 err  : OSErr;
BEGIN
 VBLTaskSetUp := F; { Assume we fail }

 GetVideoDefault (@gVideoInfoRec);

 WITH gXVBLRec DO BEGIN
 xDoTask := 0;

 WITH xVBLTask DO BEGIN
 qType := ORD (vType);
 vblAddr := @MyVBLTask;
 vblCount := 1;
 vblPhase := 0;
 END;

 err := SlotVInstall (@xVBLTask, gVideoInfoRec.sdSlot);
 IF (err = noErr) THEN
 VBLTaskSetUp := T; { We succeeded! }
 END;
END;

{ Proc that removes our vbl task }
PROCEDURE RemoveVBLTask;
VAR
 err  : OSErr;
BEGIN
 err := SlotVRemove (@gXVBLRec.xVBLTask, gVideoInfoRec.sdSlot);
END;

{ Proc that draws our window }
PROCEDURE DrawStuff;
VAR
 oldPort: GrafPtr;
BEGIN
 GetPort (oldPort);
 SetPort (gMainWindow);
 EraseRect (gBoxRect);

 WITH gBoxRect DO BEGIN
 top := top + gBoxDir;
 bottom := bottom + gBoxDir;
 END;

 IF (gBoxRect.bottom >= gWRec.port.portRect.bottom) THEN
 gBoxDir := -kBallSpeed
 ELSE BEGIN
 IF (gBoxRect.top <= gWRec.port.portRect.top) THEN
 gBoxDir := kBallSpeed;
 END;

 MoveTo (gBoxRect.left, gBoxRect.bottom - gFontInfo.descent);
 DrawString (gBoxString);

 SetPort (oldPort);
END;

{ Proc that handles mouse downs }
PROCEDURE DoMouseDown;
VAR
 result : INTEGER;
 whichWindow:  WindowPtr;
BEGIN
 result := FindWindow (gEvt.where, whichWindow);

 CASE result OF
 inContent:
 gDone := T;
 inDrag:
 DragWindow (whichWindow, gEvt.where, gDragRect);
 OTHERWISE
 END;
END;

{ Main }
BEGIN
 MacInits;

 IF (EnvironmentOK) THEN BEGIN
 GlobalInits;

 IF (VBLTaskSetUp) THEN BEGIN

 REPEAT
 IF NOT (WaitNextEvent (mDownMask, gEvt, 0, NIL)) THEN BEGIN
 IF (gXVBLRec.xDoTask <> 0) THEN BEGIN
 DrawStuff;
 gXVBLRec.xDoTask := 0;
 END;
 END
 ELSE
 DoMouseDown;
 UNTIL (gDone);
 RemoveVBLTask;
 END;
 CleanUps;
 END;

 ExitToShell; { Back to the Finder! (or MultiFinder) }
END.
Listing:  slotvbltaskdemo.r

#include “Types.r”
#define kMinSize 25/* application’s minimum size (in K) */
#define kPrefSize50/* application’s preferred size (in K) */

resource ‘SIZE’ (-1) {
 dontSaveScreen,
 acceptSuspendResumeEvents,
 enableOptionSwitch,
 canBackground,  /* we can background  */
 multiFinderAware,
 backgroundAndForeground,
 dontGetFrontClicks,
 ignoreChildDiedEvents,
 not32BitCompatible,
 reserved,
 reserved,
 reserved,
 reserved,
 reserved,
 reserved,
 reserved,
 kPrefSize * 1024,
 kMinSize * 1024 
};

 

Community Search:
MacTech Search:

Software Updates via MacUpdate

Apple Remote Desktop Client 3.9 - Client...
Apple Remote Desktop Client is the best way to manage the Mac computers on your network. Distribute software, provide real-time online help to end users, create detailed software and hardware reports... Read more
Art Text 3.2.2 - $49.99
Art Text is graphic design software specifically tuned for lettering, typography, text mockups and various artistic text effects. Supplied with a great variety of ready to use styles and materials,... Read more
WhatRoute 2.0.15 - Geographically trace...
WhatRoute is designed to find the names of all the routers an IP packet passes through on its way from your Mac to a destination host. It also measures the round-trip time from your Mac to the router... Read more
Sparkle 2.1.1 - $79.99
Sparkle will change your mind if you thought building websites wasn't for you. Sparkle is the intuitive site builder that lets you create sites for your online portfolio, team or band pages, or... Read more
Dash 4.0.1 - Instant search and offline...
Dash is an API documentation browser and code snippet manager. Dash helps you store snippets of code, as well as instantly search and browse documentation for almost any API you might use (for a full... Read more
TextSoap 8.3.2 - Automate tedious text d...
TextSoap can automatically remove unwanted characters, fix up messed up carriage returns, and do pretty much anything else that we can think of to text. Save time and effort. Be more productive. Stop... Read more
Apple Remote Desktop 3.9 - Remotely cont...
Apple Remote Desktop is the best way to manage the Mac computers on your network. Distribute software, provide real-time online help to end users, create detailed software and hardware reports, and... Read more
Paragraphs 1.1.4 - Writing tool just for...
Paragraphs is an app just for writers. It was built for one thing and one thing only: writing. It gives you everything you need to create brilliant prose and does away with the rest. Features... Read more
Amazon Chime 4.0.5528 - Amazon-based com...
Amazon Chime is a communications service that transforms online meetings with a secure, easy-to-use application that you can trust. Amazon Chime works seamlessly across your devices so that you can... Read more
Apple Final Cut Pro X 10.3.2 - Professio...
Apple Final Cut Pro X is a professional video editing solution.Completely redesigned from the ground up, Final Cut Pro adds extraordinary speed, quality, and flexibility to every part of the post-... Read more

Blasty Bubs is a colorful Pinball and Br...
QuickByte Games has another arcade treat in the works -- this time it's a mishmash of brick breaking and Pinball mechanics. It's called Blasty Bubs, and it's a top down brickbreaker that has you slinging balls around a board. [Read more] | Read more »
Corsola and Heracross are the new region...
Generation 2 finally launched in Pokémon GO, unleashing a brand new batch of Pokémon into the wild. Even before the update went live people were speculating on how to catch elusive Pokémon like the legendary "dogs", Unknown, and whether or not... | Read more »
The Warlock of Firetop Mountain (Games)
The Warlock of Firetop Mountain 1.0 Device: iOS Universal Category: Games Price: $4.99, Version: 1.0 (iTunes) Description: An epic adventure through a mysterious mountain filled with monsters, magic and mayhem! “...it looks downright... | Read more »
Fantasy MMORPG MU Origin’s receives a hu...
Developer Webzen are looking to take their highly popular fantasy battler MU Origin to the next level this month, with its most ambitious overhaul yet. The latest update introduces the long sought after Server Arena, new treasure dungeons, and much... | Read more »
RPG Djinn Caster (Games)
RPG Djinn Caster 1.0.0 Device: iOS Universal Category: Games Price: $4.99, Version: 1.0.0 (iTunes) Description: SPECIAL PRICE 38% OFF(USD 7.99 -> USD 4.99)!!!A Fantasy Action RPG of far foreign lands! Summon the Djinns and rise to... | Read more »
Alto's Odyssey gets its first trail...
There's finally video evidence of Alto's Odyssey, the follow up to the 2015 App Store hit, Alto's Adventure. It looks just as soothing and atmospheric as Alto's last outing, but this time players will be journeying to the desert. Whereas Alto's... | Read more »
Last week on Pocket Gamer
What’s going on in the wider world of portable gaming? Each week we ask that question of our sister website Pocket Gamer. The PG team covers iOS gaming, just like 148Apps, but it also strays into the world of Android games and handheld consoles... | Read more »
Pokémon GO Generation 2 evolution guide
At long last, Niantic Labs finally unleashed the Generation 2 Pokémon into the wild. Pokémon GO trainers are scrambling to grab up this new set of 80 Pokémon. There are some special new tricks required to catch all of these new beasties, though.... | Read more »
The best new games we played this week
It feels as though the New Year got off to a creaking start as far as mobile games go, but that's changed over the past few weeks. The last few days alone have seen the debut of a number of wonderful games, so we thought we'd take the time to... | Read more »
Recruit more scallywags and discover new...
Get ready to show off your sea legs all over again in Oceans & Empires’ new grand update, which aims to make the act of rising to the role of seven seas ruler even more fresh and appealing, thanks to a richness of new content on both iOS and... | Read more »

Price Scanner via MacPrices.net

27-inch Apple iMacs on sale for up to $200 of...
B&H Photo has 27″ Apple iMacs on sale for up to $200 off MSRP, each including free shipping plus NY sales tax only: - 27″ 3.3GHz iMac 5K: $2099.99 $200 off MSRP - 27″ 3.2GHz/1TB Fusion iMac 5K: $... Read more
15-inch 2.2GHz Retina MacBook Pro on sale for...
Amazon has 2015 15″ 2.2GHz Retina MacBook Pros (MJLQ2LL/A) available for $1849.99 including free shipping. Apple charges $1999 for this model, so Amazon’s price is represents a $150 savings. Read more
Apple refurbished iPad Air 2s available start...
Apple has Certified Refurbished iPad Air 2 WiFis available for starting at $319 including free shipping. A standard Apple one-year warranty is included: - 16GB iPad Air 2 WiFi: $319 $60 off original... Read more
Apple refurbished iPad Pros available for up...
Apple has Certified Refurbished 9″ and 12″ Apple iPad Pros available for up to $160 off the cost of new iPads. An Apple one-year warranty is included with each model, and shipping is free: - 32GB 9″... Read more
Apple restocks refurbished 2015 and 2016 13-i...
Apple has Certified Refurbished 2015 and 2016 13″ MacBook Airs available starting at $759. An Apple one-year warranty is included with each MacBook, and shipping is free: - 2016 13″ 1.6GHz/8GB/128GB... Read more
13-inch 2.5GHz MacBook Pro (Apple refurbished...
Apple has Certified Refurbished 13″ 2.5GHz MacBook Pros (MD101LL/A) available for $829, or $270 off original MSRP. Apple’s one-year warranty is standard, and shipping is free: - 13″ 2.5GHz MacBook... Read more
QuickerTek Announces 5TB Apple AC AirPort Tim...
QuickerTek Inc. has announced their new 5TB hard drive upgrade for Apple’s AC AirPort Time Capsule. By customer request, this upgrade also features six external antennas and offers the highest... Read more
Apple Certified Refurbished iMacs available f...
Apple has Certified Refurbished 2015 21″ & 27″ iMacs available for up to $350 off MSRP. Apple’s one-year warranty is standard, and shipping is free. The following models are available: - 21″ 3.... Read more
Apple offering Certified Refurbished Series 1...
Apple is now offering Certified Refurbished Series 1 and Series 2 Apple Watches for 14-16% off MSRP, starting at $229. An Apple one-year warranty is included with each watch. Shipping is free: Series... Read more
1.4GHz Mac mini on sale for $449, save $50
B&H Photo has the 1.4GHz Mac mini on sale for $50 off MSRP including free shipping plus NY sales tax only: - 1.4GHz Mac mini: $449 $50 off MSRP Read more

Jobs Board

*Apple* Retail - Multiple Positions - Apple,...
Job Description: Sales Specialist - Retail Customer Service and Sales Transform Apple Store visitors into loyal Apple customers. When customers enter the store, Read more
Manager *Apple* Systems Administration - Pu...
Req ID 3315BR Position Title Manager, Apple Systems Administration Job Description The Manager of Apple Systems Administration oversees the administration and Read more
*Apple* Retail - Multiple Positions - Apple,...
Job Description: Sales Specialist - Retail Customer Service and Sales Transform Apple Store visitors into loyal Apple customers. When customers enter the store, Read more
Manager *Apple* Systems Administration - Pu...
Req ID 3315BR Position Title Manager, Apple Systems Administration Job Description The Manager of Apple Systems Administration oversees the administration and Read more
*Apple* Technician - nfrastructure (United S...
Let’s Work Together Apple Technician This position is based in Portland, ME Life at nfrastructure At nfrastructure, we understand that our success results from our Read more
All contents are Copyright 1984-2011 by Xplain Corporation. All rights reserved. Theme designed by Icreon.