driften - GTA aber richtig

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

geldi

Betreff: driften - GTA aber richtig

BeitragSo, Jan 11, 2004 10:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Leute !

Ich hab mir im Dezember Blitz2D download gekauft und mir erstmal den BBkurs2 von der Robsite reingezogen. Nach einigen SinCos + GTA tut´s (danke inpac) hab ich volgendes geschrieben.
Code: [AUSKLAPPEN]

Const scrnx = 800 , scrny = 600
Const vmax = 15 , rmax = -5 , lwmax = 5 , lwscale# = 0.75
Const beschleunigung# = 0.2 , verzoegerung# = 0.4 , reibung# = 0.02

Global x# = scrnx/2 , y# = scrny/2
Global speed#=0 , winkel=0 , lwinkel = 0

EnableDirectInput=True
Graphics scrnx , scrny , 16 , 1
SetBuffer BackBuffer ()
TFormFilter 0

Dim Auto(359)

Color 255,0,0:Rect 0,0,64,30
auto(0)= CreateImage(64,30)
GrabImage auto(0),0,0
MidHandle auto(0)
For winkel = 1 To 359
   auto(winkel) = CopyImage (auto(0))
   MidHandle auto(winkel)
   RotateImage auto(winkel),winkel
Next

While Not KeyHit (1)
   CarControl ()
   MovePlayer ()   
   RenderGame ()
Wend

End

Function CarControl ()
   
   lwinkel = Int(speed * lwscale)
   If lwinkel > lwmax Then lwinkel = lwmax
   If lwinkel < -lwmax Then lwinkel= -lwmax
   
   If KeyDown (203) Then winkel = winkel - lwinkel;links
   If KeyDown (205) Then winkel = winkel + lwinkel;rechts
   
   If winkel > 359 Then winkel = winkel - 360
   If winkel < 0 Then winkel = 360 + winkel
   
   If KeyDown (200) Then ; Gas
      speed = speed + beschleunigung   
      If speed > vmax Then speed=vmax
   EndIf
      
   If KeyDown (208) Then ; Bremse / rueckwaerts
      speed = speed - beschleunigung
      If speed < rmax Then speed=rmax
   EndIf

   If KeyDown (57) Then ; Handbremse
       If speed > 0 Then
         speed = speed - verzoegerung
         If speed < 0 Then speed=0
      EndIf
      If speed < 0 Then
         speed = speed + verzoegerung
         If speed > 0 Then speed=0
      EndIf
   End If
   
   If speed > 0 Then
      speed = speed - reibung
      If speed < 0 Then speed=0
   EndIf
   If speed < 0 Then                     
      speed = speed + reibung
      If speed > 0 Then speed=0
   EndIf

End Function

Function MovePlayer ()

   If x > scrnx Then x = 1
   If x < 0 Then x = scrnx
   If y > scrny Then y = 1
   If y < 0 Then y = scrny

   x = x + (Cos(winkel) * speed)
   y = y + (Sin(winkel) * speed)

End Function

Function RenderGame ()

   Cls
   DrawImage Auto(winkel),x,y
   Color 255,255,255
   Text 8, 8,"Speed  : " + Str(speed)
   Text 8,24,"Winkel : " + Str(winkel)
   Text 8,40,"LWinkel: " + Str(lwinkel)
   Text 8,56,"X-Pos  : " + Str(x)
   Text 8,72,"Y-Pos  : " + Str(y)
   Flip

End Function


Nun meine Frage !
Wie erreiche ich ein übersteuern (ausbrechen des Hecks) bei zu schneller Kurvenfahrt oder Handbremse in Kurve.
Ich hab schon versucht den ImageHandle richtung Vorderachse zu verschieben aber das bringt mich nicht wirklich weiter.
(müste man in mehreren Phasen für alle 360 Bilder machen)

Ich bin sehr gespannt auf eure Vorschläge
 

konstantin

BeitragSo, Jan 11, 2004 10:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Du könntest natürlich einfach das Auto drehen, dann hättest du den Drehpunkt zwar nicht auf der Vorder-Achse, aber wenn es realistisch wirken soll, musst nu mit ImageHandle ungefähr die Vorderachse nehmen, das ist ja meißtens auch der Drehpunkt von einm normale Auto. Bei Übersteuerung dann halt statt z.B. 1 Grad bewegen halt 3.

Travis

BeitragSo, Jan 11, 2004 11:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Das würde mich auch mal interessieren. Habe auch mal sowas geschrieben. Ist aber vom Handling deiner Version ziemlich ähnlich.
http://home.t-online.de/home/Daniel.Nobis/Auto.rar(9kb)

Was die Handbremse angeht, so habe ich es bei mir noch so gemacht, daß das Auto leicht zur Seite zieht
www.funforge.org

