Frage zu Schleife im Spiel

Für allgemeine Fragen zur Programmierung mit PureBasic.
Robin
Beiträge: 26
Registriert: 29.09.2004 13:40
Wohnort: Neuravensburg (Am Bodensee)
Kontaktdaten:

Frage zu Schleife im Spiel

Beitrag von Robin »

Ich weis nicht ob ich es hier richtig gepostet habe, aber ich hab da ein Problem. Ich bin gerade an einem Spiel, das Spiel hat zwei repeat schleifen. Die erste ist Das Hauptmenü, die zweite das erste Level vom spiel. Das sieht so aus:

Repeat

... ; Das Hauptmenü

Until nextlevel = 1 ; Also wenn man im Hauptmenü auf Play klickt


Repeat

... ; Das Spiel. Wenn man im Spiel auf ein bestimmtes Sprite läuft, dann eine Taste drückt, kommt man in einen anderen Raum, also eine erneute repeat schleife. ...

Until nextlevel = 2


Repeat ;der neue Raum

... ;So, hier liegt das Problem. Wenn ich jetzt aus meinem "raum" wieder hinaus will, sollte das Programm in die letzte schleife sprinden können. Also ins Level 1. Ich kenn kein Befehl den man hier anwenden könnte.


Until nextlevel = 2


Hier nochmal die erklärung zu den "räumen", also die erste schleife ist das Hauptmenü, wenn man da auf Play drückt, beendet die schleife und eine neue wird gestartet, also das Level 1, Das Level 1 ist eine Burg von innen, und wenn ich auf ein Sprite laufe (Das sprite ist immer vor einem Haus oder so) und die taste e, drücke gelange ich in den Raum. Wieder wird die schleife geschlossen und die neue gestartet. Okay jetzt das Problem: Wenn ich wieder aus dem Raum hinaus möchte, also wieder in die Burg, dann muss das Programm nach oben in die "Level 1" schleife zurückspringen, denn das ist die Burg. Kann mir jemand helfen. Ich kann euch auch mein Spiel geben, damit ihr es genauer anschauen könnt.
pg
Beiträge: 18
Registriert: 03.10.2004 22:35

Beitrag von pg »

Ich kenn zwar deinen Code nicht, aber schau dir doch mal den Befehl Gosub an:

Code: Alles auswählen

Repeat
  ;dein code
 If level1
  Gosub Level1
 EndIf
 If level2
  Gosub Level2
 EndIf
 ;usw....
Until GameExit=1
End


Level1:
 Repeat
  ;dein code
 Until Level1Ende=1
Return


Level2:
 Repeat
  ;dein code
 Until Level2Ende=1
Return

edit hatte selbst noch einen Fehler gemacht.... :-)
Robin
Beiträge: 26
Registriert: 29.09.2004 13:40
Wohnort: Neuravensburg (Am Bodensee)
Kontaktdaten:

Beitrag von Robin »

Das funktioniert nicht, oder ich mach was falsch. Weil der Gosub Bafehl muss auf eine Sprungmarke weiter oben imm code zugreifen, das geht nicht.

Aber hier ist mein code:

Code: Alles auswählen


; Hier werden die folgenden sachen getestet



If InitSprite() = 0 Or InitKeyboard() = 0 Or InitSound() = 0 Or InitMouse() = 0
  
  End
  
EndIf 

;Hier werden die einzelnen sachen wie Sound Decoder usw. geladen

UseOGGSoundDecoder()



; Hier wird das Scren für das ganze spiel gestartet

If OpenScreen(800, 600, 32, "noname")
  
  
  ;---------------------------------------------------------------------------
  
  ;                                              --------HAUPTMENÜ----------
  
  ;---------------------------------------------------------------------------
  
  

  
  
  
  
