Seite 1 von 2

Probleme mit ESC

Verfasst: 17.10.2005 15:03
von PB42
Hallo,

ich habe zur Übung ein Spiel aus den PB-Beispielen übernommen, (mit leichten Abänderungen), und habe dazu noch einen Punkte-Zähler eingebaut, denn ich will am Spielende den Punktestand eingeblendet haben (nicht über MessageRequester nach "CloseWindow", sondern direkt mit dem Spielfeld als Hintergrund). Also habe ich eine zweite Endlosschleife eingebaut und das klappt auch mit der Punktestandsanzeige, nur: Diese Schleife läßt sich nicht mit ESC abbrechen, obwohl da exakt die gleichen Befehle für ESC drinstehen wie in der Hauptschleife! Hier ist der Code:

Code: Alles auswählen

InitSprite()
InitKeyboard()
OpenScreen(640,480,32,"Ballspiel")
 
x2 = 15          ;Dicke des Schlägers
y2 = 50          ;Länge des Schlägers
x1 = 635 - x2    ;Koordinaten 
y1 = 240 - Y2/2  ;für den Schläger linke obere Ecke
kp = 5           ;Tempostufe Schlägerbewegung
w = 0            ;Start-Verzögerung 2,5 sec.
Zaehler = 0      ;für Punkte-Anzeige am Spielende

xb = Random(550)  ;Ausgangsposition 
yb = Random(480)  ;Ball

a = 5            ;Tempostufe Ballbewegung
bewegx = -a
bewegy = -a

