Problem beim "Ende" screen

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

Chansi

Betreff: Problem beim "Ende" screen

BeitragMi, Dez 03, 2008 17:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo
Ich bin ein kompletter Neuling in Sachen Blitz und habe erstmal das Tutorial ausprobiert (Eat the dots).
Jetzt wollte ich das Programm noch ein bisschen verfeinern und einen Screen einfügen, der erscheint wenn man alles geschafft hat. Aber irgendwie passiert nichts, wenn ich es schaffe. Der Code ist improvisiert und enthält vermutlich elemtare Fehler.

Code: [AUSKLAPPEN]
Function Restart_Game()
If food= 0
ClearScreens()
Print "Congratulations!"
Print "You have finished the Game! :)"
Print "Press Enter to start again.
If KeyHit(28) InitGame()
EndIf
End Function

Function ClearScreens()
   Delete Each food
   Delete Each rock
End Function
  • Zuletzt bearbeitet von Chansi am Mi, Dez 03, 2008 17:32, insgesamt einmal bearbeitet
 

DjDETE

BeitragMi, Dez 03, 2008 17:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Da ich nicht den kompletten Code sehe, bin ich mir nicht sicher, aber ich glaube du musst warten, bis jemand Enter drückt. Um das zu machen, wäre es, da du eh schon Print benutzt, am einfachsten, das Keyhit(28) durch Input() zu ersetzen.
Code: [AUSKLAPPEN]
Function Restart_Game()
If food= 10
ClearScreens()
Print "Congratulations!"
Print "You have finished the Game! :)"
Print "Press Enter to start again.
Input()
InitGame()
EndIf
End Function

Aber am Besten wäre es, wenn du Print/Input ganz weglassen würdest, da es ziemlich langsam ist:
Code: [AUSKLAPPEN]

Function Restart_Game()
If food= 10
ClearScreens()
Repeat
 Cls
 Text 20,20, "Congratulations!"
 Text 20,40, "You have finished the Game! :)"
 Text 20,60,"Press Enter to start again.
 If KeyHit(28) InitGame()
 Flip
Forever
EndIf
End Function

MfG DeTe

Edit: Ups, da hab ich was im 2. Code vergessen (Cls & Flip)
 

Chansi

BeitragMi, Dez 03, 2008 17:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich glaube, du verstehst mich falsch Wink
Wenn alle Dots verschwunden sind, erscheint der Bildschirm nicht, auf dem das alles stehen soll.
Der komplette Code ist jetzt so:

Code: [AUSKLAPPEN]
; eat the dots
Graphics 640,480
SetBuffer BackBuffer()
Global status=0,x#=0,y#=0,speed#=1,dir=1
; main loop
Type food
Field x,y
End Type
Type rock
Field x,y
End Type
While Not KeyHit(1)
; refresh screen
Flip
Cls
Color 255,255,0
Rect 0,0,640,480,0
; select state
Select status
Case 0
Locate 100,100
Print "Press Enter To Start"
If KeyHit(28) InitGame()
Case 1
UpdatePlayer()
End Select
Wend

Function InitGame()

x=320
y=240
speed=1
dir=1
status=1
For f.food=Each food Delete f Next
For r.rock=Each rock Delete r Next

For i=0 To 20
r.rock=New rock
r\x=Rnd(640)
r\y=Rnd(480)
Next
For i=0 To 20
f.food=New food
f\x=Rnd(640)
f\y=Rnd(480)
Next
End Function
Function UpdatePlayer()
UpdateRocksandFood()   

If Not RectsOverlap(x,y,10,10,0,0,630,470) status=0   
; steer player
If KeyDown(200) Or JoyY()<-0.5 dir=0
If KeyDown(205) Or JoyX()>0.5 dir=1
If KeyDown(208) Or JoyY()>0.5 dir=2
If KeyDown(203) Or JoyX()<-0.5 dir=3
; move player
Select dir
Case 0 y=y-speed
Case 1 x=x+speed
Case 2 y=y+speed
Case 3 x=x-speed
End Select
; draw player
Color 255,255,255
Rect x,y,10,10
End Function

