Game structure

BlitzMax Forums/BlitzMax Beginners Area/Game structure

Hi all,

I'm in the middle of writing a little game, and just wanted to ask how people structure thier games?

The way i've done it so far is wrap the major parts in types, so i have a Count down timer type, a game board type, splash screen type, player types etc, which are responsible for loading their own images and data etc, dending on whats passed to them when i create a new instance of that type.

Then the main loop of my code creates an instance of the relevent type when it is needed, depending on the state of the game, i.e Gamestate could be MainMenu, Settings, InGame etc...

is this an efficient way of doing stuff or is there a better way? how do other people handle this?

Thanks

I structure mine as a base class called GameObject, which contains an abstract functions called Update( ) and then every object in my game is it's own class extending GameObject. Then the game engine contains a list of these objects which it updates each one every pass.
Also, I create a class called GameState, and then extend it with a class for each gamestate, which is just like gameobject.

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 


For the most part I make a custom type with a bunch of methods/functions and various fields, for each major section of the engine. Then I have one other type which is to do with giving structure to the whole system like a scenegraph or whatever, from which all other types/objects are referenced.
Generally speaking it makes things easier usually when you divide up the problem into many smaller parts and make things modular.

Thanks for the info guys big help