Repeat
  ClearScreen(0,200,0)
  
  StartDrawing(ScreenOutput())
  ExamineKeyboard()

  Box(x1,y1,x2,y2)             ;Schläger
  Circle(xb,yb,5,RGB(0,0,200)) ;Ball
  
  StopDrawing()
  FlipBuffers()
  
  If w = 0
  w = 1
  Delay(2500)
  EndIf
  
  xb = xb + bewegx    ;Ballbewegung in x-Richtung
  yb = yb + bewegy    ;Ballbewegung in y-Richtung

  If xb < 0           ;Ball-Anschlag linke Bande
  bewegx = a          ;Bewegungsumkehr
  EndIf
  
  If yb < 0           ;Ball-Anschlag obere Bande
  bewegy = a          ;Bewegungsumkehr
  EndIf
  
  If yb > 480         ;Ball-Anschlag untere Bande
  bewegy = -a         ;Bewegungsumkehr
  EndIf
  
  If KeyboardPushed(#PB_key_up)
  y1 - kp
  If y1 < 0
  y1 = 0
  EndIf
  EndIf

  If KeyboardPushed(#PB_key_down)
  y1 + kp
  If y1 > (480 - y2)
  y1 = 480 - y2
  EndIf
  EndIf
  
  If xb >= x1 And yb > y1-3 And yb < (y1 + y2+3)
  bewegx = -a
  Zaehler = Zaehler + 1
  EndIf
  
  If xb > 680 
  
Repeat
  StartDrawing(ScreenOutput())  
  DrawingMode(1)               
  Locate(0,0)                  
  FrontColor(0,0,255)          
  DrawText("Str(Zaehler) + " Punkte")
  StopDrawing()               
  Delay(10)
  FlipBuffers()
 
  If KeyboardPushed(#PB_key_escape)
  End
  EndIf 
ForEver
   
  EndIf
  
  If KeyboardPushed(#PB_key_escape)
  End 
  EndIf
ForEver
Und dann frage ich mich auch noch, warum nicht über dem Bildschirm "Ballspiel" angezeigt wird, denn das ist doch unter "Openscreen" so vorgegeben. Danke für Infos!

PB42

P.S.: Ich kann das Spiel, nachdem der Ball im Aus ist, nur brutal mit Alt + TAB abbrechen, und dann meldet mir der Debugger den Value NULL für StartDrawing, aber der Punktestand war doch richtig erschienen. Komisch.

Verfasst: 17.10.2005 15:11
von AND51
Oh, jetzt wollte ich grad was anderes schreiben... aber dann merkte ich, dass das gar nicht das Problem löst...

Du musst vor jedem KeyboardPushed() die Funktion ExamineKeyboard() aufrufen.
Damit wird die Tastatur aktualisiert, d. h. nach/bei jedem ExamneKeyboard() wird erneut auf Tastendrück überprüft, sodass, wenn das nächste mal KeyboardPushed() aufgerufen wird, der letzte, ermittelte, aktualle Tastendrück zurückgegeben wird.

ExamineKeybord() - siehe Hilfe

P.S.: Löst es das Problem?

Verfasst: 17.10.2005 15:14
von Laurin
Du hast in der zweiten Endlosschleife das ExamineKeyboard() vergessen. Drum funktioniert da kein ESC. ;)
Und dann frage ich mich auch noch, warum nicht über dem Bildschirm "Ballspiel" angezeigt wird, denn das ist doch unter "Openscreen" so vorgegeben.
Drück mal [Alt] + [Tab], während dein Programm läuft. Jetzt schau mal, wie es heißt. ;)

Was ich dir unbedingt noch empfehlen würde, ist, Fehlerabfragen einzubauen.
Du hast programmiert:

Code: Alles auswählen

InitSprite()
InitKeyboard()
OpenScreen(640,480,32,"Ballspiel")
Daraus sollte man ungefähr sowas machen:

Code: Alles auswählen

If InitSprite()
  If InitKeyboard()
    If OpenScreen(640,480,32,"Ballspiel")
      ; Alles OK
    Else
      Debug "Fehler"
    EndIf
  Else
    Debug "Fehler"
  EndIf
Else
  Debug "Fehler"
Endif
Ich denke, du hast verstanden, was ich meine.

Verfasst: 17.10.2005 15:14
von AND51
Weiteren Fehler in der inneren Repeat-Schleife entdeckt:

Dein

Code: Alles auswählen

  DrawText("Str(Zaehler) + " Punkte")   ; falsch!!
entferne das erste Anführungszeichen. Sonst bleibt dies ein Syntaxfehler.

benutze diesen

Code: Alles auswählen

  DrawText(Str(Zaehler) + " Punkte") 

Verfasst: 17.10.2005 15:21
von ts-soft
Laurins Tipp mal etwas kürzer:

Code: Alles auswählen

If InitSprite() And InitKeyboard() And OpenScreen(640,480,32,"Ballspiel")
  ; alles Okay
Else
  Debug "soon Mist, Fehler"
EndIf

Verfasst: 17.10.2005 15:21
von PB42
Super, wie schnell das hier geht. Das mit dem ExamaineKeyboard war in der Tat der Fehler und jetzt funktioniert auch der zweite Schleifenabruch. Danke! Das mit dem Gänsefüßchen zuviel im Code hatte ich nur vergessen, hier in meinem Post zu korrigieren. Ich habe auch mal während des Programmablaufs Alt + TAB gedrückt, dann meldet sich halt wieder der Debugger mit Null Value für StartDrawing. Wieso eigentlich?

PB42

Verfasst: 17.10.2005 16:00
von AND51
So, dies ist schon der 3. Post und ich habe immer noch was gefunden:

Ich habe den code korrigiert, die ExamineKeyboard()s eingesetzt und den Syntaxfehler beseitigt. Außerdem habe ich noch ein paar Änderungen vorgenommen:

Code: Alles auswählen

InitSprite() 
InitKeyboard() 

arial_20=LoadFont(0, "Arial", 20, #PB_Font_HighQuality) ; Läd die Schriftart Arial in der
                                                        ; Größe 20 für den Punktestand
                                                        ; und speichert sie in der Variablen
                                                        ; 'arial_20'

ExamineDesktops()            ; Aktualisiert die Desktops und stellt Infos bereit
	breite=DesktopWidth(0)     ; speichert in 'breite' die Breite des Desktops (in Pixel)
	hoehe=DesktopHeight(0)     ; speichert in 'hoehe' die Hoehe des Desktops (in Pixel)
	farbtiefe=DesktopDepth(0)  ; speichert in 'farbtiefe' die Farbtiefe (in Bits)

OpenScreen(breite, hoehe, farbtiefe,"Ballspiel") ; die Daten des Desktops werden hier eingetragen
  
x2 = 15          ;Dicke des Schlägers 
y2 = 50          ;Länge des Schlägers 
x1 = 635 - x2    ;Koordinaten 
y1 = 240 - Y2/2  ;für den Schläger linke obere Ecke 
kp = 5           ;Tempostufe Schlägerbewegung 
w = 0            ;Start-Verzögerung 2,5 sec. 
Zaehler = 0      ;für Punkte-Anzeige am Spielende 

xb = Random(640)  ;Ausgangsposition 
yb = Random(480)  ;Ball 

a = 5            ;Tempostufe Ballbewegung 
bewegx = -a 
bewegy = -a 

Repeat 
  ClearScreen(0,200,0) 
  
  StartDrawing(ScreenOutput()) 
  ExamineKeyboard() 

  Box(x1,y1,x2,y2)             ;Schläger 
  Circle(xb,yb,5,RGB(0,0,200)) ;Ball 
  
  StopDrawing() 
  FlipBuffers() 
  
  If w = 0 
  w = 1 
  Delay(2500) 
  EndIf 
  
  xb = xb + bewegx    ;Ballbewegung in x-Richtung 
  yb = yb + bewegy    ;Ballbewegung in y-Richtung 

  If xb < 0           ;Ball-Anschlag linke Bande 
  bewegx = a          ;Bewegungsumkehr 
  EndIf 
  
  If yb < 0           ;Ball-Anschlag obere Bande 
  bewegy = a          ;Bewegungsumkehr 
  EndIf 
  
  If yb > 480         ;Ball-Anschlag untere Bande 
  bewegy = -a         ;Bewegungsumkehr 
  EndIf 
    ExamineKeyboard() 
  If KeyboardPushed(#PB_Key_Up) 
  y1 - kp 
  If y1 < 0 
  y1 = 0 
  EndIf 
  EndIf 
  ExamineKeyboard() 
  If KeyboardPushed(#PB_Key_Down) 
  y1 + kp 
  If y1 > (480 - y2) 
  y1 = 480 - y2 
  EndIf 
  EndIf 
  
  If xb >= x1 And yb > y1-3 And yb < (y1 + y2+3) 
  bewegx = -a 
  Zaehler = Zaehler + 1 
  EndIf 
  
  If xb > 680 
  
Repeat 
  StartDrawing(ScreenOutput())  
  DrawingMode(1)                
  Locate(Int(breite/2), Int(hoehe/2))
  FrontColor(0,0,255)          
  DrawingFont(arial_20)                    ; Setzt für alle folgenden 'DrawText'-Befehle
                                           ; auf die in 'arial_20' gespeicherte Schriftart
  DrawText("GAME OVER! "+Str(Zaehler)+" Punkte") 
  StopDrawing()                
  Delay(10) 
  FlipBuffers() 
    ExamineKeyboard() 
  If KeyboardPushed(#PB_Key_Escape) 
  End 
  EndIf 
ForEver 
    
  EndIf 
    ExamineKeyboard() 
  If KeyboardPushed(#PB_Key_Escape) 
  End 
  EndIf 
ForEver
Die Änderungen:
Der OpenScreen wird nicht mehr in fixer Größe, 640x480x32, aufgebaut, sondern nimmt die Einstelungen des Desktops. So wird sichergestellt, dass die jeweilige Auflösung auf dem Computer des Benutzers in Kombination mit der Farbtiefe auch verfügbar ist.
Deine Aufgabe, PB42, besteht nun darin, die restliche vergeudete Fläche für das SPiel benutzbar zu machen, denn mit meinem Code kannst du nur in der oberen, Linken Ecke spielen.

Zudem habe ich noch den Text, der am ende des Spiels erscheint, geändert. Ich habe in nicht links oben anzeigen lassen, sondern in der Mitte des Bildschirms. Das funktioniert, weil ich den Befehl Locate() verändert habe, schau in die mal an: Er greift jetzt auch genauso wie OpenScreen() auf die Variablen breite und hoehe zu, teilt diese durch zwei. Warum der befehl Int()? Der rundet die zahl ab, sodass keine Kommazahlen auftreten können, um zu vermeiden dass evtl. eine fehermeldung auftritt, nach dem Motto: "Feheler!! Hä? Wie soll ich denn bitteschön den Text bei 125,5 und 78,5 platzieren??"
Den text habe ich außerdem nach "GAME OVER! x Punkte" geändert und ihm die Schriftart "Arial" in der Größe 20 zugewiesen. Das kannst du auch ändern. Siehe ganz oben beim LoadFont() Befehl. SO ist der viiiiiiiiel besser zu lesen.

Alle Änderungen sind leicht rückgängi zu machen oder zu ändern. Du kannst jederzeit jeden von mir benutzten Befehl in der F1-Hilfe nachschauen!
Außerdem habe ich von mir eingefügte Befehle und Änderungen kommentiert und direkt etwas drangeschrieben!!


Ich hoffe, du wirst einigermaßen glücklich mit diesem Code. :wink: :allright: <)

Eines muss ich aber noch loswerden: Ich bin stolz auf mich, dass ich dir auf diese Art und Weise helfen konnte... Ich bewndere immer die Lete, die sich so viel Mühe machen und ganze (!) Programme / Codes posten... (Und jetzt gehör ich selbst dazu ;-) )

Nachtrag: Was muss ich da sehen! Böse blöse, Laurin und ts-soft! Einfach zu helfen, während ich einen laaangen Post schreibe und mir ne Pizza backe! :allright: :wink: :wink: :lol: PB42, aber das stimmt, nimm dir deren tipps auch zu Herzen!

Verfasst: 17.10.2005 16:23
von PB42
Vielen Dank, And51, allerdings geht in meiner Demo-Version kein ExamineDesktop. Ist aber trotzdem gut zu wissen für später, weswegen ich Deinen Code auf alle Fälle abspeichere. Ansehen werde ich mir den auch jetzt schon, allerdings habe ich jetzt so lange vor der Kiste gesessen, daß ich erstmal was essen muß. Dein Code hat übrigens noch etwas sehr schönes für mich, denn nun kann ich endlich mal sehen, wie LoadFont geht! So kommt eins zum anderen. Toll.

PB42

Verfasst: 18.10.2005 15:44
von AND51
allerdings geht in meiner Demo-Version kein ExamineDesktop.
Das ist schade, dass wusste ich nicht.

weswegen ich Deinen Code auf alle Fälle abspeichere.
C 8) 8) l!

Ansehen werde ich mir den auch jetzt schon
C 8) 8) ler!

Dein Code hat übrigens noch etwas sehr schönes für mich, denn nun kann ich endlich mal sehen, wie LoadFont geht! So kommt eins zum anderen. Toll.
Das ist doch gut! Aber schade, dass ich den Code nur zufällig reingebracht habe. Hätte ich das nicht gemacht, wär dein interesse an loadFont vielleicht verflogen... und du wärst niiiiiie, nie, nie wieder auf LoadFont zu sprechen gekommen (ok, oder vielleicht erst später). Hätteste mal gesagt: "Wie kann ich gleich auch noch die Schrift verändern? :wink: <)

allerdings habe ich jetzt so lange vor der Kiste gesessen
Kleines Ratespiel. Wer bin ich?
"Sitzt du schon wieder so lange vorm Computer? Wie oft muss ich dir noch sagen, dass das nicht gut ist?! Jetzt, setz dich geälligst hin und lerne... Blablabla, rababer, salbader, tob, bla..."
:allright: :roll: :lol: :lol: :mrgreen:

Verfasst: 18.10.2005 20:11
von Christian H
PB42 hat geschrieben:Vielen Dank, And51, allerdings geht in meiner Demo-Version kein ExamineDesktop.
Ich hab's mit der Demo-Version von PureBasic 3.94 WIN ohne Probleme testen können.
http://www.purebasic.com/german/download.php3

Gruß
Christian