pong: ball berrechnen...

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

ChrisAttack

Betreff: pong: ball berrechnen...

BeitragDo, Aug 19, 2004 22:05
Antworten mit Zitat
Benutzer-Profile anzeigen
ich möchte gerne ein pong machen..... ich hatte schonmal eins gemacht, nur ich fin den source net mehr Wink

mein problem: wie kann ich dan ball berrechnen? also die flugbahn....

eingangswinkel = ausgangswinkel????
B3D
MSVC++
DX9SDK

wunderkind

BeitragDo, Aug 19, 2004 22:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Man nehme die Suche:

https://www.blitzforum.de/view...light=pong
https://www.blitzforum.de/view...light=pong
https://www.blitzforum.de/view...light=pong

Vielleicht ist etwas dabei.

stfighter01

BeitragFr, Aug 20, 2004 16:55
Antworten mit Zitat
Benutzer-Profile anzeigen
prinzipiell würd ich sagen beim abprallen vom schläger: geschwindigkeit in x-richtung wird negiert und y bleibt gleich.

bzw.: für oben und unten geschwindigkeit in y-richtung wird negiert und x bleibt gleich.


mfg stfighter
Denken hilft!
 

dubitat

BeitragSa, Aug 21, 2004 10:12
Antworten mit Zitat
Benutzer-Profile anzeigen
vor dem selben problem stand ich auch und habe einfach mir überlegt, wie man einen wert vom positiven in den negativen bekommen könnte und dabei ist folgende berechnung rausgekommen:

Code: [AUSKLAPPEN]

ball_xspeed = ball_xspeed - ball_xspeed * 2


ich glaube dass mit dem den ball an der wanr abspringen lassen ist klar oder?

Code: [AUSKLAPPEN]

if ball_x < 0 then
ball_x = 0
ball_xspeed = ball_xspeed - ball_xspeed * 2
endif


und so musste das für jede wand berechnen... der y speed lässt sich auch umdrehen so!

kleines beispiel wenn du nicht verstanden hast wa da berechnet wird:

du hast die zahl 37 und von dieser ziehste 2*37 ab also 78! Dann bleibt dir als ergebnis -37 und du hast die gegenzahl gefunden und der ball fliegt in die anderer richtiung...
Erare humanum est - Irren ist Menschlich

Holzchopf

Meisterpacker

BeitragSa, Aug 21, 2004 10:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Noch einfacher gehts mit *(-1)
Code: [AUSKLAPPEN]

ball_xspeed = ball_xspeed * -1
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

wunderkind

BeitragSa, Aug 21, 2004 10:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Zu berücksichtigen wäre, dass sich der Ball in der Regel zum Rand des Schlägers hin anders verhält. Der Winkel wird größer. Oder kleiner, je nachdem, welchen man heranzieht.

stfighter01

BeitragSa, Aug 21, 2004 10:47
Antworten mit Zitat
Benutzer-Profile anzeigen
und warum nich einfach

ball_xspeed= -ball_xspeed ????

Laughing


/edit/


@wunderkind

dem könnte man z.b.: so abhilfe schaffen

bei schläger:

b_xspeed= -b_xspeed
und
b_yspeed= b_yspeed *0.7 ;

bei wand:

b_yspeed= -b_yspeed
und b_xspeed= b_xspeed *0.9

/edit/

mfg stfighter
Denken hilft!

Holzchopf

Meisterpacker

BeitragSa, Aug 21, 2004 11:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Wollte ja auch nur eine bessere und nicht die beste Lösung zeigen Wink
Hab ja nur dubitats Rechnung ein wenig optimiert 8)
Ich machs nämlich bei meinen Pong-Spielen auch einfach mit der -BallX_Speed Variante Smile

Und stfighter: Bei deiner *0.9 und *0.7 würde der Ball ja immer wie langsamer. Man müsste dann beim verringern der einen Geschwindigkeit die andere erhöhen. Allerdings, damit dann immernoch die selbe Gesamtgeschwindigkeit resultiert, müsste man dann schon auf Trigonometrie zurückgreifen.
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

stfighter01

BeitragSa, Aug 21, 2004 13:18
Antworten mit Zitat
Benutzer-Profile anzeigen
mit dem langsamer werden hast du recht.
(sollte ja auch reibung simulieren)

aber sinnvoller wäre sicher ein wert mit *1.1
wenn der ball immer schneller wird wird das spiel auch irgendwann aus
Wink


mfg stfighter
Denken hilft!

NoToM

BeitragMo, Aug 23, 2004 13:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Mann könnte auch den Schläger in mehrere Bilder aufteilen, zB Links Mitte Rechts und je nach dem wo der Ball auftrifft den winkel anders berechnen.

Die Bewegungsrichtung sowie das Tempo des Schlägers sind weitere Faktoren, welche einen Einfluss auf den Ball haben können.

Wie das genau in Code aussieht, überlass ich lieber jemand Anderem. Vielleicht sollte man wirklich mal ein gutes und leichtverstädliches Beispiel coden (nicht nur Aufprallwinkel = Abprallwinkel), da diese Frage immer wieder auftaucht. Damit hätte man auch ein gutes Beispiel für Cos und Sin...
 

tipfehler

BeitragMo, Aug 23, 2004 21:32
Antworten mit Zitat
Benutzer-Profile anzeigen
NoToM hat Folgendes geschrieben:
... Vielleicht sollte man wirklich mal ein gutes und leichtverstädliches Beispiel coden (nicht nur Aufprallwinkel = Abprallwinkel), da diese Frage immer wieder auftaucht. Damit hätte man auch ein gutes Beispiel für Cos und Sin...


Ich probier mal ob ich was hinbekomme, kann aber nichts versprechen, da ich selbst noch nicht so viel gecodet hab Smile

