Seite 1 von 2

Menü

Verfasst: 03.03.2008 21:18
von PureMax
Hey
ich programmier noch nich lange und hab nur die demo version wollte aber ein kleines jump'n'run spiel basteln.
Nun sitz ich am menü und hab ein problem
ich arbeite mit ner menüvorlage und nun wollt ich nen menü unterpunkt in optionen machen aber der lässt sich nicht aufrufen
da kackt das ganze ding dann ab :cry:
kann mir wer helfen?
ich schätze es liegt hier drann

Code: Alles auswählen

Case #mnu_Options
      Select Options()
        Case 0: Menu = #mnu_Main
        Case 1: Menu = #mnu_steuerung
     


hier trotzdem ma die procedures

Code: Alles auswählen

Procedure.l Options()
  Protected Selected = -1

  Repeat
    ExamineKeyboard(): ExamineMouse(): MB_Left()
    If KeyboardReleased(#PB_Key_Escape)
      Selected = 0
    ElseIf KeyboardReleased(#PB_Key_F12)
      SaveScreen()
    EndIf

    Delay(2): FlipBuffers(): ClearScreen(0)

    StartDrawing(ScreenOutput())
    DrawingMode(#PB_2DDrawing_Transparent)

    FrontColor(RGB(0,0,198))
    DrawingFont(FontID(#fnt_Impact_120))
    DrawTextXCentered(#ScreenWidth/2,68,"Options")

    FrontColor(RGB(198,0,0))
    DrawingFont(FontID(#fnt_Impact_24))
    DrawTextXCentered(#ScreenWidth/2,240,"Game options")
    If DrawMenuButton(#ScreenWidth/2,400,"Steuerung")
      Steuerung()
    EndIf
    If DrawMenuButton(#ScreenWidth/2,548,"Back")
      Selected = 0
    EndIf
    StopDrawing()

    DisplayTransparentSprite(#spr_Cursor,MouseX()-16,MouseY()-16)
  Until Selected > -1

  ProcedureReturn Selected
EndProcedure
Procedure Steuerung()
  Delay(2): FlipBuffers(): ClearScreen(0)

  StartDrawing(ScreenOutput())
    DrawingMode(#PB_2DDrawing_Transparent)
    FrontColor(RGB(0,0,198))
    DrawingFont(FontID(#fnt_Impact_18))
    DrawTextXCentered(#ScreenWidth/2,100,"Steuerung")
  StopDrawing()
 
 

 
  ExamineKeyboard()
  If KeyboardReleased(#PB_Key_Escape)
    Menu = #mnu_Options
  EndIf
 

 
EndProcedure

sons noch was?!
wer echt nett wenn mir wer helfen könnte
mfg Max

Verfasst: 03.03.2008 21:30
von Kaeru Gaman
du hast in deiner "options" procedure ne eigene schleife drin...
beißt sich das nicht mit deinen anderen abläufen?

sorry, aber anhand von zwei procs kann man doch nix erkennen...

poste oder verlinke doch mal den ganzen code, dann kann man vielleicht was finden....

Verfasst: 03.03.2008 21:33
von PureMax
ok wie du willst hier is alles
und das mit der schleife bin cih zu dumm zum checken :D
erklärs ma für nen newb

Code: Alles auswählen

; 
; Author: Maximilian Stilke
; Date: 3.3.08
; OS: Windows
; Demo: Yes

;Game menu by Max
;v1.0 - Alpha 1
;Have fun ;)

;-Constants
#Name      = "The Game"
#Version   = "v1.0 Alpha 1"
#Copyright = "Copyright © 2008 QuackFack."
#ScreenWidth  = 1024
#ScreenHeight = 768
#ScreenDepth  = 32

;-Enumeration
Enumeration ;Menues
  #mnu_None
  #mnu_Main
  #mnu_SinglePlayer
  #mnu_Extras
  #mnu_Credits
  #mnu_Options
  #mnu_Steuerung
EndEnumeration
Enumeration ;Fonts
  #fnt_Impact_18
  #fnt_Impact_24
  #fnt_Impact_120
EndEnumeration
Enumeration ;Sprites
  #spr_Cursor
  #spr_ScreenShot
EndEnumeration

;-Variables
Global MB_Left, Menu = #mnu_Main 

;-Procedures
Procedure DrawTextCentered(X,Y,String$)
  DrawText(X-TextWidth(String$)/2,Y-TextHeight(String$)/2,String$)
EndProcedure

Procedure DrawTextXCentered(X,Y,String$)
  DrawText(X-TextWidth(String$)/2,Y,String$)
EndProcedure

Procedure MB_Left() ;0 = False, 1 = Pressed, 2 = Down, 3 = Released
  If MouseButton(1)
    If MB_Left = 0
      MB_Left = 1
    Else
      MB_Left = 2
    EndIf
  Else
    If MB_Left = 3
      MB_Left = 0
    ElseIf MB_Left = 2
      MB_Left = 3
    EndIf
  EndIf
EndProcedure

Procedure SaveScreen()
  Static Number
  Number + 1
  GrabSprite(#spr_ScreenShot,0,0,#ScreenWidth,#ScreenHeight)
  SaveSprite(#spr_ScreenShot,"screenshot"+Str(Number)+".bmp")
  FreeSprite(#spr_ScreenShot)
EndProcedure

Procedure.l DrawMenuButton(X,Y,Text$)
  Protected Pressed, Width = 300, Height = 48
  X - Width/2

  Box(X,Y,Width,Height,RGB(0,96,64))
  If MouseX() > X And MouseX() < X+Width And MouseY() > Y And MouseY() < Y+Height
    If MB_Left = 3
      Pressed = #True
      MB_Left = 0
    EndIf
    Box(X+3,Y+3,Width-6,Height-6,RGB(0,184,64))
    FrontColor(RGB(200,0,0))
  Else
    Box(X+3,Y+3,Width-6,Height-6,RGB(0,128,64))
    FrontColor(RGB(100,0,0))
  EndIf

  DrawingFont(FontID(#fnt_Impact_24))
  DrawTextCentered(X+Width/2,Y+Height/2,Text$)

  ProcedureReturn Pressed
EndProcedure

Procedure.l MainMenu()
  Protected Selected = -1

  Repeat
    ExamineKeyboard(): ExamineMouse(): MB_Left()
    If KeyboardReleased(#PB_Key_Escape)
      Selected = 4
    ElseIf KeyboardReleased(#PB_Key_F12)
      SaveScreen()
    EndIf

    Delay(2): FlipBuffers(): ClearScreen(0)

    StartDrawing(ScreenOutput())
    DrawingMode(#PB_2DDrawing_Transparent)

    FrontColor(RGB(0,0,198))
    DrawingFont(FontID(#fnt_Impact_120))
    DrawTextXCentered(#ScreenWidth/2,68,#Name)

    FrontColor(RGB(198,0,0))
    DrawingFont(FontID(#fnt_Impact_24))
    DrawTextXCentered(#ScreenWidth/2,240,#Version)

    DrawingFont(FontID(#fnt_Impact_18))
    DrawTextXCentered(#ScreenWidth/2,620,#Copyright)
    DrawTextXCentered(#ScreenWidth/2,645,"All rights reserved.")

    If DrawMenuButton(#ScreenWidth/2,300,"Single player")
      Selected = 0
    ElseIf DrawMenuButton(#ScreenWidth/2,362,"Extras")
      Selected = 1
    ElseIf DrawMenuButton(#ScreenWidth/2,486,"Credits")
      Selected = 2
    ElseIf DrawMenuButton(#ScreenWidth/2,424,"Options")
      Selected = 3
    ElseIf DrawMenuButton(#ScreenWidth/2,548,"Exit")
      Selected = 4
    EndIf
    StopDrawing()

    DisplayTransparentSprite(#spr_Cursor,MouseX()-16,MouseY()-16)
  Until Selected > -1

  ProcedureReturn Selected
EndProcedure

Procedure.l Options()
  Protected Selected = -1

  Repeat
    ExamineKeyboard(): ExamineMouse(): MB_Left()
    If KeyboardReleased(#PB_Key_Escape)
      Selected = 0
    ElseIf KeyboardReleased(#PB_Key_F12)
      SaveScreen()
    EndIf

    Delay(2): FlipBuffers(): ClearScreen(0)

    StartDrawing(ScreenOutput())
    DrawingMode(#PB_2DDrawing_Transparent)

    FrontColor(RGB(0,0,198))
    DrawingFont(FontID(#fnt_Impact_120))
    DrawTextXCentered(#ScreenWidth/2,68,"Options")

    FrontColor(RGB(198,0,0))
    DrawingFont(FontID(#fnt_Impact_24))
    DrawTextXCentered(#ScreenWidth/2,240,"Game options")
    If DrawMenuButton(#ScreenWidth/2,400,"Steuerung")
      Steuerung()
    EndIf
    If DrawMenuButton(#ScreenWidth/2,548,"Back")
      Selected = 0
    EndIf
    StopDrawing()

    DisplayTransparentSprite(#spr_Cursor,MouseX()-16,MouseY()-16)
  Until Selected > -1

  ProcedureReturn Selected
EndProcedure
Procedure Steuerung()
  Delay(2): FlipBuffers(): ClearScreen(0)

  StartDrawing(ScreenOutput())
    DrawingMode(#PB_2DDrawing_Transparent)
    FrontColor(RGB(0,0,198))
    DrawingFont(FontID(#fnt_Impact_18))
    DrawTextXCentered(#ScreenWidth/2,100,"Steuerung")
  StopDrawing()
 
  

  
  ExamineKeyboard()
  If KeyboardReleased(#PB_Key_Escape)
    Menu = #mnu_Options
  EndIf
  

  
EndProcedure
Procedure.l Extras()
  Protected Selected = -1

  Repeat
    ExamineKeyboard(): ExamineMouse(): MB_Left()
    If KeyboardReleased(#PB_Key_Escape)
      Selected = 0
    ElseIf KeyboardReleased(#PB_Key_F12)
      SaveScreen()
    EndIf

    Delay(2): FlipBuffers(): ClearScreen(0)

    StartDrawing(ScreenOutput())
    DrawingMode(#PB_2DDrawing_Transparent)

    FrontColor(RGB(0,0,198))
    DrawingFont(FontID(#fnt_Impact_120))
    DrawTextXCentered(#ScreenWidth/2,68,"Extras")

    If DrawMenuButton(#ScreenWidth/2,480,"Musik")
      Selected = 5
    EndIf

   
    If DrawMenuButton(#ScreenWidth/2,548,"Back")
      Selected = 0
    EndIf
    StopDrawing()

    DisplayTransparentSprite(#spr_Cursor,MouseX()-16,MouseY()-16)
  Until Selected > -1

  ProcedureReturn Selected
EndProcedure
Procedure.l Credits()
  Delay(2): FlipBuffers(): ClearScreen(0)

  StartDrawing(ScreenOutput())
    DrawingMode(#PB_2DDrawing_Transparent)
    FrontColor(RGB(0,0,198))
    DrawingFont(FontID(#fnt_Impact_18))
    DrawTextXCentered(#ScreenWidth/2,100,"Credits")

  FrontColor(RGB(0,0,198))
    DrawingFont(FontID(#fnt_Impact_18))
    DrawTextXCentered(#ScreenWidth/2,200,"Lead Designer")
  DrawingFont(FontID(#fnt_Impact_18))
    DrawTextXCentered(#ScreenWidth/2,223,"M a x i m i l i a n  S t i l k e")
    DrawingFont(FontID(#fnt_Impact_18))
    DrawTextXCentered(#ScreenWidth/2,260,"Main Idea")
  DrawingFont(FontID(#fnt_Impact_18))
    DrawTextXCentered(#ScreenWidth/2,283,"M a x i m i l i a n  S t i l k e")
DrawingFont(FontID(#fnt_Impact_18))
    DrawTextXCentered(#ScreenWidth/2,306,"F a b i a n  S c h r u m")
    DrawingFont(FontID(#fnt_Impact_18))
    DrawTextXCentered(#ScreenWidth/2,329,"B e n e d i k t  V e t t e l s c h o ß")
      DrawingFont(FontID(#fnt_Impact_24))
    DrawTextXCentered(#ScreenWidth/2,360,"MSSoft©")
   StopDrawing()
  ExamineKeyboard()
  If KeyboardReleased(#PB_Key_Escape)
    Menu = #mnu_Main
  EndIf
EndProcedure
  ;-Initialize and open screen
If Not (InitKeyboard() And InitMouse() And InitSprite())
  MessageRequester("Warning!","DirectX 7 or later not found!",#PB_MessageRequester_Ok)
  End
EndIf
If Not OpenScreen(#ScreenWidth,#ScreenHeight,#ScreenDepth,#Name)
  MessageRequester("Warning!","Can't open a "+Str(#ScreenWidth)+"x"+Str(#ScreenHeight)+" "+Str(#ScreenDepth)+"bit screen!",#PB_MessageRequester_Ok)
  End
EndIf

;-Load resources
;LoadFont(#fnt_Arial_08_Bold,"Arial",8,#PB_Font_Bold)
LoadFont(#fnt_Impact_18,"Impact",18)
LoadFont(#fnt_Impact_24,"Impact",24)
LoadFont(#fnt_Impact_120,"Impact",120)
;Create a crappy mouse cursor
CreateSprite(#spr_Cursor,32,32)
StartDrawing(SpriteOutput(#spr_Cursor))
  DrawingMode(#PB_2DDrawing_Outlined)
  Circle(16,16,16,255+256*255+256*256*255)
  Circle(16,16,1,255+256*255+256*256*255)
StopDrawing()

MouseLocate(#ScreenWidth/2,415)

;-Main loop start
Repeat
  ;-Menu handling
  Select Menu
    Case #mnu_Main
      Select MainMenu()
        Case 0: Menu = #mnu_None ;Single player
        Case 1: Menu = #mnu_Extras ;Extras
        Case 2: Menu = #mnu_Credits ;Credits
        Case 3: Menu = #mnu_Options
        Case 4: Break
      EndSelect
    Case #mnu_Options
      Select Options()
        Case 0: Menu = #mnu_Main
        Case 1: Menu = #mnu_steuerung 
     
       
       EndSelect
    Case #mnu_Extras
      Select Extras()  
      Case 0: Menu= #mnu_main
      EndSelect 
    Case #mnu_Credits: 
     Select Credits()
     EndSelect
  EndSelect
  If Menu <> #mnu_None: Continue: EndIf

  ;-The game...
  Delay(2): FlipBuffers(): ClearScreen(0)

  StartDrawing(ScreenOutput())
    DrawingMode(#PB_2DDrawing_Transparent)
    FrontColor(RGB(0,0,198))
    DrawingFont(FontID(#fnt_Impact_18))
    DrawTextXCentered(#ScreenWidth/2,100,"You lose! Press escape to continue! (really fun game)")
  StopDrawing()

  ExamineKeyboard()
  If KeyboardReleased(#PB_Key_Escape)
    Menu = #mnu_Main
  EndIf
ForEver

Verfasst: 03.03.2008 22:57
von AND51
Du musst mal dein ganzes Start/StopDrawing Gewirr entrümpeln. habe die ersten drei Buttons getestet, funzte bei mir soweit fehlerfrei.

Bei Options > Steuerung allerdings kommt das hier:
Debugger Error hat geschrieben:StopDrawing() needs to be called after a StartDrawing() before a FlipBuffer().
Ich denke, das sagt schon alles, oder? Diese Fehlermeldung müsste ferner bei dir auch auftauchen. Nicht böse sein, aber du solltest eigentlich schon in der Lage sein, Fehlermeldungen wie diese vom Debugger zu deuten.
In diesem konkreten Beispiel wird die Prozedur 'Steuerung()' aufgerufen, allerdings führt diese Prozedur sofort ein FlipBuffers() aus; das darfst du innerhalb eines Start/StopDrawing-Blocks aber nicht.

Verfasst: 03.03.2008 23:31
von PureMax
hat er noch nie angezeigt :?
danke :allright:

Verfasst: 03.03.2008 23:38
von PureMax
is doch gar nix Oo
StartDrawing(ScreenOutput())
DrawingMode(#PB_2DDrawing_Transparent)
FrontColor(RGB(0,0,198))
DrawingFont(FontID(#fnt_Impact_18))
DrawTextXCentered(#ScreenWidth/2,100,"Steuerung")
StopDrawing()
jez gehts plötzlich nich mehr wenn cihs anklick apssiert nix :D
man kann das ma pls jmdn fixen?!

mfg Max[/code]

Verfasst: 04.03.2008 00:04
von Kaeru Gaman
langsamer tippen hilft bei der allgemeinen Leserlichkeit....

verbessern musst du deinen code schon selber.
AND hat dir eigentlich einen ganz wichtigen Punkt genannt:
das ganze entwirren, nicht Drawing überall verteilen, usw.

ich würde z.b. keine komplettschleifen innerhalb von unter-procedures verwenden.
nur eine einzige hauptschleife, in der du dann ne fallunterscheidung machen kannst,
welchen vorgang er grad durchführen soll, also, menu oder game oder sonstwas.

und in der Hauptschleife wieder abfrage, rechnung und darstellung strikt trennen.

und btw...
das FlipBuffers ans ende der schleife zu setzen ist logischer, und vermeidet flüchtigkeitsfehler.
ich find's ein Unding, dass Beispiele existieren, wo es am schleifenanfang steht.

PS:
hier mal ein Beispiel, was passieren kann, wenn man die Reihenfolge durcheinanderwirft:
http://www.purebasic.fr/english/viewtop ... 309#235309

Verfasst: 04.03.2008 03:31
von crossroads
Kaeru Gaman hat geschrieben: und btw...
das FlipBuffers ans ende der schleife zu setzen ist logischer, und vermeidet flüchtigkeitsfehler.
ich find's ein Unding, dass Beispiele existieren, wo es am schleifenanfang steht.

PS:
hier mal ein Beispiel, was passieren kann, wenn man die Reihenfolge durcheinanderwirft:
http://www.purebasic.fr/english/viewtop ... 309#235309
Diskussion gab's auch schonmal auf deutsch: => Link

Verfasst: 04.03.2008 03:45
von Kaeru Gaman
is witzig, wie vehement damals einige verteidigt haben, dass es egal sei,
dass es "nur blöde programmierer am ende brauchen"...
Batze hat geschrieben:Außer, dass es manche Programmierer dann nicht verstehen. Von der Funktion her bleibt es (fast) gleich.
das beispiel aus dem englischen forum zeigt sehr gut, wie wichtig die reihenfolge sein kann.
gerade, wenn der gesamtaufbau komplexer wird, können merkwürdige fehler auftauchen,
wenn man einfach "na is doch egal, wann ichs mache, hauptsache es passiert irgendwann"


@Topic
btw, mit austesten ist da nix, bei mir läufts garnicht, er kennt die Proc Steuerung() nicht....

THX

Verfasst: 04.03.2008 08:21
von PureMax
DANKE:allright: dann versuch ich das alles noch ma neu zu strukturieren und dann reicht aber einmal start drawing bzw stop drawing und einmal flip buffers?! :?

und sry wegen dem vetippen :D hab meistens no time ^^ muss jez in die schule -.- mit 14 darf man sowas aber auch :wink:
bis denne
mfg Max