Function UpdateRocksandFood()
; draw food and check if eaten
Color 0,255,0
For f.food=Each food
Rect f\x,f\y,10,10
If RectsOverlap(x,y,10,10,f\x,f\y,10,10)
speed=speed+0.2
Delete f
EndIf
Next
; draw rocks and check for roadkill
Color 255,0,255
For r.rock=Each rock
Rect r\x,r\y,10,10
If RectsOverlap(x,y,10,10,r\x,r\y,10,10)
status=0
EndIf
Next
End Function

Function Restart_Game()
If food=0
ClearScreens()
Repeat
 Text 20,20, "Congratulations!"
 Text 20,40, "You have finished the Game! :)"
 Text 20,60,"Press Enter to start again.
 If KeyHit(28) InitGame()
Forever
EndIf
End Function

Function ClearScreens()
   Delete Each food
   Delete Each rock
End Function
 

DjDETE

BeitragMi, Dez 03, 2008 17:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Du musst die Funktion Restart_Game() natürlich auch in der Hauptschleife ausführen. Und du kannst nicht food=0 verwenden, da es sich ja um Types handelt. Deshalb habe ich die Anzahl einfach durch eine For...Next Schleife gezählt, was sicher nicht die eleganteste Lösung ist, aber mir viel auf die Schnelle nichts besseres ein:
Code: [AUSKLAPPEN]
 eat the dots
Graphics 640,480
SetBuffer BackBuffer()
Global status=0,x#=0,y#=0,speed#=1,dir=1
; main loop
Type food
Field x,y
End Type
Type rock
Field x,y
End Type
While Not KeyHit(1)
; refresh screen
Flip
Cls
Color 255,255,0
Rect 0,0,640,480,0
; select state
Select status
Case 0
Locate 100,100
Print "Press Enter To Start"
If KeyHit(28) InitGame()
Case 1
UpdatePlayer()
Restart_Game()
End Select
Wend

Function InitGame()

x=320
y=240
speed=1
dir=1
status=1
For f.food=Each food Delete f Next
For r.rock=Each rock Delete r Next

For i=0 To 20
r.rock=New rock
r\x=Rnd(640)
r\y=Rnd(480)
Next
For i=0 To 20
f.food=New food
f\x=Rnd(640)
f\y=Rnd(480)
Next
End Function
Function UpdatePlayer()
UpdateRocksandFood()   

If Not RectsOverlap(x,y,10,10,0,0,630,470) status=0   
; steer player
If KeyDown(200) Or JoyY()<-0.5 dir=0
If KeyDown(205) Or JoyX()>0.5 dir=1
If KeyDown(208) Or JoyY()>0.5 dir=2
If KeyDown(203) Or JoyX()<-0.5 dir=3
; move player
Select dir
Case 0 y=y-speed
Case 1 x=x+speed
Case 2 y=y+speed
Case 3 x=x-speed
End Select
; draw player
Color 255,255,255
Rect x,y,10,10
End Function

Function UpdateRocksandFood()
; draw food and check if eaten
Color 0,255,0
For f.food=Each food
Rect f\x,f\y,10,10
If RectsOverlap(x,y,10,10,f\x,f\y,10,10)
speed=speed+0.2
Delete f
EndIf
Next
; draw rocks and check for roadkill
Color 255,0,255
For r.rock=Each rock
Rect r\x,r\y,10,10
If RectsOverlap(x,y,10,10,r\x,r\y,10,10)
status=0
EndIf
Next
End Function

Function Restart_Game()
For f.food=Each food
 anzahl=anzahl+1
Next
If anzahl=0
 ClearScreens()
 Repeat
  Cls
  Text 20,20, "Congratulations!"
  Text 20,40, "You have finished the Game! :)"
  Text 20,60,"Press Enter to start again.
  If KeyHit(28) InitGame()
  Flip
 Forever
EndIf
End Function

Function ClearScreens()
   Delete Each food
   Delete Each rock
End Function
Aktuelles Projekt: XXX |XXX | 3% der v1b fertig
www.emu-soft.de.vu Für die Homepage suche ich noch Linktauschpartner, bei Interesse einfach melden.
 

Chansi

BeitragMi, Dez 03, 2008 18:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Erstmal vielen, herzlichen Danke für deine Hilfe Smile Der Bildschirm erscheint jetzt.
Aber da tut sich ein neues Problem auf... Durch Drücken der Enter Taste startet man das Spiel nicht neu - Warum auch immer. Ich wäre demjenigen sehr verbunden, der mir dabei helfen könnte.

