Ping Pong aus Tutorial, Hilfe!

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

don_bo

Betreff: Ping Pong aus Tutorial, Hilfe!

BeitragMo, Mai 10, 2010 18:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Leute
ich habe mich bisher gut durch das Blitzbasic Community Tutorial gearbeitet. Nun stehe ich bei dem Pong Spiel aber vor einem Problem. Es will und will einfach nicht korrekt funktionieren. Hab auch schoneiniges durchprobiert.
Zur Anmerkung ich hab zum Teil eigene Elemente mit verbaut und mein Spiel ist auch horizontal aufgebaut.
BlitzBasic: [AUSKLAPPEN]






font = LoadFont ("Arial",100,1) ; Schriftart
SetFont font

; Sounddatein werden geladen:
song = LoadSound ("loop.wav")
click = LoadSound ("click.wav")
boing = LoadSound ("boing.wav")
boing2 = LoadSound ("boing2.wav")
glas = LoadSound ("glas.wav")
LoopSound (song)
PlaySound (song)

; Bilddateien werden eingelesen:
Global kugel = LoadImage ("kugel.bmp")
MidHandle kugel
Global spieler1 = LoadImage ("spieler2.bmp")
MidHandle spieler1
Global spieler2 = LoadImage ("spieler1.bmp")
MidHandle spieler2
stars = LoadImage("stars.bmp") ; Sterne


resetkugel
While Not KeyHit(1) ; HAUPTSCHLEIFE
WaitTimer (frametimer)

beweglichkeit=geschwindigkeit


Cls ; löscht den Bildschirminhalt

; Sterne bewegen.
x_star = x_star + 1
If x_star = 201 Then x_star = 1
TileImage stars, x_star, 1 ; Die Sterne auf dem Bildschirm verteilen.


;Zeichnen der Schläger+Ball:

Line xmax/2, 5, xmax/2, ymax-10

DrawImage kugel,x_Ball,y_Ball
DrawImage spieler1,abstand,y1
DrawImage spieler2,xmax-abstand,y2




;Zeichnen der Umrandung:
Rect 5,5,790,590,0

;Bewegung des Schläger durch Tastatur:
If KeyDown (208) And y1 <= ymax Then ; Spieler 1
y1=y1+8
EndIf
If KeyDown(200)And y1 =>10 Then
y1=y1-8
EndIf

If KeyDown (44) And y2 =< ymax Then ;Spieler 2
y2=y2+8
EndIf
If KeyDown(30)And y2 =>10 Then
y2=y2-8
EndIf




;KOLLISIONSABFRAGE

If ImagesCollide (spieler1, abstand, y1,0, kugel, x_ball, y_Ball,0) Then
winkel = 360 - winkel
abweichung = 2* (y1-y_Ball)
winkel = winkel + abweichung


End If

If ImagesCollide (spieler2, 760, y2,0, kugel, x_ball, y_Ball,0) Then
winkel = 360 - winkel
abweichung =2*(y2-y_Ball)
winkel = winkel - abweichung



End If


;Damit der Winkel zwischen 0 und 360 liegt:
If winkel >360 Then winkel = winkel -360
If winkel <0 Then winkel = winkel +360


;Punktevergabe und rücksetzen:

If x_Ball <40 Then
p2=p2+10
resetkugel
PlaySound (glas)
EndIf

If x_Ball > 760 Then
p1=p1 +10
resetkugel
EndIf



;Wandberührung

If y_Ball =< 20.0 Then
winkel=180.0-winkel
EndIf

If y_Ball >580 Then
winkel = 180.0-winkel
EndIf


;Berechnung der Ballposition:

x_Ball=x_Ball + Cos(winkel)*geschwindigkeit
y_Ball = y_Ball -Sin(winkel)*geschwindigkeit


Text 20,10,p1+" "+p2





Flip

Wend ;ENDE HAUPTSCHLEIFE

End

;FUNKTIONEN:
Function resetkugel()
x_ball=xmax/2
y_ball=ymax/2
If Rand(0,1)=1 Then winkel=Rand(105,45) Else winkel=Rand(315,225);der Winkel wird durch Zufall ermittelt
End Function



Das Spiel startet zwar jetzt und der Ball "fliegt" los, "prallt" aber von der Seitenwand nicht ab.
Ich glaub ich habe irgendwo einen Denkfehler drin.

mfg

hazumu-kun

BeitragMo, Mai 10, 2010 18:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Gewöhne dir bitte an deinen Code einzurücken, so wie er aktuell ist, hat keiner Lust den zu lesen.
Warum kann es keine omnipotente Macht geben?
Weil diese omnipotente Macht in der Lage sein müsste, einen so schweren Stein zu schaffen, dass sie ihn nicht heben kann
-> nicht omnipotent

Midimaster

BeitragMo, Mai 10, 2010 19:14
Antworten mit Zitat
Benutzer-Profile anzeigen
setz doch ein paar DEBUGLOGs in den code und beobachte, wie sich Winkel und X-Speed und Y-Speed verhalten:


