Ball bei Pong überspringt Schläger

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

da3m0n

Betreff: Ball bei Pong überspringt Schläger

BeitragSo, Aug 22, 2004 0:23
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Confused

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

BeitragSo, Aug 22, 2004 1:39
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Aug 22, 2004 2:21
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Shocked Very Happy oder ist das einfach nur eine etwas zu komplizierte möglichkeit die Geschwindigkeit zu erhöhen und der Rechner oder compiler bekommen probleme ?

Sorry wenn ein paar von meinen Fragen absolut albern klingen, aber wie gesagt ich bin echt total neu auf dem Gebiet Programmieren. Embarassed

Auf jeden fall danke für deine Hilfe
da3m0n

Ralf

BeitragSo, Aug 22, 2004 8:21
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Aug 22, 2004 13:27
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Wink
 

da3m0n

BeitragSo, Aug 22, 2004 14:01
Antworten mit Zitat
Benutzer-Profile anzeigen
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. Embarassed
Danke noch mal für deine Hilfe!!!

@Triton: Na klar so ist natürlich viel code gespart Smile .
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.

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group