; HIER ERDEN DIE DATEIEN FÜR DAS HAUPTMENÜ GELADEN 
  
  LoadSprite(0, "Gfx\mainback.bmp", 0)
  LoadSprite(1, "Gfx\play.bmp", 0)
  LoadSprite(4, "Gfx\exit.bmp", 0)
  
  LoadSprite(5, "Gfx\pointer.bmp", 0)
  
  
  
  
  
  
  
  
  
  ; Hier wird der Hintergrund sound des Hauptmenüs geladen
  
  LoadSound(0, "Sfx\background.ogg")
  SoundVolume(0, 50) 
  PlaySound(0, 1)
  
  
  Delay(2000)
  
  ; Hier fängt das Hauptmenü an
  

  
  Repeat 
    
    ExamineKeyboard()
    ExamineMouse()
    
    
    FlipBuffers()
    ClearScreen(0, 0, 0)
    
    DisplaySprite(0, 0, 0)
    
    
    
    
    
    
    DisplayTransparentSprite(1, 550, 150)
    DisplayTransparentSprite(4, 550, 250)
    
    ; der Mauszeider wird eingeblendet
    
    mx = MouseX()
    my = MouseY()
    
    DisplayTransparentSprite(5, mx, my)
    
    
    If MouseButton(1) And SpritePixelCollision(5, mx, my, 1, 550, 150) 
      
      play = 1
      
    EndIf 
    
    
    
    If MouseButton(1) And SpritePixelCollision(5, mx, my, 4, 550, 250)
      
      exit = 1
      
    EndIf 
    
    
    
  Until exit = 1 Or play = 1
  

  
  If exit = 1
    
    End 
    
  EndIf  
  
  
  If play = 1
    
    
    
    ;^^ Das EndIF für das Play ist ganz unten im Programm beschrieben
  
  
   ;----------------------------------------------------------
  
  ; Kapitel 1  Die Freilassung aus dem Kerker
    
    ;-----------------------------------------------------------
    
    
    FreeSprite(0)
    FreeSprite(4)
    FreeSprite(5)
    
    FreeSound(0)
    
    
   
  
  
    LoadSprite(0, "Gfx\schlossboden.bmp", 0)
    LoadSprite(1, "Gfx\schlossmauerquer1.bmp", 0)
    LoadSprite(2, "Gfx\schlossmauerlang1.bmp", 0)
    LoadSprite(3, "Gfx\schlossmauerquer2.bmp", 0)
    LoadSprite(4, "Gfx\schlossmauerlang2.bmp", 0)
    
    LoadSprite(5, "Gfx\up.bmp", 0)
    LoadSprite(6, "Gfx\down.bmp", 0)
    LoadSprite(7, "Gfx\left.bmp", 0)
    LoadSprite(8, "Gfx\right.bmp", 0)
    
    LoadSprite(9, "Gfx\stand.bmp", 0)
    
    LoadSprite(10, "Gfx\sichtfenster.bmp", 0)
    
    LoadSprite(11, "Gfx\stopquer.bmp", 0)
    LoadSprite(12, "Gfx\stoplang.bmp", 0)
    
    LoadSprite(13, "Gfx\turm.bmp", 0)
    
    LoadSprite(14, "Gfx\burgtor.bmp", 0)
    
    LoadSprite(15, "Gfx\brunnen.bmp", 0)
    
    LoadSprite(16, "Gfx\stopkleinlang.bmp", 0)
    
    LoadSprite(17, "Gfx\stepin.bmp", 0)
    
    LoadSprite(18, "Gfx\incomplete.bmp", 0)
    
    
    ; Der Ritter 1
    
    LoadSprite(19, "Gfx\ritter2left.bmp", 0)   ; Der Ritter kann nur nach rechts oder links laufen
    LoadSprite(20, "Gfx\ritter2right.bmp", 0)
    
    
    
    
    
    
    
    LoadSound(0, "Sfx\leute.wav")
    SoundVolume(0, 50)
    PlaySound(0, 1)
    
    
    
    
  
  
    
    x = 372
    y = 272
  
    direction = up
  
    
    
    
  ;Das erste Trainingslevel
  
    ritter2x = 500
    ritterx = 200
    
  
  
  Repeat 
   
    
    ExamineKeyboard()
    
    FlipBuffers()
    
    ClearScreen(0, 0, 0)
    
    
    
    DisplaySprite(0, wx, wy) ;Den Booden darstellen
    
    
  
    
    
  
    
    
    
    
    
    
    ; Die Burgmauern anzeigen
    
     
    ;Oben
    
    
    
    For m1=0 To 720 Step 80
      
      DisplaySprite(1, wx+m1, wy)
      
    Next
    
    
    DisplaySprite(11, wx, wy+80)
    
    
    
    
    
    
    
    ; Unten
    
    For m2=0 To 720 Step 80
      
      DisplaySprite(3, wx+m2, wy+520)
      
    Next 
    
   
    DisplaySprite(11, wx, wy+520)
    
    
    
    
    
    ; Links
    
    
    For m3=0 To 520 Step 80
      
      DisplaySprite(2, wx, wy+m3)
      
    Next 
    
    DisplaySprite(12, wx+80, wy)
    
    
    
    
    
    
    ;Rechts wirn Manuell gemacht
    
    
    
    
    
    
    
    
    
    
    ; Die zwei Mauern über- und unterhalb vom tor manuel anzeigen
    
    ;oben
    DisplaySprite(4, wx+720, wy+80)
    
    ;unten
    DisplaySprite(4, wx+720, wy+440)
    
    ; Die Kollisionen
    
    DisplaySprite(16, wx+720, wy+80)
    DisplaySprite(16, wx+720, wy+440)
    
    
    
      
      
    ; HIER WERDEN GEBÄUDE WIE EIN TURM ANGEZEIGT
    
    ; Die vier Wachtürme
    
    DisplayTransparentSprite(13, wx-12, wy-15)
    
    DisplayTransparentSprite(13, wx-10, wy+510)
    
    DisplayTransparentSprite(13, wx+710, wy-15)
    
    DisplayTransparentSprite(13, wx+710, wy+510)
    
    ; Das Burgtor
    
    DisplayTransparentSprite(14, wx+735, wy+160)
    
    ; Der Brunnen
    
    DisplayTransparentSprite(15, wx+400, wy+256)
    
    ;Hier noch die Stepp inns
    
    DisplaySprite(17, wx+710, wy+270)
    
   
    
    
    
    
    
    
    
    
    
   
     
      
    
    If KeyboardPushed(#PB_Key_Up) = 0 And KeyboardPushed(#PB_Key_Down) = 0 And KeyboardPushed(#PB_Key_Left) = 0 And KeyboardPushed(#PB_Key_Right) = 0
      
      DisplayTransparentSprite(9, x, y)
      
    EndIf 
    
   
    
    
    ; DIE TASTEN ZUR BEWEGUNG
      

      
    
      
      
    If KeyboardPushed(#PB_Key_W) 
      
      If SpritePixelCollision(5, x, y, 11, wx, wy+80) Or SpriteCollision(5, x, y, 16, wx+720, wy+80) Or SpriteCollision(5, x, y, 16, wx+720, wy+440) Or SpriteCollision(5, x, y, 14, wx+725, wy+160) Or SpriteCollision(5, x, y, 15, wx+400, wy+256)
        
        wy-4
        
      EndIf 
     
      
        
      
   
        wy+2
        
      
        
       
      DisplayTransparentSprite(5, x, y) 
      
      
    EndIf 
    
    
    
    
  
    
    If KeyboardPushed(#PB_Key_S)
    
      If SpritePixelCollision(6, x, y, 11, wx, wy+520) Or SpriteCollision(6, x, y, 16, wx+720, wy+80) Or SpriteCollision(6, x, y, 16, wx+720, wy+440) Or SpriteCollision(6, x, y, 14, wx+725, wy+160) Or SpriteCollision(6, x, y, 15, wx+400, wy+256)
        
        wy+4
        
      EndIf 
      
      
       
        wy-2
          
      DisplayTransparentSprite(6, x, y)
      
      
      
    EndIf 
    
    
    
    
    
 
    
    If KeyboardPushed(#PB_Key_A) 
    
      If SpritePixelCollision(7, x, y, 12, wx+80, wy) Or SpriteCollision(7, x, y, 16, wx+720, wy+80) Or SpriteCollision(7, x, y, 16, wx+720, wy+440) Or SpriteCollision(7, x, y, 14, wx+725, wy+160) Or SpriteCollision(7, x, y, 15, wx+400, wy+256)
      
      
        wx-4
        
      EndIf 
        
        
        wx+2
        
      
        
        
      DisplayTransparentSprite(7, x, y)
     
      
      
    EndIf 
    
  
    
    
    
    
    
  
    
    If KeyboardPushed(#PB_Key_D)
      
      
     
      If SpriteCollision(8, x, y, 16, wx+720, wy+80) Or SpriteCollision(8, x, y, 16, wx+720, wy+440) Or SpriteCollision(8, x, y, 14, wx+725, wy+160) Or SpriteCollision(8, x, y, 15, wx+400, wy+256)
        
        wx+4
        
      EndIf 
        
        
     
        
        
      wx-2
       
      
      DisplayTransparentSprite(8, x, y)
    
      
     
    EndIf 
    
    
    
    
    
    If KeyboardPushed(#PB_Key_E) And SpritePixelCollision(9, x, y, 17, wx+710, wy+270) And done = 3
      
      nextlevel = 1
      
    Else 
     
      DisplaySprite(18, 0, 0)
      
    EndIf 
      
      
      
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
 
    
    
    ; Hier wird der Ritter1 bewegt
    
    
   
    If SpritePixelCollision(19, ritterx+wx, wy+40, 13, wx+710, wy-15)
      
      back = 1
      
    EndIf 
    
    If SpritePixelCollision(20, ritterx+wx, wy+40, 13, wx-12, wy-15)
      
      back = 0
      
    EndIf 
    
    
    If back = 1
      
      ritterx-1
      
      DisplayTransparentSprite(19, ritterx+wx, wy+40)
      
    EndIf 
    
    If back = 0
      
      ritterx+1
      
      DisplayTransparentSprite(20, ritterx+wx, wy+40)
      
    EndIf 
  
    
    
    
    
    
    
    
    
      
    
    
      
    
    
  
    
    
    
    ; Hier ein Cheat das das Sichtfenster weggeht!!! :D
    
    
    
    
    If KeyboardPushed(#PB_Key_P) 
      
      cheat = 1
      
    EndIf 
    
    If KeyboardPushed(#PB_Key_O)
      
      cheat = 0
      
    EndIf 
    
    
    
    If cheat = 0
      
      DisplayTransparentSprite(10, 0, 0) ; Damit man nich die gesammte Insel im Blick hat! :D Wird vorerst noch weggelassenDisplayTransparentSprite(5, 0, 0) ; Damit man nich die gesammte Insel im Blick hat! :D Wird vorerst noch weggelassen
      
    EndIf
    
    
    
    ; Die abfrage ins nächste Level
    
    
    If KeyboardPushed(#PB_Key_E) And SpritePixelCollision(9, x, y, 17, wx+710, wy+270) 
      
      
      
  ; Hier kommt rein was passieren soll wenn man vor dem Burgtor in das rote feld reinläuft
      
      
    
  EndIf 
    
    
    
Until KeyboardPushed(#PB_Key_Escape)


  
  
  
EndIf
  
   
    
  
      
      
  
  ; Dieses End if gilt dem "play" nach dem Hauptmenü
  
EndIf 




    
    
pg
Beiträge: 18
Registriert: 03.10.2004 22:35

Beitrag von pg »

Warum geht das nicht?

In deinem Code ist alles zusammen und nicht aufgeteilt in
einzelne Teile.

Ich seh nur die Repeat/Until's...
Robin
Beiträge: 26
Registriert: 29.09.2004 13:40
Wohnort: Neuravensburg (Am Bodensee)
Kontaktdaten:

Beitrag von Robin »

Ich weis nicht, ich hab es so gemacht wie du es beschrieben hast.
mit z.B. Gosub Hauptmenü.

Also:

Hauptmenu:

Repeat ;Hauptmenü

...

Until


Repeat ; Spiel

Until hauptmenu = 1

Gosub Hauptmenu

Irgentwie geht das nicht. Weis ich auch nicht, ich schreibs am besten in meinen Code hinein damit du dir das besser vorstellen kannst.

Code: Alles auswählen


; Hier werden die folgenden sachen getestet 



If InitSprite() = 0 Or InitKeyboard() = 0 Or InitSound() = 0 Or InitMouse() = 0 
  
  End 
  
EndIf 

;Hier werden die einzelnen sachen wie Sound Decoder usw. geladen 

UseOGGSoundDecoder() 



; Hier wird das Scren für das ganze spiel gestartet 

If OpenScreen(800, 600, 32, "noname") 
  
  
  ;--------------------------------------------------------------------------- 
  
  ;                                              --------HAUPTMENÜ---------- 
  
  ;--------------------------------------------------------------------------- 
  
  

  
  Hauptmenu:   ; Die SPRUNGMARKE    ----------------------------------------
  
  
; HIER ERDEN DIE DATEIEN FÜR DAS HAUPTMENÜ GELADEN 
  
  LoadSprite(0, "Gfx\mainback.bmp", 0) 
  LoadSprite(1, "Gfx\play.bmp", 0) 
  LoadSprite(4, "Gfx\exit.bmp", 0) 
  
  LoadSprite(5, "Gfx\pointer.bmp", 0) 
  
  
  
  
  
  
  
  
  
  ; Hier wird der Hintergrund sound des Hauptmenüs geladen 
  
  LoadSound(0, "Sfx\background.ogg") 
  SoundVolume(0, 50) 
  PlaySound(0, 1) 
  
  
  Delay(2000) 
  
  ; Hier fängt das Hauptmenü an 
  

  
  Repeat 
    
    ExamineKeyboard() 
    ExamineMouse() 
    
    
    FlipBuffers() 
    ClearScreen(0, 0, 0) 
    
    DisplaySprite(0, 0, 0) 
    
    
    
    
    
    
    DisplayTransparentSprite(1, 550, 150) 
    DisplayTransparentSprite(4, 550, 250) 
    
    ; der Mauszeider wird eingeblendet 
    
    mx = MouseX() 
    my = MouseY() 
    
    DisplayTransparentSprite(5, mx, my) 
    
    
    If MouseButton(1) And SpritePixelCollision(5, mx, my, 1, 550, 150) 
      
      play = 1 
      
    EndIf 
    
    
    
    If MouseButton(1) And SpritePixelCollision(5, mx, my, 4, 550, 250) 
      
      exit = 1 
      
    EndIf 
    
    
    
  Until exit = 1 Or play = 1 
  

  
  If exit = 1 
    
    End 
    
  EndIf  
  
  
  If play = 1 
    
    
    
    ;^^ Das EndIF für das Play ist ganz unten im Programm beschrieben 
  
  
   ;---------------------------------------------------------- 
  
  ; Kapitel 1  Die Freilassung aus dem Kerker 
    
    ;----------------------------------------------------------- 
    
    
    FreeSprite(0) 
    FreeSprite(4) 
    FreeSprite(5) 
    
    FreeSound(0) 
    
    
    
  
  
    LoadSprite(0, "Gfx\schlossboden.bmp", 0) 
    LoadSprite(1, "Gfx\schlossmauerquer1.bmp", 0) 
    LoadSprite(2, "Gfx\schlossmauerlang1.bmp", 0) 
    LoadSprite(3, "Gfx\schlossmauerquer2.bmp", 0) 
    LoadSprite(4, "Gfx\schlossmauerlang2.bmp", 0) 
    
    LoadSprite(5, "Gfx\up.bmp", 0) 
    LoadSprite(6, "Gfx\down.bmp", 0) 
    LoadSprite(7, "Gfx\left.bmp", 0) 
    LoadSprite(8, "Gfx\right.bmp", 0) 
    
    LoadSprite(9, "Gfx\stand.bmp", 0) 
    
    LoadSprite(10, "Gfx\sichtfenster.bmp", 0) 
    
    LoadSprite(11, "Gfx\stopquer.bmp", 0) 
    LoadSprite(12, "Gfx\stoplang.bmp", 0) 
    
    LoadSprite(13, "Gfx\turm.bmp", 0) 
    
    LoadSprite(14, "Gfx\burgtor.bmp", 0) 
    
    LoadSprite(15, "Gfx\brunnen.bmp", 0) 
    
    LoadSprite(16, "Gfx\stopkleinlang.bmp", 0) 
    
    LoadSprite(17, "Gfx\stepin.bmp", 0) 
    
    LoadSprite(18, "Gfx\incomplete.bmp", 0) 
    
    
    ; Der Ritter 1 
    
    LoadSprite(19, "Gfx\ritter2left.bmp", 0)   ; Der Ritter kann nur nach rechts oder links laufen 
    LoadSprite(20, "Gfx\ritter2right.bmp", 0) 
    
    
    
    
    
    
    
    LoadSound(0, "Sfx\leute.wav") 
    SoundVolume(0, 50) 
    PlaySound(0, 1) 
    
    
    
    
  
  
    
    x = 372 
    y = 272 
  
    direction = up 
  
    
    
    
  ;Das erste Trainingslevel 
  
    ritter2x = 500 
    ritterx = 200 
    
  
  
  Repeat 
    
    
    ExamineKeyboard() 
    
    FlipBuffers() 
    
    ClearScreen(0, 0, 0) 
    
    
    
    DisplaySprite(0, wx, wy) ;Den Booden darstellen 
    
    
  
    
    
  
    
    
    
    
    
    
    ; Die Burgmauern anzeigen 
    
      
    ;Oben 
    
    
    
    For m1=0 To 720 Step 80 
      
      DisplaySprite(1, wx+m1, wy) 
      
    Next 
    
    
    DisplaySprite(11, wx, wy+80) 
    
    
    
    
    
    
    
    ; Unten 
    
    For m2=0 To 720 Step 80 
      
      DisplaySprite(3, wx+m2, wy+520) 
      
    Next 
    
    
    DisplaySprite(11, wx, wy+520) 
    
    
    
    
    
    ; Links 
    
    
    For m3=0 To 520 Step 80 
      
      DisplaySprite(2, wx, wy+m3) 
      
    Next 
    
    DisplaySprite(12, wx+80, wy) 
    
    
    
    
    
    
    ;Rechts wirn Manuell gemacht 
    
    
    
    
    
    
    
    
    
    
    ; Die zwei Mauern über- und unterhalb vom tor manuel anzeigen 
    
    ;oben 
    DisplaySprite(4, wx+720, wy+80) 
    
    ;unten 
    DisplaySprite(4, wx+720, wy+440) 
    
    ; Die Kollisionen 
    
    DisplaySprite(16, wx+720, wy+80) 
    DisplaySprite(16, wx+720, wy+440) 
    
    
    
      
      
    ; HIER WERDEN GEBÄUDE WIE EIN TURM ANGEZEIGT 
    
    ; Die vier Wachtürme 
    
    DisplayTransparentSprite(13, wx-12, wy-15) 
    
    DisplayTransparentSprite(13, wx-10, wy+510) 
    
    DisplayTransparentSprite(13, wx+710, wy-15) 
    
    DisplayTransparentSprite(13, wx+710, wy+510) 
    
    ; Das Burgtor 
    
    DisplayTransparentSprite(14, wx+735, wy+160) 
    
    ; Der Brunnen 
    
    DisplayTransparentSprite(15, wx+400, wy+256) 
    
    ;Hier noch die Stepp inns 
    
    DisplaySprite(17, wx+710, wy+270) 
    
    
    
    
    
    
    
    
    
    
    
    
      
      
    
    If KeyboardPushed(#PB_Key_Up) = 0 And KeyboardPushed(#PB_Key_Down) = 0 And KeyboardPushed(#PB_Key_Left) = 0 And KeyboardPushed(#PB_Key_Right) = 0 
      
      DisplayTransparentSprite(9, x, y) 
      
    EndIf 
    
    
    
    
    ; DIE TASTEN ZUR BEWEGUNG 
      

      
    
      
      
    If KeyboardPushed(#PB_Key_W) 
      
      If SpritePixelCollision(5, x, y, 11, wx, wy+80) Or SpriteCollision(5, x, y, 16, wx+720, wy+80) Or SpriteCollision(5, x, y, 16, wx+720, wy+440) Or SpriteCollision(5, x, y, 14, wx+725, wy+160) Or SpriteCollision(5, x, y, 15, wx+400, wy+256) 
        
        wy-4 
        
      EndIf 
      
      
        
      
    
        wy+2 
        
      
        
        
      DisplayTransparentSprite(5, x, y) 
      
      
    EndIf 
    
    
    
    
  
    
    If KeyboardPushed(#PB_Key_S) 
    
      If SpritePixelCollision(6, x, y, 11, wx, wy+520) Or SpriteCollision(6, x, y, 16, wx+720, wy+80) Or SpriteCollision(6, x, y, 16, wx+720, wy+440) Or SpriteCollision(6, x, y, 14, wx+725, wy+160) Or SpriteCollision(6, x, y, 15, wx+400, wy+256) 
        
        wy+4 
        
      EndIf 
      
      
        
        wy-2 
          
      DisplayTransparentSprite(6, x, y) 
      
      
      
    EndIf 
    
    
    
    
    
  
    
    If KeyboardPushed(#PB_Key_A) 
    
      If SpritePixelCollision(7, x, y, 12, wx+80, wy) Or SpriteCollision(7, x, y, 16, wx+720, wy+80) Or SpriteCollision(7, x, y, 16, wx+720, wy+440) Or SpriteCollision(7, x, y, 14, wx+725, wy+160) Or SpriteCollision(7, x, y, 15, wx+400, wy+256) 
      
      
        wx-4 
        
      EndIf 
        
        
        wx+2 
        
      
        
        
      DisplayTransparentSprite(7, x, y) 
      
      
      
    EndIf 
    
  
    
    
    
    
    
  
    
    If KeyboardPushed(#PB_Key_D) 
      
      
      
      If SpriteCollision(8, x, y, 16, wx+720, wy+80) Or SpriteCollision(8, x, y, 16, wx+720, wy+440) Or SpriteCollision(8, x, y, 14, wx+725, wy+160) Or SpriteCollision(8, x, y, 15, wx+400, wy+256) 
        
        wx+4 
        
      EndIf 
        
        
      
        
        
      wx-2 
        
      
      DisplayTransparentSprite(8, x, y) 
    
      
      
    EndIf 
    
    
    
    
    
    If KeyboardPushed(#PB_Key_E) And SpritePixelCollision(9, x, y, 17, wx+710, wy+270) And done = 3 
      
      nextlevel = 1 
      
    Else 
      
      DisplaySprite(18, 0, 0) 
      
    EndIf 
      
      
      
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
  
    
    
    ; Hier wird der Ritter1 bewegt 
    
    
    
    If SpritePixelCollision(19, ritterx+wx, wy+40, 13, wx+710, wy-15) 
      
      back = 1 
      
    EndIf 
    
    If SpritePixelCollision(20, ritterx+wx, wy+40, 13, wx-12, wy-15) 
      
      back = 0 
      
    EndIf 
    
    
    If back = 1 
      
      ritterx-1 
      
      DisplayTransparentSprite(19, ritterx+wx, wy+40) 
      
    EndIf 
    
    If back = 0 
      
      ritterx+1 
      
      DisplayTransparentSprite(20, ritterx+wx, wy+40) 
      
    EndIf 
  
    
    
    
    
    
    
    
    
      
    
    
      
    
    
  
    
    
    
    ; Hier ein Cheat das das Sichtfenster weggeht!!! :D 
    
    
    
    
    If KeyboardPushed(#PB_Key_P) 
      
      cheat = 1 
      
    EndIf 
    
    If KeyboardPushed(#PB_Key_O) 
      
      cheat = 0 
      
    EndIf 
    
    
    
    If cheat = 0 
      
      DisplayTransparentSprite(10, 0, 0) ; Damit man nich die gesammte Insel im Blick hat! :D Wird vorerst noch weggelassenDisplayTransparentSprite(5, 0, 0) ; Damit man nich die gesammte Insel im Blick hat! :D Wird vorerst noch weggelassen 
      
    EndIf 
    
    
    
    ; Die abfrage ins nächste Level 
    
    
    If KeyboardPushed(#PB_Key_E) And SpritePixelCollision(9, x, y, 17, wx+710, wy+270) 
      
      
      



  ; Hier kommt rein was passieren soll wenn man vor dem Burgtor in das rote feld reinläuft 
      
      
    
  EndIf 
    
    
    
Until KeyboardPushed(#PB_Key_Escape) 

Gosub Hauptmenu ; Hier sollte das Programm zur Sprungm. ganz oben im Code gelangen!!


  
  
  
EndIf 
  
    
    
  
      
      
  
  ; Dieses End if gilt dem "play" nach dem Hauptmenü 
  
EndIf 




    
    
Benutzeravatar
KeyKon
Beiträge: 1412
Registriert: 10.09.2004 20:51
Computerausstattung: Laptop: i5 2,8 Ghz, 16GB DDR3 RAM, GeForce 555GT 2GB VRAM
PC: i7 4,3 Ghz, 32GB DDR3 RAM, GeForce 680 GTX 4GB VRAM
Win10 x64 Home/Prof
PB 5.30 (64bit)
Wohnort: Ansbach
Kontaktdaten:

Beitrag von KeyKon »

Warum eigentlich Gosub willst du etwa wieder zurrück? nimm doch Goto.

KeyKon
pg
Beiträge: 18
Registriert: 03.10.2004 22:35

Beitrag von pg »

Du hast es ganz anders gemacht! Ich will sagen, dass du die einzelnen
Programmteile in Subroutinen zusammenfasst:

mit Name der Routine und einem Return! Sonst gehts nicht.
Nur der Aufruf erfolgt mit Gosub. (goto würde ich nicht verwenden)
In der PB Hilfe kannst du auch nachsehen wie man Gosub verwendet.

In deinem Programm hast du gar keine Return verwendet.

Code: Alles auswählen

Level1:
 Repeat 
  ;dein code 
 Until Level1Ende=1 
Return
Benutzeravatar
Ynnus
Beiträge: 855
Registriert: 29.08.2004 01:37
Kontaktdaten:

Beitrag von Ynnus »

Wieso machst du überhaupt verschiedene Schleifen für die Level? Mach doch einfach eine Schleife und beim Verlassen und Betreten der Level wird einfach eine neue Grafik eingeladen und das nächste level angezeigt. Dabei braucht man doch keine neue Schleife.

Pseudocode:

Code: Alles auswählen

if level = 1
  displaysprite(level1, 0, 0)
elseif level = 2
  displaysprite(level2, 0, 0)
endif
Ich weiß zwar nun nicht genau wie du die Level darstellst, aber wenn es dir so wie oben beschrieben zu viel Code in der Hauptschleife wäre, und dadurch zu unübersichtlich, lagere doch einfach die Grafiken in Prozeduren aus (Ist viel besser als Gosub und so ein Zeug). Dann sieht es etwa so aus:

Pseudocode:

Code: Alles auswählen

if level = 1
  displaylevel_1()
elseif level = 2
  displaylevel_2()
endif

procedure displaylevel_1()
  displaysprite(level1, 0, 0)
  ...
  ...
endprocedure

procedure displaylevel_2()
  displaysprite(level2, 0, 0)
  ...
  ...
endprocedure
Dabei könnten die Prozeduren dann in anderen Dateien ausgelagert werden und würden nicht in der Hauptschleife für zu viele Zeilen sorgen. ;)

Aber von Gosub und Goto würd ich die Finger lassen, dass ist imo keine gute Lösung. Da springt man zu sehr hin und her, da sind Prozeduren die ideale Möglichkeit etwas auszulagern.
Wolf Benrath
Beiträge: 57
Registriert: 04.10.2004 10:20

Beitrag von Wolf Benrath »

Hallo !

Benutze einfach eine weiter Variable !

altlevel=level

Oder wenn deer Source von Sunny funktionier...

; Bei mir haut : "elseif" nicht hin !

MfG
Wolf Benrath
Bild
Robin
Beiträge: 26
Registriert: 29.09.2004 13:40
Wohnort: Neuravensburg (Am Bodensee)
Kontaktdaten:

Beitrag von Robin »

Ich komm in meinem Code ganz durcheinander wenn ich das mit Proceduren usw mache.

Ich weis ich mach das alles sehr umständlich, aber ich komm zurecht.

Ich hab da eine neue Idee:


Repeat


Repeat ;Level 1



Until level2 = 1 or backtolevel1 = 1

If backtolevel1 = 1

Gosub ; (oder Goto) Level1! Das müsste doch eigentlich funktionieren. weil das ganze Programm in einer Hauptschleife läuft!



Repeat ;Level 2

Until level3 = 1

...







Until completeexit = 1

End



Ich versuchs gleich mal...
Antworten