• Aucun résultat trouvé

b=(mx-2)/307 'Calculate new position of BLUE slider.-*

Dans le document in utilities, in (Page 131-139)

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:*

5 Sound

Dans le document in utilities, in (Page 131-139)