Unlogische Mathematik
Übersicht

b3_newbieBetreff: Unlogische Mathematik |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
die gesamtgeschwindigkeit des vektors bekommst du durch den satz des pythagoras
Code: [AUSKLAPPEN] velocity = Sqr(xspeed^2+yspeed^2)
bringt dir hier aber nix. ![]() 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() mfg Cardonic PS: Mathematik ist immer logisch (wenn es auch nicht immer so aussieht ![]() [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* ![]() |
||
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
@ 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
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit 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. 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 |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
@ 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
@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. ![]() |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group