(********************************************************************* -:Program. Animation.mod -:Author. Pit Burkhardt :Address. Stettinerstraße 25 7030 Böblingen :Phone. ---- -:shortcut. [pit] -:Version. 0.1 -:Date. 19.06.1988 -:Copyright. PD -:Language. Modula-II -:Translator. M2Amiga -:Imports. ---- -:UpDate. ---- -:Contents. Gel generating PROCEDUREs Usage Demo :Remark. ---- **********************************************************************) MODULE Animation; FROM Arts IMPORT TermProcedure,BreakPoint,Assert; FROM SYSTEM IMPORT ADR,ADDRESS,WORD; FROM Exec IMPORT UByte; FROM Graphics IMPORT ViewModeSet,InitGels,VSpriteFlags,VSpriteFlagSet, InitMasks,AddBob,SortGList,DrawGList,(*collTable,*) BobFlags,BobFlagSet,WaitTOF,SetAPen,Move,Draw, VSpritePtr,BobPtr,GelsInfoPtr,AllocRaster,FreeRaster, ViewPortPtr,RastPortPtr, AnimComp,AnimOb,AnimCompPtr,AnimObPtr,AddAnimOb, Animate,ringtrigger,animhalf; FROM Intuition IMPORT ShowTitle; FROM Heap IMPORT AllocMem; FROM OpenBDW IMPORT SCRH,SCRW,OpenBackDrop,ScreenP,BDWindowP; FROM PB IMPORT PB1,PB2,PB3,PB4,PB5,PB6,PB7, Imgwidth,Imgheight,Imgdepth,ImgPtr; FROM GelMacros IMPORT MakeBob,BackMem,XOFFSET,POSFAKTOR,MakeAnimComp, LinkAnimComps,MakeAnimOb,DoRingTrigger,DoRingTriggerOFF, MoveAnimOb,Velocity,Acceleration; CONST FIRSTCOMP=0; LASTCOMP=11; LASTBOB=PB7; VAR MyVPort :ViewPortPtr; MyRPort :RastPortPtr; i :LONGCARD; (* Für GelsInfo *) VSprPt1,VSprPt2 :VSpritePtr; (* Für die Bobs *) VSprPt :ARRAY [FIRSTCOMP..LASTBOB] OF VSpritePtr; BobP :ARRAY [FIRSTCOMP..LASTBOB] OF BobPtr; (* Für die Animation *) BobPtARRAY :ARRAY [FIRSTCOMP..LASTCOMP] OF BobPtr; CompP :ARRAY [FIRSTCOMP..LASTCOMP] OF AnimCompPtr; ObP :AnimObPtr; ObKey :ADDRESS; Time :ARRAY [FIRSTCOMP..LASTCOMP] OF INTEGER; ObRec :AnimOb; (* für den Loop *) Ciapra [0BFE001H] : SET OF (s0,s1,s2,s3,s4,s5,lmb); KnockX,KnockY :BOOLEAN; PROCEDURE CleanUp; BEGIN FOR i:=FIRSTCOMP TO LASTBOB DO BackMem(BobP[i]); (* Nicht vergessen!!!!! *) END; END CleanUp; PROCEDURE CheckIt(ObjectP:AnimObPtr):WORD; (************************************************************************) (*** Diese Funktion wird nach jedem Ringdurchlauf des AnimObs auf- ***) (*** gerufen. Dazu muß ihre Addresse an MakeAnimOb übergeben werden. ***) (*** Die Funktion muß einen Wert des Typs WORD zurückgeben!! ***) (************************************************************************) CONST XMIN=POSFAKTOR*100; XMAX=POSFAKTOR*500; YMIN=POSFAKTOR*20; YMAX=POSFAKTOR*140; REALOFFSET=POSFAKTOR*XOFFSET; BEGIN IF (ObjectP^.anX>=XMAX-REALOFFSET) THEN ObjectP^.xVel:=-ABS(ObjectP^.xVel); ELSIF(ObjectP^.anX<=XMIN-REALOFFSET) THEN ObjectP^.xVel:=ABS(ObjectP^.xVel); END; IF (ObjectP^.anY>=YMAX) THEN ObjectP^.yVel:=-ABS(ObjectP^.yVel); ELSIF(ObjectP^.anY<=YMIN) THEN ObjectP^.yVel:=ABS(ObjectP^.yVel); END; RETURN 0 END CheckIt; BEGIN (*MAIN*) (************************************************************************) (*** Alles vorbereiten, Screen und Fenster auf ***) (************************************************************************) TermProcedure(CleanUp); OpenBackDrop(Imgdepth); MyRPort:=BDWindowP^.rPort; MyVPort:=ADR(ScreenP^.viewPort); KnockX:=TRUE; KnockY:=TRUE; (************************************************************************) (*** Anzeigedauer der einzelnen AnimComps in ARRAY schreiben ***) (************************************************************************) Time[0]:=50; (* Mittelstellung *) Time[1]:=1; Time[2]:=1; Time[3]:=1; Time[4]:=1; Time[5]:=1; Time[6]:=1; (* Mittelstellung *) Time[7]:=1; Time[8]:=1; Time[9]:=1; Time[10]:=1; Time[11]:=1; (************************************************************************) (*** Bobs initialisieren, die mit (**) gekennzeichneten Parameter ***) (*** werden in MakeAnimComp überschrieben, sodaß irgendwas ***) (*** eingesetzt werden kann ***) (************************************************************************) FOR i:=0 TO LASTBOB DO MakeBob( BobP[i],VSprPt[i], Imgwidth,Imgheight,Imgdepth, ImgPtr[i], 3,3, 0(**),0(**), BobFlagSet{}(**),VSpriteFlagSet{}(**), NIL(**), MyRPort); Assert(BobP[i]<>NIL,ADR("Kein Bob-Pointer")); END; (************************************************************************) (*** Bobs werden für die AnimComps mehrfach verwendet ***) (************************************************************************) BobPtARRAY[0]:=BobP[PB1]; BobPtARRAY[1]:=BobP[PB2]; BobPtARRAY[2]:=BobP[PB3]; BobPtARRAY[3]:=BobP[PB4]; BobPtARRAY[4]:=BobP[PB3]; BobPtARRAY[5]:=BobP[PB2]; BobPtARRAY[6]:=BobP[PB1]; BobPtARRAY[7]:=BobP[PB5]; BobPtARRAY[8]:=BobP[PB6]; BobPtARRAY[9]:=BobP[PB7]; BobPtARRAY[10]:=BobP[PB6]; BobPtARRAY[11]:=BobP[PB5]; (************************************************************************) (*** dem Key die Addresse eines leeren AnimOb-Records zuweisen ***) (************************************************************************) ObKey:=ADR(ObRec); (* Oder statt dessen: ObKey:=NIL; InitAnimate(ObKey); (FROM GfxMacros ...) Geht auch *) (************************************************************************) (*** MakeAnimOb aufrufen, fertige Bobs etc. übergeben ***) (************************************************************************) MakeAnimOb(ObP,CompP,BobPtARRAY,320,100,Time,LASTCOMP,ADR(CheckIt),FALSE); (************************************************************************) (*** neues AnimOb in die Liste aufnehmen ***) (************************************************************************) AddAnimOb(ObP,ObKey,MyRPort); (************************************************************************) (*** Position und Geschwindigkeit einstellen ***) (************************************************************************) MoveAnimOb(ObP,320,100); Velocity(ObP,200,100); (************************************************************************) (*** ...und ab geht's... ***) (************************************************************************) WHILE lmb IN Ciapra DO Animate(ObKey,MyRPort); SortGList(MyRPort); (* Bei nur einem AnimOb eigentlich nicht nötig *) WaitTOF(); DrawGList(MyRPort,MyVPort); END; END Animation.