Ball Realistisch fliegen lassen?
Übersicht BlitzBasic Beginners-Corner
blackmasterBetreff: Ball Realistisch fliegen lassen? |
So, Jun 14, 2009 20:03 Antworten mit Zitat |
|
---|---|---|
Hallo,
ich habe folgendes problem und zwar, habe ich einen Spieler der sich bewegen und Springen kann, wenn ich jetzt den Ball treffe, dann fliegt er in diese richtung wo ich den Ball berührt habe, den Winkel habe ich mit ATan2 berechnet. Jetzt meine Frage: Wie kann ich den Ball so Programmieren, das er einen Bogen macht, je nach abprall Winkel, soll er einen Weiten oder kurzen Bogen machen. Code: [AUSKLAPPEN] 'Kollision zwischen Spieler und Ball Prüfen
If ImagesCollide(Spieler_PNG,SpielerX,SpielerY,0,Ball_PNG,BallX,BallY,0) Then BallBewegen = True Winkel = ATan2(SpielerY-BallY,SpielerX-BallX) EndIf 'Ball bewegen If BallBewegen = True Then BallX = BallX - Cos(Winkel)*6 BallY = BallY - Sin(Winkel)*6 EndIf Wie könnte ich das anstellen? Danke schonmal. MfG |
||
Goodjee |
So, Jun 14, 2009 20:15 Antworten mit Zitat |
|
---|---|---|
du gibst dem ball einen speedx und einen speedy
der speedx ist konstant, es sei denn du willst luftwiderstand dem speedy ziehst du jedem schleifendurchlauf einen bestimmten floatwert ab um gravitation zu simulieren dadurch fliegt dein ball physikalisch korrekt in einer (flug)parabel |
||
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/ |
The_Nici |
So, Jun 14, 2009 20:15 Antworten mit Zitat |
|
---|---|---|
Edit: Habs falsch verstanden. Shame on me. | ||
blackmaster |
So, Jun 14, 2009 23:16 Antworten mit Zitat |
|
---|---|---|
Danke.
Ich bin gerade dabei ein Volley Ball Spiel zu schreiben und der Ball soll sich, wenn man ihn nach oben schlägt, auch irgendwann wieder nach unten kommen, ich weiss jetzt nicht so recht, wie ich das anstellen soll. Ich könnte, wenn der Ball nach oben geschlagen wird, den Winkel jeweils um 4 erhöhen oder so, aber es müsste ja ne bessere möglichkeit geben. z.B. wenn ich den Ball an dieser Position treffe: http://62.75.204.158/upload/ge...CnmIjM.PNG dann müsste ja der Ball einen weiten Bogen machen. Wenn ich z.B. den Ball an dieser Position treffe: http://62.75.204.158/upload/ge...TYRRcy.PNG dann ist der Bogen ja nicht zu weit, da der Ball somit höher fliegt und dann wieder runter kommen soll. Soweit klappt alles, den Winkel habe ich mittels ATan2 berechnet und der Ball fliegt genau dahin, wo ich ihn treffe, nur sieht das nicht so toll aus, da der Ball nicht runter kommt, sonder fliegt in diese Winkel-richtung weiter. Gibt es eine bessere möglichkeit, das hinzubekommen? MfG |
||
HolzchopfMeisterpacker |
So, Jun 14, 2009 23:21 Antworten mit Zitat |
|
---|---|---|
blackmaster hat Folgendes geschrieben: Gibt es eine bessere möglichkeit, das hinzubekommen?
Voll. Und zwar so wie Goodjee das vorgeschlagen hat. Atan2 (oder sonstiges Winkelberechnen-Zeugs) brauchst du eigentlich nur am Anfang, wenn überhaupt, wenns darum geht, dem Ball einen Impuls zu verpassen (dh du setzt seine X- und Y-Geschwindigkeit entsprechend). Danach subtrahierst du konstant einen Wert von der Y-Geschwindigkeit, so, dass der Ball halt irgendwann wieder nach unten fallen wird. mfG |
||
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BY ♫ BinaryBorn - Yogurt ♫ (31.10.2018) Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm |
blackmaster |
Di, Jun 16, 2009 22:02 Antworten mit Zitat |
|
---|---|---|
Danke euch.
Ich hab das so gemacht, aber es funktioniert nicht richtig, wenn ich auf dem Ball Springe, dann fliegt der Ball mit einem Bogen nach oben statt nach unten. Hier ist mal meine .exe Datei: http://www.fileuploadx.de/886884 Ich habe das so gemacht: Code: [AUSKLAPPEN] 'Kollision zwischen Spieler und Ball Prüfen
If ImagesCollide(Spieler_PNG,SpielerX,SpielerY,0,Ball_PNG,BallX,BallY,0) Then BallBewegen = True Winkel = ATan2(SpielerY-BallY,SpielerX-BallX) EndIf 'Ball bewegen If BallBewegen = True Then BallX = BallX - Cos(Winkel)*BallXSpeed BallY = BallY - Sin(Winkel)*BallYSpeed BallYSpeed = BallYSpeed - .30 EndIf Was habe ich falsch gemacht? MfG |
||
HolzchopfMeisterpacker |
Di, Jun 16, 2009 22:24 Antworten mit Zitat |
|
---|---|---|
Versuchs mal so:
Code: [AUSKLAPPEN] 'Kollision zwischen Spieler und Ball Prüfen
If ImagesCollide(Spieler_PNG,SpielerX,SpielerY,0,Ball_PNG,BallX,BallY,0) Then BallBewegen = True Winkel = ATan2(SpielerY-BallY,SpielerX-BallX) BallXSpeed = Cos(Winkel) BallYSpeed = Sin(Winkel) EndIf 'Ball bewegen If BallBewegen = True Then BallX = BallX -BallXSpeed BallY = BallY -BallYSpeed BallYSpeed = BallYSpeed - .30 EndIf Wie du siehst, werden da die Winkelberechnungen nur zum initialisieren der Geschwindigkeiten benutzt. Was du da evtl noch anpassen musst sind Vorzeichen und Faktoren (hinter Cos und Sin), um die Anfangsgeschwindigkeit anzupassen. mfG |
||
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BY ♫ BinaryBorn - Yogurt ♫ (31.10.2018) Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm |
blackmaster |
Di, Jun 16, 2009 22:37 Antworten mit Zitat |
|
---|---|---|
Danke Dir.
Das funktioniert auch nicht ganz, der Ball fliegt jetzt nicht mehr hoch sondern fliegt sofort runter, wenn ich versuche den Ball hoch zu werfen. Wie könnte man das ambesten lösen? Edit: Ich habe das Problem folgendermaßen gelöst: Code: [AUSKLAPPEN] BallXSpeed = Cos(Winkel)*10
BallYSpeed = Sin(Winkel)*10 Vielen Dank für die Hilfe. MfG |
||
blackmaster |
Mi, Jun 17, 2009 22:02 Antworten mit Zitat |
|
---|---|---|
Nur noch eine Frage:
Der Winkel muss ja auch mit geändert werden, wenn der ball nach oben geworfen wird und er dann runter fällt und gegen die Wand fliegt: Code: [AUSKLAPPEN] 'Kollision zwischen Spieler und Ball Prüfen
If ImagesCollide(Spieler_PNG,SpielerX,SpielerY,0,Ball_PNG,BallX,BallY,0) Then BallBewegen = True Winkel = ATan2(SpielerY-BallY,SpielerX-BallX) BallXSpeed = Cos(Winkel)*12 BallYSpeed = Sin(Winkel)*12 EndIf 'Ball bewegen If BallBewegen = True Then BallX = BallX -BallXSpeed BallY = BallY -BallYSpeed BallYSpeed = BallYSpeed - .30 Winkel = Winkel - .30 EndIf If BallX < 0 Or BallX > 400 Then Winkel = 180 - Winkel BallXSpeed = Cos(Winkel)*12 BallYSpeed = Sin(Winkel)*12 EndIf Wenn der Ball wieder runterfällt und gegen die Wand fliegt, dann fliegt der Ball wieder hoch statt runter, weil der Winkel immer noch gleich ist, wenn ich den Ball hoch geworfen habe. Edit: Ich hab das mal folgendermaßen versucht: Code: [AUSKLAPPEN] If BallX < 0 Or BallX > 900 Then
Winkel=(ATan2(BallY,BallX)) Mod 180 BallXSpeed = Cos(Winkel)*Speed BallYSpeed = Sin(Winkel)*Speed EndIf Für die rechte Seite funktioniert das perfekt, aber für die linke Seite funktioniert das irgendwie nicht korrekt, der Winkel is immer auf ca. 91, wenn der Ball die linke Seite berührt, also wenn BallX < wie 0 ist. Wie mache ich das jetzt ambesten? MfG |
||
- Zuletzt bearbeitet von blackmaster am Mi, Jun 17, 2009 22:47, insgesamt 2-mal bearbeitet
HolzchopfMeisterpacker |
Mi, Jun 17, 2009 22:44 Antworten mit Zitat |
|
---|---|---|
Da würde ich die Winkel grad sein lassen und ganz bequem die X-Geschwindigkeit umkehren. | ||
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BY ♫ BinaryBorn - Yogurt ♫ (31.10.2018) Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm |
blackmaster |
Mi, Jun 17, 2009 23:53 Antworten mit Zitat |
|
---|---|---|
Ich hab einbisschen rum probiert und habe es jetzt so gelöst:
Code: [AUSKLAPPEN] If BallX < 0 Or BallX > 900 Then
Winkel=(ATan2(BallY-BallX,BallX-BallY)) Mod 180 BallXSpeed = Cos(Winkel)*Speed BallYSpeed = Sin(Winkel)*Speed EndIf und vielen Dank für die antworten. MfG |
||
blackmaster |
Do, Jun 18, 2009 16:41 Antworten mit Zitat |
|
---|---|---|
Hallo nochmal,
ich habe mich wohl geirrt, das funktioniert doch nicht richtig. Hier mal 2 beispiel Bilder: Bild1 Bild2 Ich möchte, dass der Ball dann so fliegt, nur klappt das irgendwie nicht so richtig. Ich habe mit den Geschwindigkeit von Y oder X rumgespielt, aber irgendwie klappt das nicht ganz. Ich muss mich mehr mit Cosinus auseinandersetzen. Kann mir vielleicht jemand einen Beispiel-Code Posten? MfG |
||
ke^kx |
Do, Jun 18, 2009 17:16 Antworten mit Zitat |
|
---|---|---|
Du könntest das auch einfach mit einer elementaren Physiksimulation lösen. Also der Ball hat ne Geschwindigkeit in X und in Y Richtung. Und ne beschleunigung in Y Richtung (9,81 m/s -> Erdanziehungskraft).
Und dann hoffst du das es klappt Je genauer es werden soll desto mehr dinge (wie Luftwiederstand, Drehimpuls, Aprallen des Balls vom Boden etc) kannst du natürlich einbauen. |
||
http://i3u8.blogspot.com
Asus Striker II Intel Core2Quad Q9300 @ 2,5 GHz (aber nur zwei Kerne aktiv aufgrund der Instabilität -.-) Geforce 9800 GTX 2GB RAM |
HolzchopfMeisterpacker |
Do, Jun 18, 2009 17:44 Antworten mit Zitat |
|
---|---|---|
Menschenskind du brauchst dafür doch keine Winkel!
Alles was du brauchst sind Komponenten - und zwar so viele, wie du Dimensionen beanspruchst! Also je eine Geschwindigkeitskomponente in X- und eine in Y-Richtung. Du hast ja wohl auch zwei Positionskomponenten: X- und Y-Position Wohl am allerallerallereinfachsten löst man das mit Vektoren (was eigentlich nix anderes ist, als zusammengefasste Komponenten). Auch beim Initialstoss kannst du dir den Umweg über den Winkel schenken, da ja die X- und Y-Distanz vom Ballmittelpunkt zum Kollisionspunkt ein Vielfaches der Geschwindigkeitsvektoren darstellt (da ist es also nur noch eine Frage der Faktoren, das Ganze "realistisch" hinzukriegen). Hier mal ein voll funktionsfähiges Beispiel (ich bin zu gutmütig heute ) Code: [AUSKLAPPEN] ; Initialisierung und so
Graphics 800,600,0,2 SetBuffer BackBuffer() Global TIMER = CreateTimer(60) ; Type für den Ball Type TBall Field x#, y# ; Orts"vektor" Field SpeedX#, SpeedY# ; Geschwindigkeits"vektor" End Type ; Neuen Ball erstellen Local Ball.TBall = New TBall Ball\x = 400 Ball\y = 300 ; Hauptschleife Local mx, my While Not KeyDown(1) Cls mx = MouseX() my = MouseY() ; Ball werfen (mit linker Maustaste) If MouseHit(1) Throw( Ball, mx, my ) EndIf ; mit Leertaste Ball anhalten If KeyHit(57) Ball\SpeedX = 0 Ball\SpeedY = 0 EndIf ; Ball"physik" aktualisieren Update( Ball ) Flip 0 WaitTimer( TIMER ) Wend End ; Funktion zum Werfen des Balls ; pBall = Ball, der geworfen werden soll ; px = x-Position, an der der Ball getroffen wird ; py = y-Position, an der der Ball getroffen wird Function Throw( pBall.TBall, px, py ) ; mittels Phytagoras Distanz Treffpunkt-Ballzentrum errechnen Local dx = px -pBall\x, dy = py -pBall\y Local Dist# = Sqr( dx *dx +dy *dy ) ; wenn die Distanz im Ballradius liegt... If Dist <10 ; Wurfrichtung und -geschwindigkeit bestimmen pBall\SpeedX = dx *Dist /2.0 pBall\SpeedY = dy *Dist /2.0 EndIf End Function ; Funktion zum Aktualisieren und Zeichnen des Balls ; pBall = Ball, der aktualisiert werden soll Function Update( pBall.TBall ) ; Ballgeschwindigkeit (y-Richtung) erhöhen pBall\SpeedY = pBall\SpeedY +0.3 ; Ball bewegen pBall\x = pBall\x +pBall\SpeedX pBall\y = pBall\y +pBall\SpeedY ; Auf Kollisionen prüfen If pBall\x < 10 pBall\x = 20 -pBall\x ; Position wieder ins Spielfeld setzen pBall\SpeedX = -pBall\SpeedX *0.9 ; Geschwindigkeit umdrehen und dämpfen ; Geschwindigkeit nullen, wenn sie zu klein ist If Abs(pBall\SpeedX) < 0.5 pBall\SpeedX = 0 ElseIf pBall\x > 790 pBall\x = 1580 -pBall\x ; Position wieder ins Spielfeld setzen pBall\SpeedX = -pBall\SpeedX *0.9 ; Geschwindigkeit umdrehen und dämpfen ; Geschwindigkeit nullen, wenn sie zu klein ist If Abs(pBall\SpeedX) < 0.5 pBall\SpeedX = 0 EndIf ; Und das selbe noch mit der Decke und dem Boden If pBall\y < 10 pBall\y = 20 -pBall\y ; Position wieder ins Spielfeld setzen pBall\SpeedY = -pBall\SpeedY *0.9 ; Geschwindigkeit umdrehen und dämpfen ; Geschwindigkeit nullen, wenn sie zu klein ist If Abs(pBall\SpeedY) < 0.5 pBall\SpeedY = 0 ElseIf pBall\y > 590 pBall\y = 1180 -pBall\y ; Position wieder ins Spielfeld setzen pBall\SpeedY = -pBall\SpeedY *0.9 ; Geschwindigkeit umdrehen und dämpfen ; Geschwindigkeit nullen, wenn sie zu klein ist If Abs(pBall\SpeedY) < 0.5 pBall\SpeedY = 0 EndIf ; Luftwiderstand pBall\SpeedX = pBall\SpeedX *0.999 pBall\SpeedY = pBall\SpeedY *0.999 ; Ball zeichnen Oval pBall\x -10, pBall\y -10, 20, 20 End Function mfG |
||
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BY ♫ BinaryBorn - Yogurt ♫ (31.10.2018) Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm |
blackmaster |
Do, Jun 18, 2009 22:57 Antworten mit Zitat |
|
---|---|---|
Vielen Dank für deine Mühe.
Holzchopf hat Folgendes geschrieben: Menschenskind du brauchst dafür doch keine Winkel!
Alles was du brauchst sind Komponenten - und zwar so viele, wie du Dimensionen beanspruchst! Also je eine Geschwindigkeitskomponente in X- und eine in Y-Richtung. Du hast ja wohl auch zwei Positionskomponenten: X- und Y-Position Den Winkel brauche ich, um den abstoßwinkel vom Spieler und dem Ball zu berechnen. Ich werde es einfach mal versuchen. MfG |
||
Goodjee |
Do, Jun 18, 2009 22:58 Antworten mit Zitat |
|
---|---|---|
aber nur einmal um die startgeschwindigkeit festzulegen nicht jeden frame | ||
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/ |
Übersicht BlitzBasic Beginners-Corner
Powered by phpBB © 2001 - 2006, phpBB Group