Ich hasse WASD-Steuerung.

Man kann alles sagen, man muss es nur vernünftig begründen können.

geldi

BeitragSo, Jan 11, 2004 11:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Idee !
Eine Variable für die Fahrtrichtung und eine zweite für die Richtung in die das Auto schaut.
Wenn drift dann Schaurichtung in kurve drehen und Lenkwinkel erhöhen.
Wenn drift ende dann Fahrtrichtung = Schaurichtung.

Was den Drehpunkt betrifft so gehört er bei normaler Fahrt eher auf dir Hinterachse sonst fährt es sich wie ein Gabelstabler mit Hecklenkung.

Vielen Dank schonmal
mfg geldi

Vertex

BeitragSo, Jan 11, 2004 12:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi!
Ich würde es so machen, wenn er Handbremse zieht, normal bremst oder
einfach sich zu schnell in die Kurve legt (bei einer Überschreitung der
vorgeg. Geschwindigkeit) versetzt Du den Drehpunkt von Automitte
je nach intensität nach vorne. Das dürfte den Drifteffekt einfach umsetzen.
mfg olli
vertex.dreamfall.at | GitHub

Mr.Keks

BeitragSo, Jan 11, 2004 13:02
Antworten mit Zitat
Benutzer-Profile anzeigen
http://www.blitzbase.de/quellc...unigung.bb


mein vorschlag wäre: man gibt dem auto zwei punkte, die eigene x- und ygeschwindigkeiten haben. natürlich verfügen beide punkte über eine gewisse trägheit. richtung und geschwindigkeit wirken sich dabei auf den einen der punkte, oder bei allrad auf beide, aus. mit etwas winkel- und abstandsberechnungen wird dafür gesorgt, dass beide punkte immer den gleich abstand behalten. die geschwindigkeiten der beiden punkte wirken sich aufeinander aus, indem sie immer versuchen dieselbe geschwindigkeit zu erhalten, was natürlich dazu führen kann, dass der hintere den vorderen oder der vordere den hinteren irgendwohin zieht.
MrKeks.net

geldi

BeitragSa, Jan 17, 2004 11:36
Antworten mit Zitat
Benutzer-Profile anzeigen
So geschafft !

Das auto driftet jetzt sehr schöhn und reagiert magnetisch auf 90 Grad Winkel so das man die Straßen besser trift.
Durch pfriemeln an den Constanten läst sich das Fahr+ Driftverhalten sehr gut einstellen. Wer die Lenkhilfe nicht mag möge sie abschalten.

Code: [AUSKLAPPEN]

Const scrnx = 800, scrny = 600
Const vmax = 10 , rmax = -5 , lwmax = 5 , lwscale# = 0.75
Const beschleunigung# = 0.15 , verzoegerung# = 0.3 , reibung# = 0.02
Const dwmax = 45, dwstep = 3 , dlw = 4
Const lhspeed = 5 , lhrange = 25

Global x# = scrnx/2 , y# = scrny/2
Global speed#=0 , winkel=0 , lwinkel = 0
Global drift , driftOld , face , faceOld , driftwinkel

EnableDirectInput=True
Graphics scrnx , scrny , 16 , 1
SetBuffer BackBuffer ()
TFormFilter 0

Dim Auto(359)

Color 255,0,0:Rect 0,0,64,30
auto(0)= CreateImage(64,30)
GrabImage auto(0),0,0
MidHandle auto(0)
For winkel = 1 To 359
   auto(winkel) = CopyImage (auto(0))
   MidHandle auto(winkel)
   RotateImage auto(winkel),winkel
Next

While Not KeyHit (1)
   CarControl ()
   MovePlayer ()   
   RenderGame ()
Wend

End

