here's an example of the way i structure this sort of thing - might be useful for you :) (runs standalone)
;===================================================================================================== Const TITLE_EXPIRED = 0 ; User did not press start in time, go back to splash screen. Const END_SESSION% = 1 ; The user has opted to quit the application. Const DISPLAY_CREDITS% = 2 ; User chose to view the credits screen. Const DISPLAY_OPTIONS% = 3 ; User chose to view the options screen. Const LOAD_GAME% = 4 ; User chose to load a saved game. Const START_GAME% = 5 ; User chose to begin a new game. Const CONCLUSION_SUCCESS = 0 ; User successfully completed the level. Const CONCLUSION_FAIL_RETRY = 1 ; User failed the level, but wants to retry. Const CONCLUSION_FAIL_EXIT = 2 ; User failed the level, and wants to quit. Const USER_QUIT = 3 ; User manually quit the level before conclusion. ;===================================================================================================== Graphics 640,480 SetBuffer( FrontBuffer() ) RunMenuSystem() ;===================================================================================================== Function RunMenuSystem() Repeat DisplaySplashScreen() DisplayTitleScreen() Repeat Select DisplayMainMenu() Case TITLE_EXPIRED : Exit Case END_SESSION : Return END_SESSION Case DISPLAY_CREDITS : DisplayCredits() Case DISPLAY_OPTIONS : DisplayOptions() Case LOAD_GAME : RunGameSession( RequestSaveGame() ): Exit Case START_GAME : RunGameSession( 1 ): Exit End Select Forever Forever End Function Function DisplaySplashScreen%() Local SplashTime = Ticker_New( 3000 ) Repeat: Flip: Cls Text( 320, 240, "THIS IS THE SPLASH SCREEN", True, True ) Text( 320, 260, "COMPANY LOGO HERE?", True, True ) Until Ticker_HasTicked( SplashTime ) End Function Function DisplayTitleScreen%() Repeat: Flip: Cls Text( 320, 240, "THIS IS THE MAIN TITLE SCREEN", True, True ) Text( 320, 260, "PRESS ENTER TO BEGIN", True, True ) Until KeyHit( 28 ) End Function Function DisplayMainMenu%() Local ExpireTime = Ticker_New( 30000 ) Repeat: Flip: Cls Text( 320, 200, "THIS IS THE MAIN MENU", True, True ) Text( 320, 220, "1 = EXIT GAME", True, True ) Text( 320, 240, "2 = DISPLAY CREDITS", True, True ) Text( 320, 260, "3 = DISPLAY OPTIONS", True, True ) Text( 320, 280, "4 = LOAD GAME", True, True ) Text( 320, 300, "5 = START GAME", True, True ) If KeyHit( 2 ) Then Return END_SESSION If KeyHit( 3 ) Then Return DISPLAY_CREDITS If KeyHit( 4 ) Then Return DISPLAY_OPTIONS If KeyHit( 5 ) Then Return LOAD_GAME If KeyHit( 6 ) Then Return START_GAME Until Ticker_HasTicked( ExpireTime ) Return TITLE_EXPIRED End Function Function DisplayCredits%() Repeat: Flip: Cls Text( 320, 240, "THIS IS THE CREDITS SCREEN", True, True ) Text( 320, 260, "PRESS ENTER TO EXIT", True, True ) Until KeyHit( 28 ) End Function Function DisplayOptions%() Repeat: Flip: Cls Text( 320, 240, "THIS IS THE OPTIONS SCREEN", True, True ) Text( 320, 260, "PRESS ENTER TO EXIT", True, True ) Until KeyHit( 28 ) End Function Function RequestSaveGame%() Repeat: Flip: Cls Text( 320, 240, "THIS IS THE SAVE GAME LOADER SCREEN", True, True ) Text( 320, 260, "LETS SAY WE HAVE LOADED LEVEL 8 (it could be anything)", True, True ) Text( 320, 280, "PRESS ENTER TO EXIT THIS SCREEN", True, True ) Until KeyHit( 28 ) Return 8 End Function Function RunGameSession( DesiredStage ) Repeat Select PlayLevel( DesiredStage ) Case CONCLUSION_SUCCESS : DesiredStage = DesiredStage + 1 Case CONCLUSION_FAIL_RETRY : ;Don't need to do anything Case CONCLUSION_FAIL_EXIT : Return Case USER_QUIT : Return End Select Forever End Function Function PlayLevel( Level ) LoadLevel( Level ) Repeat: Flip: Cls Text( 320, 220, "THIS IS THE MAIN GAME SCREEN", True, True ) Text( 320, 240, "CURRENT LEVEL IS " + Level, True, True ) Text( 320, 260, "1 = CONCLUSION SUCCESS", True, True ) Text( 320, 280, "2 = CONCLUSION FAILURE RETRY", True, True ) Text( 320, 300, "3 = CONCLUSION FAILURE EXIT", True, True ) Text( 320, 320, "4 = QUIT GAME", True, True ) If KeyHit( 2 ) Then Return CONCLUSION_SUCCESS If KeyHit( 3 ) Then Return CONCLUSION_FAIL_RETRY If KeyHit( 4 ) Then Return CONCLUSION_FAIL_EXIT If KeyHit( 5 ) Then Return USER_QUIT Forever End Function Function LoadLevel%( DesiredLevel% ) Local SplashTime = Ticker_New( 2000 ) Repeat: Flip: Cls Text( 320, 240, "THIS IS THE LOADING SCREEN", True, True ) Text( 320, 260, "NOW LOADING LEVEL " + DesiredLevel, True, True ) Until Ticker_HasTicked( SplashTime ) End Function ;!==================================================================================================== ; Ticker type. ;!==================================================================================================== Type Ticker Field LastTick% Field Frequency% End Type Function Ticker_New%( NewFrequency%=1000 ) Local this.Ticker = New Ticker this\LastTick% = MilliSecs() this\Frequency% = NewFrequency% Return Handle( this ) End Function Function Ticker_Dispose%( HND% ) Local this.Ticker = Object.Ticker( HND% ) Delete this End Function Function Ticker_Frequency%( HND%, NewFrequency%=-1 ) Local this.Ticker = Object.Ticker( HND% ) If ( NewFrequeny% = -1 ) Return this\Frequency% Else If NewFrequency% > 0 this\Frequency% = NewFrequency% EndIf EndIf End Function Function Ticker_HasTicked%( HND% ) Local this.Ticker = Object.Ticker( HND% ) If ( MilliSecs() > ( this\LastTick% +this\Frequency% ) ) this\LastTick% = MilliSecs() Return True EndIf Return False End Function