Beschleunigte(!) Bewegung mit Sin/Cos (2D)

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

Madde

Gast

Betreff: Beschleunigte(!) Bewegung mit Sin/Cos (2D)

BeitragSo, Sep 23, 2007 14:31
Antworten mit Zitat
Hallo,
Ich arbeite gerade an ein einem kleinen Spaceshooter und habe ein Problem beim bewegen der Spielfigur.
Die beschleunigte Bewegung funktioniert im Grunde, allerdings ist es zurzeit möglich die Geschwindigkeit p_maxspeed# zu überschreiten, wenn man "schräg" fliegt.

Ich muss also die Variablen p_speedx# und p_speedy# irgendwie verknüpen, da zurzeit die Maximalgeschwindigkeit entweder bei p_maxspeed# liegt (bei der Bewegung auf nur einer Achse), oder bei p_maxspeed# * 2 (bei der Bewegung auf zwei Achsen).

Auskommentiert ist ein Versuch das ganze zu realisieren, allerdings funktioniert das nicht so wie gewollt. (Die kleinere Geschwindigkeit geht gegen Null, die andere gegen p_maxspeed#).

Weiss jemand wie ich das Problem lösen kann, oder ist bereits der Ansatz mit zwei geschwindigkeitsvariablen falsch ?

Code: [AUSKLAPPEN]
Global xres = 1024, yres = 768
Graphics xres, yres, 32, 2
SetBuffer BackBuffer()
SeedRnd MilliSecs()

Global k_turnright =    205
Global k_turnleft =    203
Global k_accelerate =   200
Global k_brake =       208

Global accelerate_down
Global brake_down
Global turnleft_down
Global turnright_down


Global p_x# = xres Sar 1, p_y# = yres Sar 1
Global p_speedx#, p_speedy#, p_maxspeed# = 7, p_turnspeed#, p_maxturnspeed#=3
Global p_acceleration# = 0.2
Global p_angle ; , p_angle_math
Global p_frames = 72, p_frames_rotation_step = 360/p_frames
Global p_boost_on = 0

Dim p_pics(p_frames)
;p_pics(0) = LoadImage("player.bmp"):MaskImage p_pics(0), 255, 0, 255:MidHandle p_pics(0)



p_pics(0) = CreateImage(32,32)
SetBuffer ImageBuffer(p_pics(0))
Color 255, 255, 255
Line 0, 31, 15, 0
Line 31, 31, 15, 0
Rect 0, 31, 31, 1
SetBuffer BackBuffer()
MaskImage p_pics(0), 255, 0, 255:MidHandle p_pics(0)



TFormFilter 0
RotateImage p_pics(0), 90 ; ship has to look to right
For i = 1 To p_frames
   p_pics(i) = CopyImage(p_pics(0))
   RotateImage p_pics(i), i*(p_frames_rotation_step)
Next
TFormFilter 1


Repeat

  Cls
   
   get_input()
   update_player()
   If KeyHit(57) Then
      p_x = xres Sar 1
      p_y = yres Sar 1
   EndIf
   
   
   draw_player()
   
   Text 0,  0, "p_x:" + p_x#
   Text 0, 10, "p_y:" + p_y#
   Text 0, 20, "p_sx:" + p_speedx#
   Text 0, 30, "p_sy:" + p_speedy#
   Text 0, 40, "p_a:" + p_angle

   Text 0, 60, "sin p_a:" + Sin(p_angle)
   Text 0, 70, "cos p_a:" + Cos(p_angle)

  Flip 

Until KeyHit(1)

Function update_player()

   
   If accelerate_down + brake_down = 0 Then
      If p_speedx# > -0.1 And p_speedx# < 0.1 Then p_speedx# = 0
      If p_speedy# > -0.1 And p_speedy# < 0.1 Then p_speedy# = 0
   EndIf
   
   If p_boost_on = 1 Then
      If (p_speedx# < p_maxspeed#*2) And (p_speedx# > -p_maxspeed*2) Then ; accelerate
         p_speedx# = p_speedx# + Cos#(p_angle) * p_acceleration# * 2
      EndIf
      
      If (p_speedy# < p_maxspeed#*2) And (p_speedy# > -p_maxspeed*2) Then ; accelerate
         p_speedy# = p_speedy# + Sin#(p_angle) * p_acceleration# * 2
      EndIf   
   Else   
   
      If accelerate_down Then
         If (p_speedx# < p_maxspeed#) And (p_speedx# > -p_maxspeed#) Then      
            p_speedx# = p_speedx# + Cos#(p_angle) * p_acceleration#   
         EndIf   
         If p_speedy# < p_maxspeed# And (p_speedy# > -p_maxspeed) Then      
            p_speedy# = p_speedy# + Sin#(p_angle) * p_acceleration#   
         EndIf
      EndIf
         
      ;If accelerate_down Then
      ;   If Abs(p_maxspeed#) - Abs(p_speedy#) >= p_speedx# Then      
      ;      p_speedx# = p_speedx# + Cos#(p_angle) * p_acceleration#   
      ;   EndIf   
      ;   If Abs(p_maxspeed#) - Abs(p_speedx#) >= p_speedy# Then      
      ;      p_speedy# = p_speedy# + Sin#(p_angle) * p_acceleration#   
      ;   EndIf
      ;EndIf   
   EndIf
   
   If p_turnspeed# > -p_maxturnspeed# And turnleft_down Then ; turn left
      p_turnspeed# = p_turnspeed# - p_acceleration#
   EndIf
      
   If p_turnspeed# < p_maxturnspeed# And turnright_down Then ; turn right
      p_turnspeed# = p_turnspeed# + p_acceleration#
   EndIf
   
   p_angle = p_angle + p_turnspeed#
   If p_angle < 0   Then p_angle = p_angle + 360
   If p_angle > 359 Then p_angle = p_angle - 360
   
   If p_speedx# < 0 Then p_speedx# = p_speedx# + 0.1    
   If p_speedx# > 0 Then p_speedx# = p_speedx# - 0.1      
   
   If p_speedy# > 0 Then p_speedy# = p_speedy# - 0.1
   If p_speedy# < 0 Then p_speedy# = p_speedy# + 0.1
   
   p_x# = p_x# + p_speedx#
   p_y# = p_y# + p_speedy#
   
   If p_turnspeed# > 0 Then p_turnspeed# = p_turnspeed# - 0.1
   If p_turnspeed# < 0 Then p_turnspeed# = p_turnspeed# + 0.1
   


End Function

Function draw_player()
   DrawImage p_pics(p_angle/p_frames_rotation_step), p_x, p_y
End Function

Function get_input()
   accelerate_down =    KeyDown(k_accelerate)
   brake_down =       KeyDown(k_brake)
   turnleft_down =    KeyDown(k_turnleft)
   turnright_down =    KeyDown(k_turnright)   
End Function

Noobody

BeitragSo, Sep 23, 2007 14:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Sqr( p_speedx#^2 + p_speedy#^2 ) gibt dir die aktuelle Geschwindigkeit des Spielers zurück (einfacher Satz des Pythagoras), egal in welchem Winkel er sich bewegt.
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun
 

Madde

Gast

BeitragSo, Sep 23, 2007 15:17
Antworten mit Zitat
Okay, danke. Aber wenn ich die aktuelle Geschwindigkeit in die Abfrage einsetze, habe ich immer noch das gleiche Problem das eine der beiden speed Variablen langsam aber sicher gegen 0 geht :

Code: [AUSKLAPPEN]
If accelerate_down Then
         totalspeed# = sqr(p_speedx#^2 + p_speedy^2)
         If totalspeed# < p_maxspeed#  Then       
               p_speedx# = p_speedx# + Cos#(p_angle) * p_acceleration#       
               p_speedy# = p_speedy# + Sin#(p_angle) * p_acceleration#   
         EndIf
 EndIf

Hubsi

BeitragSo, Sep 23, 2007 15:49
Antworten mit Zitat
Benutzer-Profile anzeigen
So klappts:

Code: [AUSKLAPPEN]
px=px+p_speed#*Sin(p_angle)
py=py+p_speed#*-Cos(p_angle)


px und py stellen die Spielerposition dar, p_speed die Geschwindigkeit und p_angle den aktuellen Winkel im bereich von 0 bis 359 Grad.

So hast Du nur eine Geschwindigkeitsvariable und mit der kannst Du dann problemlos Dein acceleration verrechnen Very Happy
 

Madde

Gast

BeitragSo, Sep 23, 2007 16:20
Antworten mit Zitat
Oh Danke, das werd ich mal probieren.
Aber noch eine Frage am Rande: Du benutz +Sin(x) für die x-Koordinate und -cos(x) für die y-Koordinate. Inwiefern macht das einem Unterschied zu meinem +cos(x) und + sin(x) bzw. welche Methode ist richtig und warum ??

Hubsi

BeitragMo, Sep 24, 2007 7:55
Antworten mit Zitat
Benutzer-Profile anzeigen
-Cos() weil das mathematische Koordinatensystem nach oben (y-Achse) hin positiv wird, der Computer dreht das ganze aber auf den Kopf. Damit wird also die richtige Berehnung auf das falsche Koordinatensystem angepasst wenn man so will Very Happy

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group