.. .. .. ..   ..
BlitzBasic > Codearchiv > AllgemeinAktuallisiert 30.05.2009

..  GTA-Fahrzeug-Steuerung - von Rallimen 
Folgendes Programm stellt eine simple Fahrphysik eines Fahrzeuges in Draufsicht dar (GTA-Style also). Kann man natürlich noch an vielen Ecken verbessern, stellt aber schon die wichtigsten Werte dar.

Graphics 800,600,16,2 
Const ESC = 1,Hoch= 200,Runter=208,Links = 203,Rechts=205 , Space = 57 
Const Gas#= 0.06, Traegheit#=0.02, Speedmax=3 
Const Lenkspeed = 1 
Const Grafk_rotate = 5; hier nur durch 360 teilbares ; 1,2,3,4,5,6,8,9,10,12,15,18,usw. 
Const debugmode =1 
Anzahlblder_Auto = 360/Grafk_rotate 
Dim Auto (Anzahlblder_Auto );AutoGrafik_berechnen max 360 Einzelbilder < 

;############################################################################################ 
; Hier wird das Auto gezeichnet und als image gespeichert 
Auto(0) = CreateImage (40,20) ; also nur die erstellen die wirklich gebraucht werden! 
Color 128,128,128:Rect 0,0,40,20,1 : Color 255,255,128:Oval 33,3,5,5 :Oval 33,12,5,5 
GrabImage Auto(0),0,0 
; da die meisten ja ein eigenes Bild nehmen wollen welchen als Image auf der Platte ist 
; dann die 3 Zeilen entfernen und durch diese eine ersetzten 

;Auto(0) = LoadImage ("AutoBild.bmp") ; das Auto sollte nach rechts farhen   <<<<<<<<<<<<<<<< 
;falls das Auto in eine andere Richting zeigt dreht das Bild mit 
;RotateImage Auto(0),90                              ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
;drehen 
;############################################################################################ 


;Hier werden die benötigten Bilder gedreht 
For z = 0 To Anzahlblder_Auto  
    Auto(z) = CopyImage (Auto(0)) 
    RotateImage Auto(z),z* Grafk_rotate 
    HandleImage Auto(0),10,10 ; je nach Grösse des Bildes anpassen 
Next 
;AutoGrafik_berechnen max 360 Einzelbilder  ......fertig 



;startposition 
    positionX#  =  400 : positionY#  =  300 
    
SetBuffer BackBuffer() 
While Not KeyDown(ESC);####################################### 
   ; tasten abfrage 
   Grad#=((Grad+(KeyDown(Rechts)-KeyDown(Links))*Lenkspeed* speed#)+360)Mod 360 
   Speed# = Speed# +(KeyDown( Hoch) - KeyDown(Runter))*Gas# 
    
   If (KeyDown(Hoch)+KeyDown(Runter)) = 0 Then 
      If Speed# > 0 Then Speed# = Speed#  - Traegheit# ;langsam werden 
      If Speed# < 0 Then Speed# = Speed#  + Traegheit# ;langsam werden 
      If Speed# < Traegheit# And Speed# > (Traegheit#*-1) Then Speed# = 0; völliger Stillstand 
   End If 
   If speed# >  Speedmax     Then speed# =  Speedmax 
   If speed# < (Speedmax*-1) Then speed# = (Speedmax*-1) 

   ;Position ändern Auto 
    positionX#  = positionX# + Cos(Grad) * speed# 
    positionY#  = positionY# + Sin(Grad) * speed# 
    
   PositionY# = (PositionY#+GraphicsHeight ()) Mod GraphicsHeight() 
   PositionX# = (PositionX#+GraphicsWidth  ()) Mod GraphicsWidth () 

; berechnung welches Bild angezeigt wird 
; Beispiel Grafk_rotate = 5 bedeutet das nur 1 Bild für 5 Gradstufen  angezeigt wird 
  
Autograd = (grad+Grafk_rotate/2)/Grafk_rotate 
DrawImage  Auto(Autograd ),Int(positionX#),Int(positionY#) 
;#################################################### 
   Gosub Debug 
; speedbremse    
While MilliSecs()< fx : Wend : fx = MilliSecs()+16 ; 
   Flip :   Cls: 
   bwx= bwx +1:If MilliSecs() > oltZeit  + 999 BW = bwx:bwx = 0: oltZeit=  MilliSecs()  ;FPS 

Wend :End;################################################# 
.Debug 
  Text 10,10 ,"FPS:            " + BW: 
  Text 10,30 ,"Speed:          " + Speed# 
  Text 10,50 ,"Lenkspeed:      " + Lenkspeed 
  Text 10,70 ,"Grad:           " + Grad 
  Text 10,90 ,"Grad des Bildes:" +Autograd*Grafk_rotate 
Return