In a german forum for BMax someone posted
a gamemanager module.
The comments will not help you, but perhaps
the structure is interesting for your.
The mod is using gamestates which can be started, terminated,
paused etc while activating other.
The gamestates are passed as objects to the gamemanager.
'Strict
Rem
Module pub.GameManager
ModuleInfo "Name:"
ModuleInfo "Version:"
ModuleInfo "Author:"
Import brl.system
Import brl.glmax2d
End Rem
'Basisklasse f�r Gamestates
Type TGameState Abstract
'Starten des Gamestates (daten laden etc.)
Method Start()
End Method
'Gamestate (wieder)aufrufen
Method Enter()
End Method
'Hauptschleife des Gamestates
Method Process()
End Method
'Beenden des Gamestates (resourcen freigeben etc.)
Method Leave()
End Method
'Zeichnen des Gamestates (kann in Process() aufgerufen werden)
Method Draw()
End Method
End Type
'FPS Manager - f�r frameunabh�ngiges Programmieren
Type TFPSManager
Field _fps
Field _fps_counter
Field _fps_timer
Field _fps_value:Float
Field _fps_begin
Method New()
_fps_begin = MilliSecs()
End Method
'Aktualisiert die FPS Daten
Method Update()
Local ms = MilliSecs()
_fps_value = (ms - _fps_begin) / 1000.0
_fps_begin = ms
If ms >= _fps_timer
_fps = _fps_counter * 5
_fps_counter = 0
_fps_timer = ms + 200 '1/5 einer Sekunde
Else
_fps_counter :+ 1
EndIf
End Method
'Gibt die aktuellen FPS zur�ck
Method FPS()
Return _fps
End Method
'Multipliziert den FPS Faktor mit einer Geschwindigkeit in pixel/sek. und gibt das Ergebnis zur�ck.
Method FPS_Val:Float(value:Float)
Return _fps_value * value
End Method
End Type
'Gamemanager
Type TGameManager
Field _state:TGameState 'aktueller Gamestate der ausgef�hrt wird.
Field _quit:Byte 'gibt an ob das Spiel beendet ist.
Field _fps:TFPSManager 'frameunabh�ngiges Programmieren und FPS
Field pauseState:TGameState
'Start des Spiels mit �bergabe einer GameState Instanz
Method InitGameManager(State:TGameState = Null)
If State = Null
' _state = New TMainGameState
Else
_state = State
EndIf
_state.Start()
_state.Enter()
_quit = False
_fps = New TFPSManager
Run()
End Method
Method Run()
'Hauptschleife des Spiels
While Not _quit
_fps.Update() Update()
Wend
Terminate()
End Method
'F�hrt den aktuellen GameState aus, wenn keiner vorhanden wird _quit auf True gesetzt.
Method Update()
If _state
_state.Process()
Else
_quit = True
EndIf
End Method
'Gibt vom aktuellen Gamestate verwendete Resourcen frei und setzt den Gamestate auf Null.
Method Terminate()
If _state
_state.Leave()
_state = Null
EndIf
End Method
'�ndert den Gamestate. Auch Null m�glich (wodurch das Spiel beendet wird).
'Aktueller Gamestate geht verloren, Pausierter bleibt erhalten
Method NewGameState(NewState:TGameState)
If _state
_state.Leave()
EndIf
_state = NewState
If _state Then
_state.start()
_state.Enter()
End If
End Method
'Aktuellen Gamestate pausieren und neuen starten
Method PauseAndNew(NewState:TGameState)
pauseState = _state
_state = NewState
If _state
_state.start()
_state.Enter()
EndIf
End Method
'setzt aktuellen Gamestate in den Pausemodus und f�hrt den State in der Pause aus
Method GoToPausedAndSave()
Local tempstate:TGamestate = _state
_state = pausestate
pausestate = tempstate
tempstate = Null
pausestate.Enter()
End Method
'Wechselt zum pausierten Gamestate und l�sst den aktuellen verschwinden
Method GoToPausedAndKill()
_state.Leave()
_state = pauseState
_state.Enter()
End Method
'Gibt die aktuellen FPS zur�ck
Method FPS()
Return _fps.FPS()
End Method
'Multipliziert den FPS Faktor mit einem Wert, wird f�r die frameunabh�ngige Programmierung ben�tigt.
Method FPS_Val:Float(value:Float)
Return _fps.FPS_Val(value)
End Method
End Type
'Globale Instanz vom GameManager
Global GameManager:TGameManager = New TGameManager