Travis

BeitragMo, Aug 23, 2004 23:41
Antworten mit Zitat
Benutzer-Profile anzeigen
EDIT:

Man müsste den Abstand vom Ball zur Schlägermitte in % vom maximal möglichen Abstand ermitteln. Wird der Schlaeger im oberen Virtel getroffen, dann entspricht das 75%. Nehmen wir an, der Winkel zum Schlaeger betraegt 90 Grad.

Jetzt müsste man die Gesamtgeschwindigkeit errechnen und neu verteilen. Und zwar entsprechend des Abstandes zum Mittelpunkt. Das sind dann 25% auf die X-Achse und zu 75% auf die Y-Achse. Dann wuerde der Ball mit gleicher Gesamtgeschwindigkeit im spitzen Winkel vom Schlaeger abprallen. Die X-Achse muss natuerlich noch umgekehrt werden.

Das Problem ist aber, dass man die Gesamtgeschwindigkeit ausrechnen muesste. Man hat aber keinen Winkel fuer die Berechnung zur Verfuegung. Der muesste also noch berechnet werden. Vielleicht koennte man das irgendwie mit dem ATAN2-Befehl machen.

Allerdings nicht mehr heute Nacht.
www.funforge.org

Ich hasse WASD-Steuerung.

Man kann alles sagen, man muss es nur vernünftig begründen können.
 

tipfehler

BeitragDi, Aug 24, 2004 8:59
Antworten mit Zitat
Benutzer-Profile anzeigen
So ich hab mich mal hingesetzt und das hier ist rausgekommen, ich weiß,
dass der Code noch (sehr) ausbauffähig ist, aber man muss bedenken, das ich erst 1 oder 2 Dinge Programmiert hab. Smile Geschwindigkeit müsste man noch einbauen...
Code: [AUSKLAPPEN]

Graphics 800,600

X = 300      ;X-Koordinate des Schlägers
X2# = 300   ;X-Koordinate des Gegners
XMB = 400   ;X-Koordinate des Balls
YMB = 300   ;Y-Koordinate des Balls
XMB2 = 0   ;X-Bewegung des Balls
YMB2 = 1   ;Y-Bewegung des Balls

timer = CreateTimer(1)
SetBuffer BackBuffer()

While Not KeyHit(1)
Cls

   ;Schläger
   Rect X , 20, 30, 5
   
   ;Spielereingaben
   If (X =< 750 And X => 20) Then
      If KeyDown(205) Then X = X + 3
      If KeyDown(203) Then X = X - 3
   ElseIf X => 750 Then
      X = 750
   ElseIf X =< 20 Then
      X = 20
   EndIf
   
   ;Ball zeichnen
   XMB = XMB + XMB2
   YMB = YMB - YMB2
   Rect XMB, YMB, 5, 5
   
   ;Kollisionsabfragen   
      ;Bei Kollion mit dem Schläger Y-Richtung verdrehen
      If YMB = 25 And (XMB >= X - 4 And XMB <= (X + 30)) Then YMB2 = YMB2 * (-1)
      
      ;Bei Kollion mit dem Schläger X-Richtung verändern, je nach Aufschlag
      If YMB = 25 And (XMB >= X - 4 And XMB <= (X + 8)) Then
            XMB2 = - 1
      ElseIf YMB = 25 And (XMB >= X + 8 And XMB <= (X + 14)) Then
             XMB2 = 0
      ElseIf YMB = 25 And (XMB >= X + 14 And XMB <= (X + 30)) Then
            XMB2 = 1
      EndIf
   
   ;Kollision Schläger
      ;Bei Kollion mit dem GegnerY-Richtung verdrehen
      If YMB = 550 And (XMB >= X2 - 4 And XMB <= (X2 + 30)) Then YMB2 = YMB2 * (-1)
      
      ;Bei Kollion mit dem Schläger X-Richtung verändern, je nach Aufschlag
      If YMB = 550 And (XMB >= X2 - 4 And XMB <= (X2 + 9)) Then
            XMB2 = - 1
      ElseIf YMB = 550 And (XMB >= X2 + 9 And XMB <= (X2 + 13)) Then
             XMB2 = 0
      ElseIf YMB = 550 And (XMB >= X2 + 13 And XMB <= (X2 + 30)) Then
            XMB2 = 1
      EndIf
      
      ;Randbereiche überprüfen
      If (XMB => 780 Or XMB =< 20) Then XMB2 = XMB2 * (-1)
      If (YMB => 560 Or YMB =< 10) Then : YMB = 300 : XMB2 = 0 : XMB = 400 : WaitTimer(timer) : EndIf
      
   ;Gegner
   Rect X2# , 550, 30, 5
   
   If (X2# - XMB) < -10 Then
      X2# = X2 + 0.95
   ElseIf (X2# - XMB) > -10
      X2# = X2 - 0.95
   EndIf
   

Flip
Wend
End


Ach ja kann mir vielleicht jemand sagen, wieso hier immer alles so vor sich hinruckelt?

Edit: Das ruckeln ist jetzt weg Smile . Danke @ Travis
  • Zuletzt bearbeitet von tipfehler am Di, Aug 24, 2004 14:20, insgesamt einmal bearbeitet

Travis

BeitragDi, Aug 24, 2004 14:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Setze mal den Befehl SetBuffer BackBuffer() direkt unter dem Graphics-Befehl. Dann sind die Ruckler weg Wink
www.funforge.org

Ich hasse WASD-Steuerung.

Man kann alles sagen, man muss es nur vernünftig begründen können.

NoToM

BeitragDo, Aug 26, 2004 10:58
Antworten mit Zitat
Benutzer-Profile anzeigen
@tipfehler

Hey, schon sehr gut für den Anfang ! Gratuliere

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group