newhue (coir, 2 )=b 'New BLUE color value.-*
END IF-*
END IF-*
IF mx>0 AND mx<311 AND my<80 THEN 'Clicked on-color panel.-*
LINE (r*300+2,101)-(r*300+9,109),0,bf 'Erase RED slider.-*
LINE (g*300+2,121)-(g*300+9,129),0,bf 'Erase GREEN slider.-*
LINE (b*300+2,141)-(b*300+9,149),0,bf 'Erase BLUE slider.-*
colr=8*INT(my/20)+INT(mx/39) 'Calculate chosen color box.-*
IF colr>WIND0W(6) THEN colr=0 'Color 0 if out of range.-*
r=newhue(coir,0):g=newhue(coir,1):b=newhue(coir,2)-*
END IF-*
IF preferences=80 THEN y=12 ELSE y=ll-*
LOCATE y,l:PRINT USING "R=#.##";r-*
LINE (r*300+2,101)-(r*300+9,109),l,bf ' RED slider.-*
LOCATE y, 9: PRINT USING "G=#.##";g-*
LINE (g*300+2,121)-(g*300+9,129),l,bf ' GREEN slider.-*
LOCATE y, 17: PRINT USING "B=# . ##" ;b-*
LINE (b*300+2,141)-(b*300+9,149),l,bf • BLUE slider.-*
LOCATE y, 24: PRINT USING "Color=##" ; coir-*
PALETTE colr,r#g,b 'Set new PALETTE colors.-*
newhue (coir, 0)=r: newhue (coir, 1) =g: newhue (coir, 2) =b-*
WHILE MOUSE(0)=0:WEND-*
mx=MOUSE (1) :my=MOUSE (2) -*
GOTO SubMainLoop*
ExitPanel:-*
IF btn=0 THEN-*
LINE (1,160)-(156,184), l,bf 'Flash USE button.-*
FOR n=0 TO 31 'Copy new values to current hue array.-*
hue (n, 0) =newhue (n, 0) -*
hue(n,l)=newhue(n,l) :hue(n, 2)=newhue(n, 2)-*
NEXT n-*
ELSE-*
LINE (156,160)-(310,184),l,bf 'Flash CANCEL button.-*
FOR n=0 TO WIND0W(6) 'Restore previous PALETTE values...-*
PALETTE n,hue(n,0) ,hue(n, 1) ,hue(n, 2)-*
NEXT n-*
END IF-*
WHILE MOUSE(0)<>0:WEND-*
WINDOW CLOSE 3-*
END SUB-*
Program 4-6. MaskMaker
1 *** MaskMaker ***-*
* Makes MeMasks and HitMasks for object animation.-*
Initialize:-*
WINDOW 1, "MaskMaker", (0,0)-(631,185), 20-*
WIDTH 80-*
DIM memask(15,15) 'MeMask array for 15 classes of objects.-*
DIM hitmask(15,15) 'HitMask array for 15 classes of objects.-*
DIM object?(15) 'Names array for 15 classes of objects.-*
DIM bit(15) 'Holds bit values for 16-bit mask.-*
bitvalue=l:FOR n=0 TO 15 'Fill array with bit values...-*
bit(n)=bitvalue:bitvalue=bitvalue*2-*
NEXT n-*
A
EntryPoint:-*
CLS:PRINT:PRINT "Enter number of CLASSES of objects"-*
PRINT "(not actual NUMBER of objects):"-*
INPUT ">> ",numobjects-*
IF numobjects>15 THEN-*
BEEP:PRINT:PRINT "Sorry, system can handle"«*
PRINT "only 15 classes of objects."-*
GOSUB Clickmouse-*
GOTO EntryPoint-*
END IF-*
IF numobjects<2 THEN-*
BEEP:PRINT:PRINT "Sorry, too few classes of objects."<*
GOSUB Clickmouse-*
GOTO EntryPoint*
END IF-*
CLS: PRINT-*
PRINT "Enter brief name for each class of objects."-*
PRINT "(Example: Aliens, Ship, Missile, Ball, etc.):"-*
FOR n=0 TO numobjects-1-*
Getnames: •*
PRINT "Object class number" ;n+l; ":"-*
LINE INPUT ">> ";object? (n)-*
IF object? (n) = IIM THEN Getnames-*
memask(n,n+l)=l-*
NEXT n-*
MakeMask:-*
FOR n=0 TO numobjects-1-*
Askborders:-*
CLS:PRINT:PRINT "Should OBJECT CLASS: ";object? (n)-*
INPUT "collide with the screen borders (Y/N)";a?«
IF a?="" THEN Askborders-*
IF UCASE?(a?)="Y" THEN hitmask (n,0)=l-*
NEXT n«
FOR n=0 TO numobjects-1-*
FOR nn=0 TO numobjects-l-*
Askobjects:-*
CLS: PRINT-*
IF nonn THEN-*
PRINT "Should OBJECT CLASS: " ;object? (n)-*
PRINT "collide with OBJECT CLASS: ";object? (nn)-*
INPUT "Y/N";a?-*
IF a?="" THEN Askobjects-*
IF UCASE?(a?) = "Y" THEN hitmask(n,nn+l)=1-*
END IF-*
NEXT nn-*
NEXT n-*
4,
DisplayMask:-*
CLS:PRINT "Here is the MeMask and Hitmask data:":PRINT-*
FOR n=0 TO numobjects-1-*
maskl=0: mask2=0-*
PRINT "OBJECT.HIT " ;object? (n) ;«*
FOR nn=0 TO 15-*
IF memask(n,nn)=l THEN maskl=maskl+bit(nn)-*
NEXT nn-*
maskl=maskl-65536&*(maskl> 32767)-*
PRINT maskl; ",";-*
FOR nn=0 TO 15-*
IF hitmask(n,nn)=l THEN mask2=mask2+bit(nn)-*
NEXT nn-*
mask2=mask2-65536&*(mask2>32767)*
PRINT raask2:PRINT "MeMask: ";*
FOR nn=15 TO 0 STEP -1:PRINT USING "#";memask(n,nn);:NEXT*
PRINT:PRINT "HitMask: ";*
FOR nn=15 TO 0 STEP -1:PRINT USING "#";hitmask(n,nn);:NEXT*
PRINT:PRINT*
NEXT n*
END*
4
Clickmouse:*
PRINT:PRINT "<< CLICK MOUSE IN THIS WINDOW TO CONTINUE >>"*
WHILE MOUSE(0)=0:WEND*
WHILE MOUSE(0)<>0:WEND*
RETURN*
Program 4-7, BattleStation
1 *** BATTLESTATION ****Initialize:*
DEFINT a-z*
SCREEN 1,320,200,3,1*
WINDOW 1,"Battlestation",(0,0)-(311,185),20,1*
WIDTH 40*
PRINT "One moment, please..."*
DIM alien(4,4) 'Array to hold alien positions and speeds.*
RESTORE AlienShapeData*
FOR n=l TO 114 'Read data for alien shapes.*
READ a:alien?=alien?+CHR?(a)*
NEXT n*
OBJECT.SHAPE 1,alien?*
OBJECT.SHAPE 2,1 'Right screen alien.*
OBJECT.PLANES 2,7 'Right alien's color.*
OBJECT.SHAPE 3,1 'Bottom screen alien.*
OBJECT.PLANES 3,5 'Bottom alien's color.*
OBJECT.SHAPE 4,1 'Left screen alien.*
OBJECT.PLANES 4,5,6 'Left alien's color.*
RESTORE BattlestationData*
FOR n=l TO 162*
READ a:battle?=battle?+CHR?(a)*
NEXT n*
OBJECT.SHAPE 5,battle?*
RESTORE LaserData*
FOR n=l TO 66*
READ a:laser$=laser$+CHR?(a)*
NEXT n*
OBJECT.SHAPE 6,laser?*
OBJECT.SHAPE 7,6:clone=6 'Clone of laser bullet.*
'Define collision masks:*
OBJECT.HIT 1,2,12 'Aliens can hit bullets, battlestation...*
OBJECT.HIT 2,2,12*
OBJECT.HIT 3,2,12*
OBJECT.HIT 4,2,12*
OBJECT.HIT 5,4,2 'Battlestation can hit aliens.*
OBJECT.HIT 6,8,2 'Laser bullets can hit aliens...*
OBJECT.HIT 7,8,2*
'Define some more colors:*
PALETTE 4,1,.2,0 'Fire engine red.*
PALETTE 5,.73,1,0 'Lime green.*
PALETTE 6,.8,0,.93 'Purple.*
PALETTE 7,1,1,.13 'Yellow.*
Restart: 'Jump here to restart game.*
COLOR 1,2:CLS 'Black screen background.*
'Draw starfield:*
'Place battlestation on screen:*
OBJECT.X 5,142:OBJECT.Y 5,82*
'Define initial positions and speeds of aliens...*
'Second-dimension array elements = X,Y,VX,VY:*
RESTORE AlienData*
AlienData: 'Define starting alien positions and speeds.*
DATA 142,1,0,2,285,85,-4,0,142,175,0,-3,1,85,4,0*
'Place alien ships on screen:*
FOR n=l TO 4*
OBJECT.X n,alien(n,l):OBJECT.Y n,alien(n,2)*
NEXT n*
'Define directions and speeds:*
FOR n=l TO 4*
OBJECT.VX n,alien(n,3):0BJECT.VY n,alien(n,4)*
NEXT n*
score&=0:timestart&=TIMER*
OBJECT.START 1,2,3,4*
ON COLLISION GOSUB Collide:COLLISION ON*
GOTO MainLoop*
*
MainLoop:*
WHILE STICK(2)=0 AND STICK(3)=0:WEND*
GOSUB Joystick*
GOTO MainLoop*
Joystick:*
IF STICK(3)=-1 THEN 'Fire bullet upward.*
OBJECT.X clone,150:OBJECT.Y clone,80:OBJECT.ON clone*
OBJECT.VY clone,-90:OBJECT.VX clone,0*
OBJECT.START clone:RETURN*
END IF*
IF STICK(3)=1 THEN 'Fire bullet downward.*
OBJECT.X clone,150:OBJECT.Y clone,100:OBJECT.ON clone*
OBJECT.VY clone,90:OBJECT.VX clone,0*
OBJECT.START clone:RETURN*
END IF*
IF STICK(2)=-1 THEN 'Fire bullet leftward.*
OBJECT.X clone,135:OBJECT.Y clone,85:OBJECT.ON clone*
OBJECT.VX clone,-90:OBJECT.VY clone,0*
OBJECT.START clone:RETURN*
END IF*
IF STICK(2)=1 THEN 'Fire bullet rightward.*
OBJECT.X clone,170:OBJECT.Y clone,85:OBJECT.ON clone*
OBJECT.VX clone,90:OBJECT.VY clone,0*
OBJECT.OFF clone 'Turn off laser bullet.*
object=COLLISION(0) 'Which object had a collision?*
collID=COLLISION(object) 'Which object hit the object?*
IF collID<l THEN RETURN 'Ignore spurious border collisions.*
IF object=5 OR collID=5 GOTO BattlestationExplosion*
IF object=clone THEN object=collID 'Missile hit by alien.*
IF clone=6 THEN clone=7 ELSE clone=6 'Swap bullet clones.*
GOSUB BopAlien*
score&=score&+10:LOCATE 2,1:PRINT "SCORE =";3core&*
ON object GOSUB Alienl,Alien2,Alien3,Alien4*
OBJECT.VX object,alien(object,3)*
NEXT n*
LOCATE 2,1:PRINT "SCORE =" ; INT(score&+(TIMER-timestart&) )*
LOCATE 19,1:PRINT "PRESS FIRE BUTTON TO PLAY AGAIN"*
WHILE STRIG(3)=0:WEND*
DATA 0, 0, 0,127,128, 0, 1,255*
DATA 224, 0, 7,255,248, 0, 31,255*
DATA 254, 0,248,225,199,192,248,225*
DATA 199,192,255,255,255,192, 12,127*
DATA 140, 0, 12,127,140, 0,252, 0*
DATA
DATA 252, 0,227,134, 14, 56,254, 15*
DATA 7,248,252, 31,131,248,255,249*
DATA 255,248,255,249,255,248,252, 31*
DATA 131,248,254, 15, 7,248,227,134*
DATA 14, 56, 1,255,252, 0, 0, 63*
DATA 192, 0, 0, 63,192, 0, 0, 63*
DATA 192, 0, 0, 63,192, 0, 0, 31*
DATA 128, 0, 0, 31,128, 0, 0, 6*
DATA 0, 0, 0, 6, 0, 0, 0,127*
DATA 240, 0, 1,239,248, 0,227,223*
DATA 252, 56,255,255,255,248,255,255*
DATA 255,248,227,223,252, 56, 1,239*
DATA 248, 0, 0,127,240, 0, 0, 6*
DATA 255,240,127,224, 63,192, 31,128*
DATA 15, 15*
Program 4-8. OBJECT.CLIP Demo
SCREEN 1,320,200,2,1*
WINDOW 2,"Object Clip Demo",(0,0)-(311,185),20,1*
PALETTE 0,0,.45,0:PALETTE 1,.9,.9,.9*
PALETTE 2,0,0,0:PALETTE 3,.9,.48,.15*
ON BREAK GOSUB Quit:BREAK ON*
DIM alien?(114):RESTORE AlienShapeData*
PRINT "<<Click mouse to exit>>"*
WHILE MOUSE(0)=0*
OBJECT.X 1,MOUSE(1)-12:OBJECT.Y 1,MOUSE(2)-12*
WEND*
WHILE MOUSE(0)<>0:WEND*
Quit:*
OBJECT.CLOSE:WINDOW CLOSE 2:SCREEN CLOSE 1:END*
AlienShapeData:*