BlitzBasic: [AUSKLAPPEN]
....
;Wandberührung

DebugLog "Vorher Y=" + y_ball + " Winkel=" + Winkel

If y_Ball =< 20.0 Then
winkel=180.0-winkel
EndIf

If y_Ball >580 Then
winkel = 180.0-winkel
EndIf

DebugLog "SpeedX=" + (-Sin(winkel)*geschwindigkeit) + " SpeedY=" +(Cos(winkel)*geschwindigkeit)

;Berechnung der Ballposition:

x_Ball=x_Ball + Cos(winkel)*geschwindigkeit
y_Ball = y_Ball -Sin(winkel)*geschwindigkeit

DebugLog "Nachher Y=" + y_ball + " Winkel=" + Winkel

Text 20,10,p1+" "+p2
....


Kommt es dann zu irgendwelchen Auffälligkeiten? Vielleicht liegt es daran, dass die Berechnungen keine FLOAT sind?

Hagbard

BeitragMo, Mai 10, 2010 19:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Also, was mir außerdem auffällt:

In der Funktion resetkugel hantierst du mit den Variablen x_ball, y_ball, xmax und ymax. Die hast du in deinem Programm aber gar nicht als global definiert. In diesem Fall kann die Funktion gar nicht auf die Werte zugreifen, sondern weißt ihnen automatisch den Wert 0 zu.
 

don_bo

BeitragMo, Mai 10, 2010 19:34
Antworten mit Zitat
Benutzer-Profile anzeigen
mit den float zahlen hab ich auch schon alles mögliche ausprobiert. Sitz den ganzen Mittag schon dran und such den Fehler. ABer ich will ihn einfach nicht finden.

Danke für den Tipp mit den Variablen, stimmt da hätte ich auch drauf kommen können. aber das wird wohl nicht das Problem beheben. Sad

Midimaster

BeitragMo, Mai 10, 2010 19:36
Antworten mit Zitat
Benutzer-Profile anzeigen
was kommt denn nun raus bei den DEBUGLOGs, in dem Moment, wo die Kugel den Rand berührt?


und noch ne nachfrage!

Mit Seitenwand meinst Du die Wände oben und unten, oder?
 

don_bo

BeitragMo, Mai 10, 2010 19:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Midimaster hat Folgendes geschrieben:
was kommt denn nun raus bei den DEBUGLOGs, in dem Moment, wo die Kugel den Rand berührt?


und noch ne nachfrage!

Mit Seitenwand meinst Du die Wände oben und unten, oder?


also zur fragen mit den Wänden. Ja damit meitne ich die Seitenwände oben und unten. Habe das Spiel ja horizontal aufgebaut. Ich habe geradfe festgestellt, sobald die Kugel auf einen "Schläger auftritt" bleibt sie hängen und die Punkteanzeige rasst nach oben...

Zur ersten Fragen, wie genau, schaue ich das nach was bei den DEBUGLOGs raus kommt? Vielleicht ne blöde Frage, aber da stehe ich auf dem Schlauch

Midimaster

BeitragMo, Mai 10, 2010 19:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Leider hab ich kein BB, aber unter B3D gibt es da einen Menüpunkt "Debug Enabled?". Wenn du den anklickst, öffnet sich bei Spielstart ein zweites Fenster und gibt alle Nachrichten die im Code mit DEBUGLOG eingesetzt wurden aus.

Oft fällt einem dann auf, dass etwas nicht so ist, wie erwartet....

Löse mal erst das Problem mit den Wänden, bevor du das nächste (mit den Schlägern) hier schon thematisierst...

Toll wäre auch, wenn du dir einen Auto-Stop einbaust, damit du die LOGs in Ruhe lesen kannst, z.b. in die Hauptschleife:

BlitzBasic: [AUSKLAPPEN]
If KeyHit(2)  ;wenn Taste "1" gedrückt wird
WaitKey()
EndIf


Sobald etwas kurioses passiert, drückst du die 1 und dein Programm stoppt. Jetzt kannst du das DEBUG-Fenster auswerten.
 

don_bo

BeitragMo, Mai 10, 2010 20:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Midimaster hat Folgendes geschrieben:
Leider hab ich kein BB, aber unter B3D gibt es da einen Menüpunkt "Debug Enabled?". Wenn du den anklickst, öffnet sich bei Spielstart ein zweites Fenster und gibt alle Nachrichten die im Code mit DEBUGLOG eingesetzt wurden aus.

Oft fällt einem dann auf, dass etwas nicht so ist, wie erwartet....

Löse mal erst das Problem mit den Wänden, bevor du das nächste (mit den Schlägern) hier schon thematisierst...

Toll wäre auch, wenn du dir einen Auto-Stop einbaust, damit du die LOGs in Ruhe lesen kannst, z.b. in die Hauptschleife:

