Ping - Pong Collision mit Oberer und Unterer Seite ?!

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

Preakz

Betreff: Ping - Pong Collision mit Oberer und Unterer Seite ?!

BeitragMo, März 05, 2012 19:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Liebe Community,
Ich habe ein Problem und zwar hab ich heute angefangen PingPong zu Programmieren, und jetzt hab ich alles Fertig und ich muss nur noch ein Kleines Problemchen lösen....
Und zwar die Collision mit der Oberen und Unteren Breitenline der Blöcke.

Hier mal die Collisonsabfrage(die ElseIf 'S funktionieren nicht,kann mir da jmd helfen):

BlitzBasic: [AUSKLAPPEN]
Function BallCollision()
;wenn ball links unter 0 kommt dann punkt für p2
If Ball_x <=0 Then

Punkte_p2 = punkte_p2+5
Richtung = 6

EndIf
;wenn ball rechts über 800 kommt dann punkt für p1
If Ball_x >= 800 Then
Punkte_p1 = punkte_p1+5
Richtung = 5

EndIf
;wenn ball gegen wand stö0t
If Ball_y >=win_y Then
If Richtung = 1 Then
Richtung = 2
ElseIf Richtung = 4
Richtung = 3
EndIf
EndIf
If Ball_y <=win_y-win_y Then
If Richtung = 2 Then ;Wenn nach oben rechts
Richtung = 1; dann nach unten rechts
ElseIf Richtung = 3 ; Wenn nach oben links
Richtung = 4 ; dann nach unten links
EndIf
EndIf
;wenn Ball gegen Player Front kommt oder oben oder unten
If (Ball_x = player_x+player_breite)=True And (Ball_y>=player_y And Ball_y<=player_y+player_hoehe)=True Then ; Wenn Ball auf Balkenfront dann Collision
If Richtung = 3 Then
Richtung = 2

ElseIf Richtung = 4
Richtung = 1
EndIf
ElseIf ((Ball_x >= player_x And Ball_x <= player_x+playerbreite)=True And (ball_y = player_y+playerhoehe)=True )=True Then ;Wenn Ball von links kommt unten gegen Linken-Balken gegen die breite prall dann collision
Richtung = 2
ElseIf ((Ball_x >= player_x And Ball_x <= player_x+playerbreite)=True And (ball_y = player_y)=True)=True Then ;Wenn Ball von links kommt oben gegen Linken-Balken gegen die breite prallt dann collision
Richtung = 1
EndIf
If Ball_x+ball_breite = player2_x And (Ball_y>=player2_y And Ball_y<=player2_y+player_hoehe)=True Then ;Gleiche wie bei Player1 nur mit player2_x und player2_y werten
If Richtung = 2 Then
Richtung = 3
ElseIf Richtung = 1
Richtung = 4
EndIf
ElseIf ((Ball_x >= player2_x And Ball_x <= player2_x+playerbreite)=True And (ball_y = player_y+playerhoehe)=True)=True Then ;Gleiche wie bei Player1 nur mit player2_x und player2_y werten
Richtung = 4

ElseIf ((Ball_x >= player2_x And Ball_x <= player2_x+playerbreite)=True And (ball_y = player2_y)=True)=True Then ;Gleiche wie bei Player1 nur mit player2_x und player2_y werten
Richtung = 3
EndIf
;Punktestandanzeige
AppTitle p1_name$+": "+Punkte_p1+"P "+p2_name$+": "+Punkte_p2+ "P Game by Dominik "
End Function


Und hier für die Richtungen :

BlitzBasic: [AUSKLAPPEN]
Select Richtung
Case 0 ;Start
player_x = p1_x_start
player_y = 0
ball_x = (player_x+ball_breite)-unterschied_ball_breite_zu_p1x+10
ball_y = player_y
Text 250,280,"Drücke ENTER um das Spiel zu starten..."
If KeyHit(28)=True Then
Richtung = 1
EndIf

Case 1 ; Ball fliegt rechts + nach unten
ball_x = ball_x + ball_speed#
ball_y = ball_y + ball_speed#
Case 2 ; Ball fliegt rechts + nach oben
ball_x = ball_x + ball_speed#
ball_y = Ball_y - ball_speed#
Case 3 ; Ball fliegt links + nach oben
ball_x = ball_x - ball_speed#
ball_y = ball_y - ball_speed#
Case 4 ; Ball fliegt links + nach unten
ball_x = ball_x - ball_speed#
ball_y = ball_y + ball_speed#
Case 5 ; P1 hat einen Punkt gemacht
player_x = p1_x_start
player_y = 0
ball_x = (player_x+ball_breite)-unterschied_ball_breite_zu_p1x+10
ball_y = player_y
Text 250,280,"Player 1 hat gepunktet!"
Text 250,295,"Drücke ENTER um das Spiel fortzusetzen."
If KeyHit(28)=True Then
Richtung = 1
EndIf
Case 6 ; P2 hat einen Punkt gemacht
player2_x = p2_x_start
player2_y = 0
ball_x = player2_x-ball_breite
ball_y = player2_y

Text 250,280,"Player 2 hat gepunktet!"
Text 250,295,"Drücke ENTER um das Spiel fortzusetzen."

If KeyHit(28)=True Then
Richtung = 4
EndIf
Case 7 ; P1 gewinnt das Spiel
player_x = p1_x_start
player_y = 0
ball_x = (player_x+ball_breite)-unterschied_ball_breite_zu_p1x+10
ball_y = player_y
Color 255,0,0
Text 125,280,"Herzlichen Glückwunsch Spieler1 du hast mit "+Punkte_p1+" Punkten gewonnen!"
Text 125,295,"Drücke 2xENTER um erneut zu spielen."
Color 255,255,255
If KeyHit(28)=True Then

Richtung = 6
Punkte_p1 = 0
Punkte_p2 = 0
Delay(500)

EndIf
Case 8 ; P2 gewinnt das Spiel
player2_x = p2_x_start
player2_y = 0
ball_x = player2_x-ball_breite
ball_y = player2_y
Color 255,0,0
Text 125,280,"Herzlichen Glückwunsch Spieler2 du hast mit "+Punkte_p2+" Punkten gewonnen!"
Text 125,295,"Drücke ENTER um erneut zu spielen."
Color 255,255,255
If KeyHit(28)=True Then


Richtung = 5
Punkte_p1 = 0
Punkte_p2 = 0
Delay(500)
EndIf
End Select



Danke für die Hilfe im Vorraus
MfG Preakz
  • Zuletzt bearbeitet von Preakz am Sa, Jun 30, 2012 0:18, insgesamt einmal bearbeitet

Xeres

Moderator

BeitragMo, März 05, 2012 20:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn du Zahlen so für Richtungen benutzt, solltest du unbedingt Konstanten einsetzen:
BlitzBasic: [AUSKLAPPEN]
Const RechtsUnten%=1
;[...]
Case RechtsUnten

Das wäre einfacher lesbar.

Der Ansatz so ist aber nicht unbedingt ideal. Teile die Geschwindigkeit in eine X und Y Komponente auf und rechne immer das gleiche:
BlitzBasic: [AUSKLAPPEN]
ball_x = ball_x + ball_Xspeed#
ball_y = ball_y + ball_Yspeed#

Dann brauchst du bei der Kollision nur die X/Yspeed neu zu berechnen.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

Preakz

Betreff: ...

BeitragMo, März 05, 2012 20:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Es ging mir eher um die Abfrage ...

Balken:
_
| |
|_|

von den Seiten Oben und Unten , wenn der Ball jetzt von unten gegen die Untersteite des Blocks prallt. Die geschwindigkeit ist optimal schon berechnet ...

Hier mal der ganze Code, kannst ihn ja auch Kompilen . vielleicht weißt du ja dann was ich jetzt meine:

BlitzBasic: [AUSKLAPPEN]
;########################################################################
;#Autor: Dominik Kockel #
;#Programm: Ping-Pong-Clon #
;#Datum: 05/03/2012 (GER-Date) #
;#Version : v1.0 #
;#Copyright by Dominik Kockel 2012/2013 #
;########################################################################
AppTitle "Ping-Pong Clon by Dominik Kockel"
Const win_x=810,win_y=600
Graphics win_x,win_y,16,2
SetBuffer BackBuffer()
;Bild = LoadImage ("media/bilder/preakzcoding.png")
Global player_x,player_y,player2_x,player2_y, ball_x,ball_y,ball_speed#,punkte_p1,punkte_p2,richtung,player1,player2,player_breite,player_hoehe,ball_breite,ball_hoehe, unterschied_ball_breite_zu_p1x,fps
Global p1_name$="",p2_name$=""
Const p1_x_start = 10
Const p2_x_start = 780
player_x = p1_x_start
unterschied_ball_breite_zu_p1x = 20
player_y = 250
player2_x = p2_x_start
player2_y = 250
ball_x = 380
ball_y = 290
ball_speed# = 10
punkte_p1 = 0
punkte_p2 = 0
richtung = 0
ball_breite = 30
ball_hoehe = 30
player_breite = 20
player_hoehe = 150
fps = 60

;movie = OpenMovie("media/preview.wmv")
;While MoviePlaying(movie) And KeyDown(28)=False
;Cls
;DrawMovie movie,100,100
;Flip
;Wend
;Cls
;FlushKeys()
;CloseMovie movie


While p1_name$="" Or p2_name$=""
;DrawImage Bild,0,0
Print "Bitte geben sie einen Spielernamen für Spieler1 ein:"
p1_name$=Input()
Print "Bitte geben sie einen Spielernamen für Spieler2 ein:"
p2_name$=Input()
Wend

Global Timer = CreateTimer(fps)

;Hauptschleife

While Not KeyDown(1)
Cls

PlayerControl()
BallControl()
BallCollision()
Flip

Wend
End()
















Function PlayerControl()
;Runter
If KeyDown(208)=1 And (Player_y>=win_y-player_hoehe)=False Then ;Pfeil_Runter
player_y = player_y + 20
Sued = True
EndIf
If KeyDown(80)=1 And (Player2_y>=win_y-player_hoehe)=False Then ;Numpad 2
player2_y = player2_y +20
EndIf
;Hoch
If KeyDown(200)=1 And (Player_y<=win_y-win_y)=False Then ;Pfeil_Hoch
player_y = player_y -20
EndIf
If KeyDown(76)=1 And (Player2_y<=win_y-win_y)=False Then ;Numpad 5
player2_y = player2_y -20
Nord = True
EndIf
;Zeichne Player
Rect player_x,player_y,player_breite,player_hoehe,1
Rect player2_x,player2_y,player_breite,player_hoehe,1
WaitTimer(Timer)
End Function













Function BallControl()
If Punkte_p2 = 120 Then
Richtung = 8
EndIf
If Punkte_p1 = 120 Then
Richtung = 7
EndIf
Select Richtung
Case 0 ;Start
player_x = p1_x_start
player_y = 0
ball_x = (player_x+ball_breite)-unterschied_ball_breite_zu_p1x+10
ball_y = player_y
Text 250,280,"Drücke ENTER um das Spiel zu starten..."
If KeyHit(28)=True Then
Richtung = 1
EndIf

Case 1 ; Ball fliegt rechts + nach unten
ball_x = ball_x + ball_speed#
ball_y = ball_y + ball_speed#
Case 2 ; Ball fliegt rechts + nach oben
ball_x = ball_x + ball_speed#
ball_y = Ball_y - ball_speed#
Case 3 ; Ball fliegt links + nach oben
ball_x = ball_x - ball_speed#
ball_y = ball_y - ball_speed#
Case 4 ; Ball fliegt links + nach unten
ball_x = ball_x - ball_speed#
ball_y = ball_y + ball_speed#
Case 5 ; P1 hat einen Punkt gemacht
player_x = p1_x_start
player_y = 0
ball_x = (player_x+ball_breite)-unterschied_ball_breite_zu_p1x+10
ball_y = player_y
Text 250,280,"Player 1 hat gepunktet!"
Text 250,295,"Drücke ENTER um das Spiel fortzusetzen."
If KeyHit(28)=True Then
Richtung = 1
EndIf
Case 6 ; P2 hat einen Punkt gemacht
player2_x = p2_x_start
player2_y = 0
ball_x = player2_x-ball_breite
ball_y = player2_y

Text 250,280,"Player 2 hat gepunktet!"
Text 250,295,"Drücke ENTER um das Spiel fortzusetzen."

If KeyHit(28)=True Then
Richtung = 4
EndIf
Case 7 ; P1 gewinnt das Spiel
player_x = p1_x_start
player_y = 0
ball_x = (player_x+ball_breite)-unterschied_ball_breite_zu_p1x+10
ball_y = player_y
Color 255,0,0
Text 125,280,"Herzlichen Glückwunsch Spieler1 du hast mit "+Punkte_p1+" Punkten gewonnen!"
Text 125,295,"Drücke 2xENTER um erneut zu spielen."
Color 255,255,255
If KeyHit(28)=True Then

Richtung = 6
Punkte_p1 = 0
Punkte_p2 = 0
Delay(500)

EndIf
Case 8 ; P2 gewinnt das Spiel
player2_x = p2_x_start
player2_y = 0
ball_x = player2_x-ball_breite
ball_y = player2_y
Color 255,0,0
Text 125,280,"Herzlichen Glückwunsch Spieler2 du hast mit "+Punkte_p2+" Punkten gewonnen!"
Text 125,295,"Drücke ENTER um erneut zu spielen."
Color 255,255,255
If KeyHit(28)=True Then


Richtung = 5
Punkte_p1 = 0
Punkte_p2 = 0
Delay(500)
EndIf
End Select
Oval ball_x,ball_y,ball_breite,ball_hoehe,1
End Function













Function BallCollision()
;wenn ball links unter 0 kommt dann punkt für p2
If Ball_x <=0 Then

Punkte_p2 = punkte_p2+5
Richtung = 6

EndIf
;wenn ball rechts über 800 kommt dann punkt für p1
If Ball_x >= win_x Then
Punkte_p1 = punkte_p1+5
Richtung = 5

EndIf
;wenn ball gegen wand stö0t
If Ball_y >=win_y Then
If Richtung = 1 Then
Richtung = 2
ElseIf Richtung = 4
Richtung = 3
EndIf
EndIf
If Ball_y <=win_y-win_y Then
If Richtung = 2 Then ;Wenn nach oben rechts
Richtung = 1; dann nach unten rechts
ElseIf Richtung = 3 ; Wenn nach oben links
Richtung = 4 ; dann nach unten links
EndIf
EndIf
;wenn Ball gegen Player Front kommt oder oben oder unten
If (Ball_x = player_x+player_breite)=True And (Ball_y>=player_y And Ball_y<=player_y+player_hoehe)=True Then ; Wenn Ball auf Balkenfront dann Collision
If Richtung = 3 Then
Richtung = 2

ElseIf Richtung = 4
Richtung = 1
EndIf
ElseIf ((Ball_x >= player_x And Ball_x <= player_x+playerbreite)=True And (ball_y = player_y+playerhoehe)=True )=True Then ;Wenn Ball von links kommt unten gegen Linken-Balken gegen die breite prall dann collision
Richtung = 2
ElseIf ((Ball_x >= player_x And Ball_x <= player_x+playerbreite)=True And (ball_y = player_y)=True)=True Then ;Wenn Ball von links kommt oben gegen Linken-Balken gegen die breite prallt dann collision
Richtung = 1
EndIf
If Ball_x+ball_breite = player2_x And (Ball_y>=player2_y And Ball_y<=player2_y+player_hoehe)=True Then ;Gleiche wie bei Player1 nur mit player2_x und player2_y werten
If Richtung = 2 Then
Richtung = 3
ElseIf Richtung = 1
Richtung = 4
EndIf
ElseIf ((Ball_x >= player2_x And Ball_x <= player2_x+playerbreite)=True And (ball_y = player_y+playerhoehe)=True)=True Then ;Gleiche wie bei Player1 nur mit player2_x und player2_y werten
Richtung = 4

ElseIf ((Ball_x >= player2_x And Ball_x <= player2_x+playerbreite)=True And (ball_y = player2_y)=True)=True Then ;Gleiche wie bei Player1 nur mit player2_x und player2_y werten
Richtung = 3
EndIf
;Punktestandanzeige
AppTitle p1_name$+": "+Punkte_p1+"P "+p2_name$+": "+Punkte_p2+ "P Game by Dominik Kockel"
End Function


Wobei hier i.w. der große Denkfail ist.

BlitzBasic: [AUSKLAPPEN]
;wenn Ball gegen Player Front kommt oder oben oder unten
If (Ball_x = player_x+player_breite)=True And (Ball_y>=player_y And Ball_y<=player_y+player_hoehe)=True Then ; Wenn Ball auf Balkenfront dann Collision
If Richtung = 3 Then
Richtung = 2

ElseIf Richtung = 4
Richtung = 1
EndIf
ElseIf ((Ball_x >= player_x And Ball_x <= player_x+playerbreite)=True And (ball_y = player_y+playerhoehe)=True )=True Then ;Wenn Ball von links kommt unten gegen Linken-Balken gegen die breite prall dann collision
Richtung = 2
ElseIf ((Ball_x >= player_x And Ball_x <= player_x+playerbreite)=True And (ball_y = player_y)=True)=True Then ;Wenn Ball von links kommt oben gegen Linken-Balken gegen die breite prallt dann collision
Richtung = 1
EndIf
If Ball_x+ball_breite = player2_x And (Ball_y>=player2_y And Ball_y<=player2_y+player_hoehe)=True Then ;Gleiche wie bei Player1 nur mit player2_x und player2_y werten
If Richtung = 2 Then
Richtung = 3
ElseIf Richtung = 1
Richtung = 4
EndIf
ElseIf ((Ball_x >= player2_x And Ball_x <= player2_x+playerbreite)=True And (ball_y = player_y+playerhoehe)=True)=True Then ;Gleiche wie bei Player1 nur mit player2_x und player2_y werten
Richtung = 4

ElseIf ((Ball_x >= player2_x And Ball_x <= player2_x+playerbreite)=True And (ball_y = player2_y)=True)=True Then ;Gleiche wie bei Player1 nur mit player2_x und player2_y werten
Richtung = 3
EndIf

Xeres

Moderator

BeitragMo, März 05, 2012 21:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Bitte füge Leerzeichen in lange Zeilen ein, sonst verrutscht hier das ganze Forenlayout.
Du musst nicht alles explizit auf "=True" in Bedingungen prüfen, dass kannst du alles streichen. Wenn der Ausdruck <> 0 ist, ist er True.
BlitzBasic: [AUSKLAPPEN]
If -1 Then Print("A")
If 0 Then Print("B")
If 1 Then Print("C")
WaitKey()


Kniffelig bei der Abfrage ist z.B. "ball_y = player2_y". Das wird nur wahr, wenn die Werte exakt gleich sind - und das dürfte meistens nicht der Fall sein.
Je nach dem, wo die Anfasspunkte sind, könntest du über, vor und unter Schläger feststellen. Und am besten steckst du die Berechnung in eine Extrafunktion um den If Block lesbarer zu machen.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

Preakz

BeitragMo, März 05, 2012 21:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok ich werds mal versuchen....

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group