Ball Realistisch fliegen lassen?

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

blackmaster

Betreff: Ball Realistisch fliegen lassen?

BeitragSo, Jun 14, 2009 20:03
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Jun 14, 2009 20:15
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Jun 14, 2009 20:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Edit: Habs falsch verstanden. Shame on me.
 

blackmaster

BeitragSo, Jun 14, 2009 23:16
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Holzchopf

Meisterpacker

BeitragSo, Jun 14, 2009 23:21
Antworten mit Zitat
Benutzer-Profile anzeigen
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 BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm
 

blackmaster

BeitragDi, Jun 16, 2009 22:02
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Holzchopf

Meisterpacker

BeitragDi, Jun 16, 2009 22:24
Antworten mit Zitat
Benutzer-Profile anzeigen
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 BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm
 

blackmaster

BeitragDi, Jun 16, 2009 22:37
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Jun 17, 2009 22:02
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Holzchopf

Meisterpacker

BeitragMi, Jun 17, 2009 22:44
Antworten mit Zitat
Benutzer-Profile anzeigen
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 BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm
 

blackmaster

BeitragMi, Jun 17, 2009 23:53
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Jun 18, 2009 16:41
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Jun 18, 2009 17:16
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Very Happy 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

Holzchopf

Meisterpacker

BeitragDo, Jun 18, 2009 17:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Menschenskind Rolling Eyes 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 Wink

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 Rolling Eyes )
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 BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm
 

blackmaster

BeitragDo, Jun 18, 2009 22:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielen Dank für deine Mühe.

Holzchopf hat Folgendes geschrieben:
Menschenskind Rolling Eyes 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 Wink


Den Winkel brauche ich, um den abstoßwinkel vom Spieler und dem Ball zu berechnen.

Ich werde es einfach mal versuchen.

MfG

Goodjee

BeitragDo, Jun 18, 2009 22:58
Antworten mit Zitat
Benutzer-Profile anzeigen
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/

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group