Unlogische Mathematik

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

b3_newbie

Betreff: Unlogische Mathematik

BeitragFr, Feb 17, 2006 16:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi zusammen,

Also ich habe nochmals eine Frage zu dem Thema Beschleunigung. Mein Code macht Probleme.. Deshalb schaut ihn euch vielleicht besser zuerst an:

Maximales Tempo:
Code: [AUSKLAPPEN]
max_speed = 20


Beschleunigung per Tastendruck:
Code: [AUSKLAPPEN]
If KeyDown(205) = 1 Then xspeed = xspeed + (acc#*diff_time)
If KeyDown(200) = 1 Then yspeed = yspeed - (acc#*diff_time)


Jetzt kommt das Problem.. Wenn ich bloss eine Taste drücke, dann stimmt die Speedgrenze 20. Logischerweise werden beide Tasten addiert, also bekomme ich dann 40 als Maximalgeschwindigkeit, jedoch wollte ich doch nur 20. Deshalb habe ich folgendes versucht, klappt aber nicht..

Code: [AUSKLAPPEN]
Global velocity#
velocity = (xspeed+yspeed)
;
;
If velocity > max_speed Then velocity = max_speed


Wisst ihr was zu tun wäre?

Spikespine

BeitragFr, Feb 17, 2006 16:40
Antworten mit Zitat
Benutzer-Profile anzeigen
die gesamtgeschwindigkeit des vektors bekommst du durch den satz des pythagoras
Code: [AUSKLAPPEN]
velocity = Sqr(xspeed^2+yspeed^2)


bringt dir hier aber nix. Razz

Informier dich über Sinus und Cosinus, damit geht das, hab grad keine zeit, vielleicht schreib ich hinterher was dazu wenn es noch keiner vor mir getan hat^^
Athlon 64 3700+ | 1024 MB RAM | GeForce 7900 GT | Blitz2D, Blitz3D, BlitzPlus, BlitzMax
 

HW

BeitragFr, Feb 17, 2006 17:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Jop, Sinus und Kosinus sind hier die Lösung. Du musst einerseits einen Winkel als Bewegungsrichtung und andererseits eine Geschwindigkeit speichern. Dann addierst du zur X Koordinate den Kosinus des Winkels mit der Geschwindigkeit multipliziert und zur Y Koordinate den Sinus, auch multipliziert.
Sinus und Kosinus rechnet man übrigens mit ql:sin und ql:cos aus.

Cardonic

BeitragFr, Feb 17, 2006 17:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi

Ich hatte diese Woche in der Schule ein wenig Trigonometrie, desshalb kann ich dir helfen:
Code: [AUSKLAPPEN]
winkel = Atan(yspeed/xspeed) ; Winkel berechnen
If Abs(xspeed/Cos(winkel)) > maxspeed then ; Gesamtgeschwindigkeit abfragen
   xspeed = Cos(winkel)*maxspeed ; xSpeed ausrechnen
   yspeed = Sin(winkel)*maxspeed ; ySpeed ausrechnen
Endif


Ich hoffe, dass das stimmt (ich habe es nicht getestet Confused )

mfg Cardonic

PS: Mathematik ist immer logisch (wenn es auch nicht immer so aussieht Laughing )

[edit] benutze für die sin,cos,atan-berechnungen Float-Variabeln, sonst wird es überhaupt nicht genau [/edit]

[edit 2] hab's getestet : es stimmt *uff* Very Happy [/edit 2]
If you should go skating on the thin ice of modern life, dragging behind you the silent reproach of a million tear-stained eyes, don't be surprised when a crack in the ice appears under your feet.
  • Zuletzt bearbeitet von Cardonic am Sa, Feb 18, 2006 13:08, insgesamt 2-mal bearbeitet
 

HW

BeitragFr, Feb 17, 2006 17:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Es stimmt nicht, denn: Er will Maxspeed ja nur als Maximalgeschwindigkeit, nicht als konstante Geschwindigkeit. Außerdem löst das ja nicht das Problem, dass sich XSpeed und YSpeed auf einen Wert über MaxSpeed addieren. Da müsste man sich schon etwas mehr einfallen lassen.
  • Zuletzt bearbeitet von HW am Fr, Feb 17, 2006 17:27, insgesamt einmal bearbeitet

Cardonic

BeitragFr, Feb 17, 2006 17:27
Antworten mit Zitat
Benutzer-Profile anzeigen
@ HW : was denkst du, warum ich Code: [AUSKLAPPEN]
If Abs(xspeed/Cos(winkel)) > maxspeed then
eingebaut habe ?

mfg Cardonic
If you should go skating on the thin ice of modern life, dragging behind you the silent reproach of a million tear-stained eyes, don't be surprised when a crack in the ice appears under your feet.
  • Zuletzt bearbeitet von Cardonic am Sa, Feb 18, 2006 13:08, insgesamt einmal bearbeitet

hectic

Sieger des IS Talentwettbewerb 2006

BeitragFr, Feb 17, 2006 23:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Die MaxSpeed mit einer If-Abfrage zu begrenzen führt dazu, daß es keine realistische Begrenzung darstellt. Die Lösung sollte daher komplett auf mathematischem Wege durchgeführt werden. Dafür habe ich mal ein kleinen Code erstellt. Die Beschleunigungswerte lassen sich mit der Variable 'Beschleunigung' beeinflussen. Die Maximalgeschwindigkeit eines Körpers lässt sich mit der Variable 'MaxiXSpeed' beeinflussen... Hoffe das es das ist was du suchst?!Code: [AUSKLAPPEN]
Graphics 400,400,0,2
SetBuffer BackBuffer()

XPosition#=100
TempXSpeed#=0
MaxiXSpeed#=20
Beschleunigung#=.1

While Not KeyHit(1)
 If KeyDown(203) Then TempXSpeed=TempXSpeed-Beschleunigung
 If KeyDown(205) Then TempXSpeed=TempXSpeed+Beschleunigung
 TempXSpeed=TempXSpeed/(1+Beschleunigung)
 XPosition=XPosition+TempXSpeed*MaxiXSpeed
 If XPosition>400 XPosition=XPosition-400
 If XPosition<0 XPosition=XPosition+400
 Rect XPosition,190,1,20,0
 Text 0,64,"Endgeschwindigkeit: "+TempXSpeed*MaxiXSpeed
 Flip
 Cls
Wend
End

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSa, Feb 18, 2006 0:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Sorry, hab deine Frage mir nochmal durchgelesen... Hier mal ein neuer Code. Wo der andere mal in 4min erstellt wurde, hat dieser etwas länger gedauert. Dafür sollte er deiner Frage entsprechen. Würde mich mal interessieren, ob man es auch etwas einfacher hinbekommt...Code: [AUSKLAPPEN]
Graphics 200,200,0,2
SetBuffer BackBuffer()

xp#=190;X-Position
yp#=190;Y-Position
xt#=0;Temporärer X-Speed
yt#=0;Temporärer Y-Speed
xg#=0;Wirklicher X-Speed
yg#=0;Wirklicher Y-Speed
wk#=0;Bewegungswinkel
bs#=.01;Beschleunigung
ms#=20;Maximal-Speed
sd#=0;Berechneter Speed

While Not KeyHit(1)
 If KeyDown(203) xt=xt-bs
 If KeyDown(205) xt=xt+bs
 If KeyDown(200) yt=yt-bs
 If KeyDown(208) yt=yt+bs
 xt=xt/(1+bs)
 yt=yt/(1+bs)
 wk=ATan2(yt,xt)
 sd=Sqr(xt^2+yt^2)*(2*Pi+Cos(wk*4)-1)
 xg=Cos(wk)*sd*ms/(2*Pi)
 yg=Sin(wk)*sd*ms/(2*Pi)
 xp=xp+xg
 yp=yp+yg

 If xp>200 xp=xp-200
 If yp>200 yp=yp-200
 If xp<0 xp=xp+200
 If yp<0 yp=yp+200

 Line 100,100,100+xg,100+yg
 Oval 78,78,45,45,0
 Rect xp-2,yp-2,5,5,1

 Text 0,0,"xg:    "+xg
 Text 0,16,"yg:    "+yg
 Text 0,32,"speed: "+Sqr(xg^2+yg^2)
 Flip
 Cls
Wend
End

Cardonic

BeitragSa, Feb 18, 2006 9:05
Antworten mit Zitat
Benutzer-Profile anzeigen
@ hectic : Also für das, dass dein Code eigentlich genau das selbe macht wie meiner, finde ich ihn ein wenig umständlich. Zudem ist meine Variante ein wenig kürzer.

mfg Cardonic
If you should go skating on the thin ice of modern life, dragging behind you the silent reproach of a million tear-stained eyes, don't be surprised when a crack in the ice appears under your feet.

Spikespine

BeitragSa, Feb 18, 2006 10:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Cardonic: das macht dein code nicht...

hectics code ist, würde ich sagen, die Lösung des Problems.
Andererseits würde ich so eine Steuerung nicht in mein Spiel einbauen, lieber eine Steuerung, bei der man mit liks und rechts lenkt, und mit hoch und runter beschleunigt und bremst. Eine solche Steuerung wäre auch viel simpler zu programmieren.
Athlon 64 3700+ | 1024 MB RAM | GeForce 7900 GT | Blitz2D, Blitz3D, BlitzPlus, BlitzMax

Cardonic

BeitragSa, Feb 18, 2006 13:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Ooops, stimmt. Bei mir wird immer ein positiver Winkel ausgerechnet, selbst wenn es ein negativer (oder über 180°) sein soll.

mfg Cardonic
If you should go skating on the thin ice of modern life, dragging behind you the silent reproach of a million tear-stained eyes, don't be surprised when a crack in the ice appears under your feet.

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSa, Feb 18, 2006 16:36
Antworten mit Zitat
Benutzer-Profile anzeigen
@Cardonic, ich habe ja auch geschrieben...Zitat:
Die MaxSpeed mit einer If-Abfrage zu begrenzen führt dazu, daß es keine realistische Begrenzung darstellt. Die Lösung sollte daher komplett auf mathematischem Wege durchgeführt werden...

@Spikespine, eine solche Steuerung macht dann Sinn, wenn man beispielsweise in einem Egoshooter auch seitlich sliden will. Bei einigen älteren Spielen wie Doom1+2 usw. wurde dies nicht berücksichtigt und führte dazu das man im Netzwerkspielen die Gegner mit diagonalen laufen einholen konnte. Aber schön das du den Unterschied bemerkt hast. Very Happy

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group