BlitzBasic: [AUSKLAPPEN]
If KeyHit(2)  ;wenn Taste "1" gedrückt wird
WaitKey()
EndIf


Sobald etwas kurioses passiert, drückst du die 1 und dein Programm stoppt. Jetzt kannst du das DEBUG-Fenster auswerten.

danke für den Tipp hab den Fehler jetzt gefunden.
BlitzBasic: [AUSKLAPPEN]

If y_Ball < 20 Then
winkel=360-winkel
EndIf

If y_Ball >580 Then
winkel = 360-winkel
EndIf

so funktioniert es jetzt... (war ein großer Denkfehler)

Jetzt besteht nur noch das Problem, dass die Bälle vom Schläger durchgelassen werden bzw falsch abgelenkt werden.

Holzchopf

Meisterpacker

BeitragMo, Mai 10, 2010 20:39
Antworten mit Zitat
Benutzer-Profile anzeigen
don_bo, bitte zitiere in Zukunft keine ganzen Beiträge mehr, erst recht keine Vorgängerbeiträge, denn das stört nur den Lesefluss - und zwar erheblich. Die Zitieren-Funktion ist dazu da, auf bestimmte Textstellen einzugehen, was bei dir jetzt ja nicht der Fall war.

mfG
Holzchopf
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
 

don_bo

BeitragMo, Mai 10, 2010 23:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe das Programm jetzt noch ein wenig verbessert. Das mit dem Rand klappt jetzt schon wunderbar und auch den Ball zu spielen klappt meistens. Aber es kommt ab und an vor, dass die Kugel im Schläger "hängen bleibt" und dann in eine Richtung geschleudert wird. Kann es gerade nicht beser formulieren.

hier der Codeauszug der Kollision, vllt entdeckt ja jemand den Fehler Sad
BlitzBasic: [AUSKLAPPEN]
;KOLLISIONSABFRAGE

If ImagesCollide (spieler1, abstand, y1,0, kugel, x_ball, y_Ball,0) Then
abweichung = (y1-y_Ball)
winkel = 180-winkel+abweichung
PlaySound boing
geschwindigkeit = geschwindigkeit +0.25
End If

If ImagesCollide (spieler2, xmax-abstand, y2,0, kugel, x_ball, y_Ball,0) Then
abweichung =(y2-y_Ball)
winkel = 180-winkel -abweichung
PlaySound boing
geschwindigkeit = geschwindigkeit +0.25
End If


mfg

Midimaster

BeitragDi, Mai 11, 2010 10:43
Antworten mit Zitat
Benutzer-Profile anzeigen
auch hier helfen natürlich wieder ein paar DEBUGLOGs.

Sie würden Dir zeigen, was genau im Moment des Auftreffens auf den Schläger passiert. Ich vermute mal, weil mir das selbst schon passiert ist:

1. die Kugel trifft auf den Schläger und unterschreitet die Grenzwerte massiv.
2. die IF Abfrage entdeckt die Berührung und kehrt die Richtung um
3. die Kugel erfährt eine Bewegung in die Gegenrichtung
4. die neue Position reicht aber nicht, um aus dem Grenzwert zu kommen.

und jetzt wird fatal:

5. die IF Abfrage entdeckt die "Berührung" und kehrt die Richtung abermals um
6. die Kugel erfährt eine Bewegung in Richtung Schläger
7. die IF Abfrage entdeckt die Berührung und kehrt die Richtung um
8. die Kugel erfährt eine Bewegung in die Gegenrichtung

und schon steckst du in einer Endlosschleife, die nur durch Zufall unterbrochen wird, weil es irgendwann doch "reicht" um aus dem Wirkungsbereich zu kommen.

Abhilfe wäre

a. Kugel wird gleich in der IF-Umkehr um eine erste Einheit herausgestossen

b. Schläger prüft in der IF, ob die Kugel sich wirklich auf ihn zubewegt
 

don_bo

BeitragDi, Mai 11, 2010 11:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für deine Hilfe!
ich hab jetzt versucht in der If Abfrage zu prüfen ob der Ball sich auf einen Schläger zubewegt oder nicht. Das sinnvollste was mir da in den Sinn kam ist die Variable "winkel" zu überprüfen. der müsste beim linken Schläger ja im Bereich von >90 bis <270 Grad liegen, dass die kugel sich nach links und somit auf den Schläger zu bewegt.
Das ganze habe ich dann im Code so gelöst :
BlitzBasic: [AUSKLAPPEN]

If ImagesCollide (spieler1, abstand, y1,0, kugel, x_ball, y_Ball,0) Then
If winkel >=90 And winkel =<270 Then
abweichung = (y1-y_Ball)
winkel = 180 - winkel + abweichung
PlaySound boing
geschwindigkeit = geschwindigkeit +0.25
End If
End If


und bisher muss ich sagen es scheint auch zu funktionieren...

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group