; ; IsoBlaster V0.1 by Simon Armstrong ; ; ; Typdefinitionen und Felder ; NEWTYPE .object ;wie IsoRender.bb plus extra Felder depth.q:id ;Tiefe und Shape, wobei ID 0=me 1=mozzy x:y:z ;3D Koordinaten der Shape vx:vy ;Geschwindigkeit in x and y-Richtung rot:rot2:rotv ;Variablen fuer die Rotation sx:sy ;Screenposition nach der Iso-Projection End NEWTYPE Dim List bob.object(50) DEFTYPE .object *me Dim qsin(255),qcos(255) ;Feld mit Werten fuer sin/cos belegen sodass sie nicht For r=0 To 255 ;waehrend des Spiels berechnet werden muessen qsin(r)=Sin(Pi*r/128):qcos(r)=Cos(Pi*r/128) Next Dim map.w(20,20) ;bisschen kleiner als Verlies (z.Zt.) ; ; Alle Graphiken von der Platte laden ; LoadShapes 0,"blocks.shapes" ;Fliesen fuer Boden LoadShapes 4,"balls.shapes" ;Kugeln fuer fx etc. LoadPalette 0,"balls.iff" ;Palette fuer Vordergrund Playfield LoadPalette 0,"blocks.iff",8 ;Palette fuer Hintergrund LoadShapes 16,"isoshapes" ;Shapes, von IsoRender.bb berechnet BitMap 0,320+64,256+80,3 ;Vordergrund A BitMap 1,320+64,256+80,3 ;Vordergrund B BitMap 2,640,512,3 ;Grosser Hintergrund zum Scrollen Queue 0,32:Queue 1,32 ;2 Queues fuer doppelt gepuffertes Blitting Macro p 320+(`1-`2)ASL 4,128+(`1+`2-`3)ASL3:End Macro ;hinten Macro f 320+32-sx+(`1-`2)ASL4,128+32-sy+(`1+`2-`3)ASL3:End Macro ;vorne ; ; Blitz Mode Display erzeugen, hier Dualplayfield mit ; doppelt gepuffertem Vordergrund! ; BLITZ Slice 0,44,320,256,$fffa,6,8,32,320+64,640 Use Palette 0 Gosub setupmap ;2D-Feld mit einigen Bloecken belegen Gosub drawmap ;Karte in den Hintergrund zeichnen Gosub initgame ;Objekte initialisieren ; nun endlich die Arbeitsschleife, wie bei jedem Spiel While Joyb(0)=0 VWait:ShowF db,32,40,sx:ShowB 2,sx,sy,32 ;Bitmaps im Display positionieren db=1-db:Use BitMap db ;Bitmap tauschen fuer doppelte Pufferung Gosub moveme ;mich bewegen Gosub movethem ;und die anderen auch UnQueue db:Gosub drawbobs ;Objekte in neue Position zeichnen ; MOVE#-1,$dff180 ;Frameaufbau beachten! Wend End ; ; und dies hier bringt alles richtig zum Laufen ; .moveme: USEPATH *me ;Zeiger auf Listenobjekt \rot=QWrap(\rot-Joyx(1)/2,0,16) ;je nach Joystick drehen If Joyb(1)=1 ;bei Feuer \vx+qsin(\rot ASL 4) ASR 6 ;Schub in die Richtung, \vy+qcos(\rot ASL 4) ASR 6 ;in die ich zeige (my \rot) EndIf \vx-\vx ASR 5 ;einen Teil des Betrags der \vy-\vy ASR 5 ;Geschwindigkeit abziehen und \x=QLimit(\x+\vx,0,19) ;Geschwindigkeit zu der Position addieren \y=QLimit(\y+\vy,0,19) \sx=!p{\x,\y,\z} ;Bildschirmkoordinaten berechnen sx=QLimit(\sx-160,0,320) ;Werte zum Scrollen berechnen sodass sy=QLimit(\sy-128,0,256) ;ich moeglichst in die Mitte des Displays komme \sx-sx+32:\sy-sy+32 \depth=\x+\y ;die Tiefe nicht vergessen If map(\x,\y)=1 ;und den Block einfaerben wenn ich auf einem bin Use BitMap 2:x=Int(\x):y=Int(\y):Blit 2,!p{x,y,0}:Use BitMap db EndIf Return .movethem: USEPATH bob() ;einfache Schleife, die alle Shapes ResetList bob() ;mit \id=2 in Kreisen While NextItem(bob()) ;herumfliegen laesst... If \id=2 \rot=QWrap(\rot+\rotv,0,16) \rot2=QWrap(\rot2+1,0,16) \x+qsin(\rot ASL 4) ASR 4:\y+qcos(\rot ASL 4) ASR 4 \sx=!f{\x,\y,\z} \depth=\x+\y EndIf Wend .drawbobs: SortList bob() ;rueckwaerts sortieren ResetList bob() ;Schleife ueber alle Shapes: zeichnen und wenn USEPATH bob() ;\id=2 auch den Propeller zeichnen While NextItem(bob()) If RectsHit(\sx,\sy,1,1,16,40,320+31,256+40) QBlit db,\id*16+\rot,\sx,\sy If \id=2 Then QBlit db,\id*16+16+\rot2,\sx,\sy EndIf Wend Return .initgame: ClearList bob() AddItem bob():*me.object=bob() *me\id=1,.5,.5,0 For i=0 To 2 If AddItem(bob()) bob()\id=2,Rnd(19),Rnd(19):\rotv=(Rnd(1)-.5)ASR 2 EndIf Next Return .setupmap: For x=0 To 19:For y=0 To 19:map(x,y)=1:Next:Next For x=9 To 11:For y=9 To 11:map(x,y)=-1:Next:Next Return .drawmap: Use BitMap 2 For x=0 To 19 For y=0 To 19 If map(x,y)>-1 Then Blit map(x,y),!p{x,y,0} Next Next Return