home *** CD-ROM | disk | FTP | other *** search
AMOS Source Code | 1997-10-04 | 4.7 KB | 149 lines |
- 'Load Iff "dh1:knockofftest.iff",0
- 'For A=0 To 31
- ' Get Sprite A+1,A*16,0 To A*16+16,16
- ' Hot Spot A+1,8,8
- 'Next
- Screen Open 0,320,256,4,0
- Curs Off : Flash Off : Paper 0 : Pen 1 : Cls 0
- Get Sprite Palette
- For A=1 To 15 : Colour A+16,Colour(A) : Next
- Palette 0,$888,$F
- Ink 3 : Bar 0,0 To 8,8
- Ink 1,0 : Extension_8_05E6 128,128,128
- ' Loch in der Mitte :)
- Ink 0 : Extension_8_05E6 128,128,32
- ' Nochn Loch...
- Extension_8_05E6 60,80,30
- RESOL=64
- X=20*RESOL
- Y=128*RESOL
- DREHWIN=64
- SCHOCK=0
- DI=0 : XSP=0 : YSP=0
- Do
- Multi Wait
- ' Auto hinmalen
- Sprite 2,X Hard(X/RESOL),Y Hard(Y/RESOL),DI/2+1
- ' Auto bewegen/driften lassen
- Add X,XSP
- Add Y,YSP
- ' Checken, ob Auto runtergefallen
- If Extension_8_039E(X/RESOL,Y/RESOL)<1
- X=20*RESOL : Y=128*RESOL
- XSP=0 : YSP=0
- SCHOCK=0
- End If
- ' Mauszeiger ist das Ziel f�r das Auto
- MX=X Screen(X Mouse)*RESOL
- MY=Y Screen(Y Mouse)*RESOL
- ' Jetzt kommts! Noch ist der Fu� nicht aufm Gaspedal :)
- BESCH=0
- ' DriftDirAc ist die genaue Richtung, in die das Auto im Moment driftet
- DRIFTDIRAC= Extension_8_16C2(XSP,YSP)
- ' Und nun die Driftrichtung von 0 bis DREHWIN
- DRIFTDIR=DRIFTDIRAC/16
- ' MIDDIR war mal so ne Idee, wird aber nicht mehr ben�tigt
- ' Das Auto f�hrt ja jetzt nicht mehr in Richtung MIDDIR (Mitte des Kreises),
- ' sondern versucht genau gegen die DRIFTDIR zu lenken (ESCAPEDIR).
- ' MIDDIR=Qarc(128*RESOL-X,128*RESOL-Y)/16
- ' Richtung, in die gelenkt werden soll, falls Abgrund nahe.
- ESCAPEDIR=(DRIFTDIR+32) mod DREHWIN
- ' Momentane Geschwindigkeit des Autos.
- SPEED= Extension_8_1366(XSP*XSP+YSP*YSP)
- ' Winkel zwischen Ziel (Mauszeiger) und Auto.
- TMP= Extension_8_16C2(MX-X,MY-Y)/16
- ' Maximal m�gliche Bremsgeschwindigkeit
- BREKSPEED=-4
- ' Zeit (Anzahl der Schritte), die ben�tigt wird, um ganz stehen zu bleiben.
- ST0PTIME=Abs(SPEED/BREKSPEED)
- ' Zeit, die ben�tigt wird, um das Auto in die richtige Richtung zu drehen.
- CHANGDIRTIME=Min(Abs(ESCAPEDIR-DI),(DREHWIN+1)-Abs(ESCAPEDIR-DI))
- ' Entfernung, die zur�ckgelegt werden w�rde, bis das Auto vollst�ndig st�nde.
- DIST=Abs((CHANGDIRTIME+ST0PTIME)*SPEED+(BREKSPEED*ST0PTIME*ST0PTIME)/2)
- ' Punkt auf dem Bildschirm, bei der das Auto zum stehen k�me.
- Add STPP,-1,1 To 8
- TX=X+ Extension_8_1114(DRIFTDIRAC,(DIST*STPP)/8)
- TY=Y+ Extension_8_1106(DRIFTDIRAC,(DIST*STPP)/8)
- ' War ne Idee, klappte auch ganz gut, war aber keineswegs perfekt.
- ' TX=X+XSP*ST0PTIME
- ' TY=Y+YSP*ST0PTIME
- ' F�llt Auto bald runter?
- ' Indikator f�r mich, damit ich seh, wo das Auto stehen bleiben w�rde.
- Sprite 4,X Hard(TX/RESOL),Y Hard(TY/RESOL),DRIFTDIR/2+1
- If Extension_8_039E(TX/RESOL,TY/RESOL)<1
- ' Schockiere das Auto und schick es weg.
- SCHOCK=Max(ST0PTIME+1,SCHOCK) : SCHOCKDIR=ESCAPEDIR
- OSC=Rnd(1)
- BESCH=4 : NNDIR=-1 : MSTP=0
- Gosub TESTITALL
- BESCH=-4 : Gosub TESTITALL
- If NNDIR>-1
- ESCAPEDIR=NNDIR : SCHOCK=2
- Else
- Colour 0,Rnd(4096)
- End If
- Inc STPP
- Else
- ' Falls es wieder Land sieht, kann der Schock schneller abnehmen (experimentell)
- If SCHOCK : Dec SCHOCK : End If
- End If
- ' Hier k�nnte man noch was einf�gen, damit das Auto, nicht dazwischen irgendwie reinf�llt.
- '
- ' Solange geschockt, soll es von der Klippe wegfahren.
- If SCHOCK Then TMP=SCHOCKDIR : Dec SCHOCK
- ' �bliche und bekannte Fahr-in-die-richtige-Richtung-Routine
- D1=Abs(TMP-DI)
- D2=(DREHWIN+1)-Abs(TMP-DI)
- If D1>0
- If D1<D2
- If DI<TMP
- Inc DI
- Else
- Dec DI
- End If
- Else
- D1=D2
- If DI>TMP
- Add DI,1,0 To 63
- Else
- Add DI,-1,0 To 63
- End If
- End If
- End If
- If D1<8 Then BESCH=4
- ' If D1>16 Then BESCH=-4
- ' Zeigt mir, ob das Auto gerade bremst oder beschleunigt.
- If BESCH=0 Then Colour 3,$F80
- If BESCH>0 Then Colour 3,$F0
- If BESCH<0 Then Colour 3,$F00
- ' Auto beschleunigen und Reibung berechnen.
- Add XSP, Extension_8_1114(DI*16,BESCH)-Sgn(XSP)
- Add YSP, Extension_8_1106(DI*16,BESCH)-Sgn(YSP)
- Loop
- End
- TESTITALL:
- AIMDIR=1
- Repeat
- NDIR=(DI+AIMDIR*((OSC*2)-1)+DREHWIN) mod DREHWIN
- XX=X : XXSP=XSP
- YY=Y : YYSP=YSP
- ODI=DI
- For STP=1 To 25
- Sprite 6,X Hard(XX/RESOL),Y Hard(YY/RESOL),ODI/2+1
- If Abs(NDIR-ODI)<(DREHWIN+1)-Abs(NDIR-ODI)
- Add ODI,Sgn(NDIR-ODI),0 To 63
- Else
- Add ODI,Sgn(ODI-NDIR),0 To 63
- End If
- ' Wait Vbl
- Add XX,XXSP
- Add YY,YYSP
- Add XXSP, Extension_8_1114(ODI*16,BESCH)-Sgn(XXSP)
- Add YYSP, Extension_8_1106(ODI*16,BESCH)-Sgn(YYSP)
- Exit If Extension_8_039E(XX/RESOL,YY/RESOL)<1
- If MSTP<STP : NNDIR=NDIR : MSTP=STP : End If
- Next
- OSC=1-OSC
- Inc AIMDIR
- Until AIMDIR>DREHWIN
- Return