Ball bei Pong überspringt Schläger
Übersicht

da3m0nBetreff: Ball bei Pong überspringt Schläger |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hi,
Ich bin erst vor kurzem mit Blitzbasic angefangen und habe natürlich direkt die ersten Probleme mit denen ich (auch nach längerem grübeln) nicht alleine fertig werde ![]() Ich wollte als erstes mal versuchen Pong (oder zumindest etwas änliches) zu schreiben allerdings hatte ich dann Probleme als ich verschiedene Schwierigkeitsgrade einbauen wollte. Code: [AUSKLAPPEN] ;PONG Graphics 800, 600, 32, 1 ;der Grafickmodus wird SetBuffer BackBuffer() ;eingeschaltet x = 2 ;x und y geben an wie schnell y = 1 ;sich der Ball bewegt Ballx = 400 ;Ballx und Bally geben die Bally = 50 ;position des Balles an Schlaeger = LoadImage("F:\BB\Schlaeger.BMP") ;die Bilder Werden in die Variabeln geladen Ball = LoadImage("F:\BB\Ball.bmp") MaskImage Schlaeger, 0, 0, 0 ;es wird festgelegt das Schwarz in den beiden Bildern transparent ist MaskImage Ball, 0, 0, 0 Stufe = Input ( "Wähle eine Schwirigkeitsstufe zwischen 1 und 10 und bestätige mit Enter: ") ;der Schwierigkeitsgrad wird abgefragt If Stufe = 1 Then ;die angaben des Spieler werden ausgewertet x = x + 1 ElseIf Stufe = 2 Then x = x + 2 ElseIf Stufe = 3 Then x = x + 3 ElseIf Stufe = 4 Then x = x + 4 ElseIf Stufe = 5 Then x = x + 5 ElseIf Stufe = 6 Then x = x + 6 ElseIf Stufe = 7 Then x = x + 7 ElseIf Stufe = 8 Then x = x + 8 ElseIf Stufe = 9 Then x = x + 9 ElseIf Stufe = 10 Then x = x + 10 EndIf Repeat ;die Repeatschleife begint Cls ;der Bildschirm wird gelehrt Ballx = Ballx + x ;die nächste Position des Balles wird festgelegt Bally = Bally + y DrawImage Ball, Ballx, Bally ;die Bilder werden gemalt DrawImage Schlaeger, 750, MouseY() If Ballx <= 0 Then x = x * -1 ;wenn der Ball die Wände berührt wird er reflektiert If Bally <= 0 Then y = y * -1 If Bally >= 590 Then y = y * -1 If ImagesCollide(Schlaeger, 750, MouseY(), 0, Ball, Ballx, Bally, 0)Then x = x * -1 ;wenn der Ball den das Bild "Strichrechts" berührt dreht er um If Ballx >= 800 Then Print "Game Over bitte drücken sie eine Taste um das Spiel zu beenden" ;wenn man den ball durchläst wird das Spiel forzeitig beendet If Ballx >= 800 WaitKey If Ballx >= 800 Then End Flip ;das Bild wird auf den Bildschirm übertragen Until KeyHit(1) ;Wenn der Spieler Esc drückt wird das Spiel beendet End Da der Ball in den höherer Stufe mehrere Pixel gleichzeitig überspringt, überspringt er in den Stufen 7 und 9 Sufe auch den Strich der vom spieler als Schläger benutzt werden soll. Bei den Wänden könnte ich den Bereich der Werte indem der Ball umdrehen soll einfach erhöhen Code: [AUSKLAPPEN] If Ballx <= 0 Then x = x * -1 Bei dem Bild geht das allerdings nicht (oder ich weiß zumindist nicht wie es geht ) Code: [AUSKLAPPEN] If ImagesCollide(Strichrechts, 750, MouseY(), 0, Ball, Ballx, Bally, 0)Then x = x * -1 Kann ich den Wertebereich der x-coordinate innerhalb der Befehlszeile so verändern das der ball auch umdreht wenn der ball 750 übrspringt, oder gibt es vieleicht sogar noch eine möglichkeit den Schwierigkeitsgrad zu erhöhen ohne das der Ball mehrere Pixel gleichzeitig überspringt ( z.B. Framerate erhöhen zum beispiel )??? Danke schon mal im voraus, da3m0n |
||
![]() |
Ralf |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo,
für eine genauere Abfrage versuche mal diesen Code. Funktioniert pixelgenau beim Schläger und der Bande, egal wie schnell der Ball ist. Code: [AUSKLAPPEN] ;PONG
Graphics 800, 600, 32, 1 ;der Grafickmodus wird SetBuffer BackBuffer() ;eingeschaltet x# = 2 ;x und y geben an wie schnell y# = 1 ;sich der Ball bewegt Ballx# = 400 ;Ballx und Bally geben die Bally# = 50 ;position des Balles an Schlaeger = LoadImage("F:\BB\Schlaeger.BMP") ;die Bilder Werden in die Variabeln geladen Ball = LoadImage("F:\BB\Ball.bmp") MaskImage Schlaeger, 0, 0, 0 ;es wird festgelegt das Schwarz in den beiden Bildern transparent ist MaskImage Ball, 0, 0, 0 Stufe = Input ( "Wähle eine Schwirigkeitsstufe zwischen 1 und 10 und bestätige mit Enter: ") ;der Schwierigkeitsgrad wird abgefragt If Stufe = 1 Then ;die angaben des Spieler werden ausgewertet x = x + 1 ElseIf Stufe = 2 Then x = x + 2 ElseIf Stufe = 3 Then x = x + 3 ElseIf Stufe = 4 Then x = x + 4 ElseIf Stufe = 5 Then x = x + 5 ElseIf Stufe = 6 Then x = x + 6 ElseIf Stufe = 7 Then x = x + 7 ElseIf Stufe = 8 Then x = x + 8 ElseIf Stufe = 9 Then x = x + 9 ElseIf Stufe = 10 Then x = x + 10 EndIf Repeat ;die Repeatschleife begint Cls ;der Bildschirm wird gelehrt For speed = 1 To stufe Ballx# = Ballx# + x#/stufe ;die nächste Position des Balles wird festgelegt Bally# = Bally# + y#/stufe If Ballx <= 0 Then x = x * -1 ;wenn der Ball die Wände berührt wird er reflektiert If Bally <= 0 Then y = y * -1 If Bally >= 590 Then y = y * -1 If ImagesCollide(Schlaeger, 750, MouseY(), 0, Ball, Ballx, Bally, 0)Then x = x * -1 ;wenn der Ball den das Bild "Strichrechts" berührt dreht er um Next DrawImage Ball, Ballx, Bally ;die Bilder werden gemalt DrawImage Schlaeger, 750, MouseY() If Ballx >= 800 Then Print "Game Over bitte drücken sie eine Taste um das Spiel zu beenden" ;wenn man den ball durchläst wird das Spiel forzeitig beendet If Ballx >= 800 WaitKey If Ballx >= 800 Then End Flip ;das Bild wird auf den Bildschirm übertragen Until KeyHit(1) ;Wenn der Spieler Esc drückt wird das Spiel beendet End Gruß Ralf |
||
da3m0n |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Danke ich glaube ich habs geschnallt,
aber nur um noch mal um sicher zu gehen das ich das richtig verstanden habe: Du hast eine FORschleife benutzt um jeden Pixel einmal zu testen ob der Ball den Schläger berhürt. Du hast nachher "x#" durch "stufe" geteilt, war das nur damit du nicht den ganzen code endern mustest oder war das noch zu was anderem notwendig? Code: [AUSKLAPPEN] Ballx# = Ballx# + x#/stufe Auserdem hast du an semtliche Variabelen noch # gehängt, ist das nur zu Kenzeichnunung gewesen oder hat das noch was bestimmtes bei Biltzbasic zu sagen? Wenn meine Annahmen oben richtig sind dann habe ich verstanden wie du das Problem gelöst hast. Allerdings ruckelt das jetzt etwas, ligt das daran dass ich den ganzen Tag schon vorm Rechner hocke und meine Augen jetzt nicht mehr richtig mitspielen ![]() ![]() Sorry wenn ein paar von meinen Fragen absolut albern klingen, aber wie gesagt ich bin echt total neu auf dem Gebiet Programmieren. ![]() Auf jeden fall danke für deine Hilfe da3m0n |
||
![]() |
Ralf |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo,
das #-Zeichen hinter den Variabeln teilt Blitzbasic mit das dies eine Float-Variabel ist, das heisst es wird mit mehreren Stellen hinter dem Komma gerechnet. Ist der Wert "x#" nun 12, der Wert "y#"=2 und der Wert "stufe"=10 bedeutet das folgendes: For speed = 1 to Stufe(10) ballx#=ballx#+x#/stufe ; das wären 12/10=1.2 bally#=bally#+y#/stufe ; das waren 2/10=0.2 --- Kollisionsabfrage Next DrawImage Ball Die X und Y-Position des Balls werden auf Kollision mit dem Schläger und den Wänden getestet. Ist dies der Fall, wird die Richtung des Balls geändert. Würde "x#" nicht durch "stufe" geteilt werden, würde der Ball 10*12, also 120 Pixel zurück legen. Sicher könnte man das eleganter lösen, ich wollte nur möglichst wenig an Deinem Code ändern, damit Du das nachvollziehen kannst. Ruckeln kann das auf gar keinem Fall, hast Du vielleicht im Editor den Debug-Modus eingeschaltet? Wenn ja, dann mach den mal aus. Gruß Ralf |
||
![]() |
Triton |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich glaube es ist besser, das
Code: [AUSKLAPPEN] If Stufe = 1 Then ;die angaben des Spieler werden ausgewertet
x = x + 1 ElseIf Stufe = 2 Then x = x + 2 ElseIf Stufe = 3 Then x = x + 3 ElseIf Stufe = 4 Then x = x + 4 ElseIf Stufe = 5 Then x = x + 5 ElseIf Stufe = 6 Then x = x + 6 ElseIf Stufe = 7 Then x = x + 7 ElseIf Stufe = 8 Then x = x + 8 ElseIf Stufe = 9 Then x = x + 9 ElseIf Stufe = 10 Then x = x + 10 EndIf durch das Code: [AUSKLAPPEN] x = x + stufe Zu ersetzen ![]() |
||
da3m0n |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hi,
@Ralf: Danke für deine Erklärung, ich habe mir schon so etwas änliches vorgestellt, aber durch deine Erklärung habe ich es jetzt genau verstanden wie es funktioniert. Ich hatte den Debug-Modus bereits ausgeschaltet, ich hatte gestern Abend auch nur den Verdacht das es ruckelt ( an manchen stellen dachte ich das der Ball etwas hakt.) ich war mir da aber auch nicht ganz sicher und habe dan sicherheitshalber noch mal nachgefragt. ![]() Danke noch mal für deine Hilfe!!! @Triton: Na klar so ist natürlich viel code gespart ![]() Ich denke das ich diese Dinge dann mit der Zeit dazulernen werde. auch danke an dich. da3m0n ps: Wäre cool wenn ihr hir ne bessere Variante posten könntet den Schwierigkeitsgrad zu erhöhen. Muss aber nicht umbedingt ich habe ja vor erst eine möglichkeit. |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group