ozzi789

BeitragMi, Dez 03, 2008 18:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Falls es unklar sein sollte, nur fragen
Hab die Food und Rocks auf 2 gesetzt da es so schneller geht um es zu testen Razz

mfg
Code: [AUSKLAPPEN]
Graphics 640,480
SetBuffer BackBuffer()
Global status=0,x#=0,y#=0,speed#=1,dir=1,gamerestart=0
; main loop
Type food
Field x,y
End Type
Type rock
Field x,y
End Type
While Not KeyHit(1)
; refresh screen
Flip
Cls
Color 255,255,0
Rect 0,0,640,480,0
; select state
Select status
Case 0
Locate 100,100
Print "Press Enter To Start"
If KeyHit(28) InitGame()
Case 1
UpdatePlayer()
Restart_Game()
If gamerestart=1
gamerestart=0
Initgame()
EndIf
End Select
Wend

Function InitGame()

x=320
y=240
speed=1
dir=1
status=1
For f.food=Each food Delete f Next
For r.rock=Each rock Delete r Next

For i=0 To 2
r.rock=New rock
r\x=Rnd(640)
r\y=Rnd(480)
Next
For i=0 To 2
f.food=New food
f\x=Rnd(640)
f\y=Rnd(480)
Next
End Function

Function UpdatePlayer()
UpdateRocksandFood()   

If Not RectsOverlap(x,y,10,10,0,0,630,470) status=0   
; steer player
If KeyDown(200) Or JoyY()<-0.5 dir=0
If KeyDown(205) Or JoyX()>0.5 dir=1
If KeyDown(208) Or JoyY()>0.5 dir=2
If KeyDown(203) Or JoyX()<-0.5 dir=3
; move player
Select dir
Case 0 y=y-speed
Case 1 x=x+speed
Case 2 y=y+speed
Case 3 x=x-speed
End Select
; draw player
Color 255,255,255
Rect x,y,10,10
End Function

Function UpdateRocksandFood()
; draw food and check if eaten
Color 0,255,0
For f.food=Each food
Rect f\x,f\y,10,10
If RectsOverlap(x,y,10,10,f\x,f\y,10,10)
speed=speed+0.2
Delete f
EndIf
Next
; draw rocks and check for roadkill
Color 255,0,255
For r.rock=Each rock
Rect r\x,r\y,10,10
If RectsOverlap(x,y,10,10,r\x,r\y,10,10)
status=0
EndIf
Next
End Function

Function Restart_Game()
For f.food=Each food
 anzahl=anzahl+1
Next
If anzahl=0
 ClearScreens()
 Repeat
  Cls
  Text 20,20, "Congratulations!"
  Text 20,40, "You have finished the Game! :)"
  Text 20,60,"Press Enter to start again.
  If KeyHit(28) gamerestart=1
  Flip
 Until gamerestart=1
EndIf
End Function

Function ClearScreens()
   Delete Each food
   Delete Each rock
End Function
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5
 

Chansi

BeitragMi, Dez 03, 2008 18:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich bin euch wirklich unendlich dankbar, alles funktioniert jetzt wie es soll Smile
 

DjDETE

BeitragMi, Dez 03, 2008 18:26
Antworten mit Zitat
Benutzer-Profile anzeigen
np Laughing
Du musst nachdem Enter gedrückt wurde, auch wieder in die Hauptschleife zurückkehren,
das machst du mit Return.
Code: [AUSKLAPPEN]

Function Restart_Game()
For f.food=Each food
 anzahl=anzahl+1
Next
If anzahl=13
 ClearScreens()
 Repeat
  Cls
  Text 20,20, "Congratulations!"
  Text 20,40, "You have finished the Game! :)"
  Text 20,60,"Press Enter to start again.
  If KeyHit(28) InitGame() : Return
  Flip
 Forever
EndIf
End Function


Mist da war ich wohl zu langsam, aber ich glaube meine Methode ist besser Wink
Aktuelles Projekt: XXX |XXX | 3% der v1b fertig
www.emu-soft.de.vu Für die Homepage suche ich noch Linktauschpartner, bei Interesse einfach melden.

ozzi789

BeitragMi, Dez 03, 2008 18:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja deine is ... eleganter;)
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group