Function CarControl ()
   
   lwinkel = speed * lwscale : driftspeed = 0 : kurve=0

   If lwinkel > lwmax  Then lwinkel =  dlw : driftspeed = 1
   If lwinkel < -lwmax Then lwinkel = -dlw : driftspeed = 1
   
   If KeyDown (203) = True And KeyDown (205) = False Then   ;links
      winkel = winkel - lwinkel
      kurve = -1
   End If
   
   If KeyDown (205) = True And KeyDown (203) = False Then   ;rechts
      winkel = winkel + lwinkel
      kurve = 1
   End If
      
   If winkel > 359 Then winkel = winkel - 360
   If winkel < 0 Then winkel = 360 + winkel
   
   If KeyDown (200) = True And KeyDown (208) = False Then   ;vorwaerts
      speed = speed + beschleunigung   
      If speed > vmax Then speed=vmax
   EndIf
      
   If KeyDown (208) = True And KeyDown (200) = False Then   ;rueckwaerts
      speed = speed - beschleunigung
      If speed < rmax Then speed=rmax
   EndIf

   If speed > lhspeed And kurve = 0 Then   ; lenkhilfe
      If winkel >   0 And winkel <   0 + lhrange Then winkel = winkel - 1     
      If winkel > 360 - lhrange And winkel < 360 Then winkel = winkel + 1
      If winkel > 180 And winkel < 180 + lhrange Then winkel = winkel - 1
      If winkel > 180 - lhrange And winkel < 180 Then winkel = winkel + 1
      If winkel <  90 + lhrange And winkel >  90 Then winkel = winkel - 1
      If winkel <  90 And winkel >  90 - lhrange Then winkel = winkel + 1
      If winkel < 270 And winkel > 270 - lhrange Then winkel = winkel + 1
      If winkel > 270 And winkel < 270 + lhrange Then winkel = winkel - 1
      If winkel > 359 Then winkel = winkel - 360
      If winkel <   0 Then winkel = 360 + winkel
   End If

   driftOld=drift : drift=0 : faceOld=face : face=winkel

   If driftspeed And kurve <> 0 Then   ;driften
      drift=1 : driftwinkel = driftwinkel + dwstep
      If driftwinkel > dwmax Then driftwinkel = dwmax
      face = winkel + driftwinkel * kurve
      If face > 359 Then face = face -360
      If face < 0 Then face = face +360
   End If

   If driftold And drift=0 Then   ;drift ende
      face=faceold
      winkel = face
      driftwinkel = 0
   End If

   If KeyDown (57) Then ; Bremse
      If speed > 0 Then
         speed = speed - verzoegerung
         If speed < 0 Then speed=0
      EndIf
      If speed < 0 Then
         speed = speed + verzoegerung
         If speed > 0 Then speed=0
      EndIf
   End If
   
   If speed > 0 Then
      speed = speed - reibung
      If speed < 0 Then speed=0
   EndIf
   
   If speed < 0 Then                     
      speed = speed + reibung
      If speed > 0 Then speed=0
   EndIf

End Function

Function MovePlayer ()

   x = x + (Cos(winkel) * speed)
   y = y + (Sin(winkel) * speed)
   If x > scrnx Then x = 0
   If x < 0 Then x = scrnx
   If y > scrny Then y = 0
   If y < 0 Then y = scrny

End Function

Function RenderGame ()

   Cls
   DrawImage Auto(face),x,y
   Color 255,255,255
   Text 8, 8,"Speed  : " + Str(speed)
   Text 8,24,"Winkel : " + Str(winkel)
   Text 8,40,"LWinkel: " + Str(lwinkel)
   Text 8,56,"X-Pos  : " + Str(x)
   Text 8,72,"Y-Pos  : " + Str(y)
   Flip

End Function


mfg geldi

skey-z

BeitragMi, Mai 18, 2005 21:36
Antworten mit Zitat
Benutzer-Profile anzeigen
sry, aber habe gerade mal deinen Code ausprobiert und nachdem ich noch

if keyhit(200)=true and keyhit(208)=false

durch

if keyhit(200)=true and speed<=1

ersetzt hatte, weil es einfach zu schnell lief, hab ich nichts von drifting gemerkt.
Awards:
Coffee's Monatswettbewerb Feb. 08: 1. Platz
BAC#57: 2. Platz
Twitter
 

gamble

BeitragDo, Mai 19, 2005 14:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Herzlichen Glückwunsch, Sie haben gerade einen mehr als ein Jahr alten Beitrag heraufgeholt Wink

skey-z

BeitragDo, Mai 19, 2005 16:41
Antworten mit Zitat
Benutzer-Profile anzeigen
bin auch nur über nen anderen Link drauf gestoßen und hab auch nicht aufs datum geschaut

also sorry

da sieht man aber mal wieder, was die mods an arbeit erbracht haben, wenn sie so altes zeugs nicht closen
Awards:
Coffee's Monatswettbewerb Feb. 08: 1. Platz
BAC#57: 2. Platz
Twitter

BladeRunner

Moderator

BeitragDo, Mai 19, 2005 16:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Alter ist kein Grund für einen Close Wink
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
 

x.Force

BeitragDo, Mai 19, 2005 17:44
Antworten mit Zitat
Benutzer-Profile anzeigen
oh ich bin dir dankbar Smile hört sich interessant an das thema *g*

und es ist allerdings kein grund für nen close nur weil es alt ist ...

AMD Athlon XP 2000+ | 1024mb DDR-Ram | Asus Radeon 9600XT | BENQ FP757 17°Zoll TFT

Was kümmert mich mein Geschwätz von gestern? (Konrad Adenauer) -.-

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group