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

MaddeGastBetreff: Beschleunigte(!) Bewegung mit Sin/Cos (2D) |
![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
MaddeGast |
![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() |
||
MaddeGast |
![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
-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 ![]() |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group