GameManager

Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Neue Antwort erstellen

Jolinah

Betreff: GameManager

BeitragMi, Mai 18, 2005 14:38
Antworten mit Zitat
Benutzer-Profile anzeigen
~AUFSPALTUNG~

und ~EDITIERT~

Habe den Ursprungsthread geteilt und hier Jolinahs Nachricht nochmal eingefügt!
DivineDominion
- - - - - -



@digga [Bezieht sich auch auf den Ursprungsthread]:

Da es Sourcecode ist müsstest du im mod\pub.mod Ordner von BlitzMax den Ordner "gamemanager.mod" anlegen und den Code als "gamemanager.bmx" da rein kopieren.

Nächster Schritt wäre das kompilieren des Moduls, dazu musst du MinGW (gcc) installiert haben und dann im Menu von BMax Build Modules anklicken.

Ansonsten kann ich dir auch die kompilierte Version Online stellen.



Jolinah aus Ursprungsthread hat Folgendes geschrieben:
Finde das kann man recht gut gebrauchen, daher hab ich mir mal erlaubt es in ein Modul umzuschreiben Wink

Da es doof wäre wenn man ein Modul dauernd ändern müsste hab ich den Vorgang mit SetGameState geändert so dass man das Modul immer unverändert lassen kann.

Edit: Gehört jetzt vielleicht eher in Module..
Hab absichtlich bei ModuleInfo nix reingeschrieben weil ich den Hauptcode ja von Divi habe Wink

Code: [AUSKLAPPEN]

Strict

Module pub.GameManager

ModuleInfo "Name:"
ModuleInfo "Version:"
ModuleInfo "Author:"

Import brl.system
Import brl.glmax2d


'Basisklasse für Gamestates
Type TGameState Abstract

   'Starten des Gamestates (laden etc.)
   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



'Standard-Gamestate, wird beim Starten des Gamemanagers als Hinweis verwendet dass noch keine eigenen Gamestates erstellt wurden.
Type TMainGameState Extends TGameState Final

   Field _lines:TList

   Method Enter()
      _lines = New TList
      _lines.AddLast("Noch keine States erstellt / No states created")
      _lines.AddLast("Druecke ESC zum Beenden / Press ESC Key to quit")
      _lines.AddLast("")
      _lines.AddLast("Beispiel eines Gamestates / Example of a gamestate")
      _lines.AddLast("")
      _lines.AddLast("")
      _lines.AddLast("Type TMyGameState extends TGameState")
      _lines.AddLast("  Method Enter()")
      _lines.AddLast("    'Entering Gamestate")
      _lines.AddLast("  End Method")
      _lines.AddLast("")
      _lines.AddLast("  Method Process()")
      _lines.AddLast("    'Mainloop of this Gamestate")
      _lines.AddLast("    If KeyHit(KEY_ESCAPE) then GameManager.SetGameState(Null)")
      _lines.AddLast("    Draw()")
      _lines.AddLast("  End Method")
      _lines.AddLast("")
      _lines.AddLast("  Method Leave()")
      _lines.AddLast("    'End of Gamestate")
      _lines.AddLast("  End Method")
      _lines.AddLast("")
      _lines.AddLast("  Method Draw()")
      _lines.AddLast("    'Draw")
      _lines.AddLast("  End Method")
      _lines.AddLast("End Type")
      _lines.AddLast("")
      _lines.AddLast("")
      _lines.AddLast("Local MyState:TMyGameState = new TMyGameState")
      _lines.AddLast("")
      _lines.AddLast("GameManager.Run(MyState)")
   End Method
   
   Method Process()
      If KeyHit(KEY_ESCAPE) Then
         GameManager.SetGameState(Null)
         Return
      EndIf
   
      Draw()
   End Method
   
   Method Leave()
      _lines.Clear()
      _lines = Null
   End Method
   
   Method Draw()
      Local count = 0
      
      For Local line:String = EachIn _lines
         DrawText line, 10, count * 20 + 10
         count :+ 1
      Next
   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
   

   'Start des Spiels mit übergabe einer GameState Instanz, wenn keine vorhanden wird TMainGameState als Hinweis benutzt.
   Method Run(State:TGameState = Null)
      If State = Null
         _state = New TMainGameState
      Else
         _state = State
      EndIf
      
      _state.Enter()
      _quit = False
      _fps = New TFPSManager         
      
      'Hauptschleife des Spiels   
      While Not _quit
         _fps.Update()
         Cls
            Update()
         Flip
         FlushMem
      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).
   Method SetGameState(NewState:TGameState)
      
      If _state
         _state.Leave()
      EndIf
      
      _state = NewState

      If _state
         _state.Enter()
      EndIf

   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



Dann noch eine Beispielanwendung:

Code: [AUSKLAPPEN]

Strict

Type TMyState Extends TGameState

   Field x:Float, y:Float

   Method Enter()
      x = 10.0
      y = 200.0
   End Method
   
   Method Process()
      If KeyHit(KEY_ESCAPE) Then
         GameManager.SetGameState(Null)
         Return
      EndIf
      
      If KeyHit(KEY_SPACE) Then
         GameManager.SetGameState(New TMyOtherState)
         Return
      EndIf
   
      x  :+ GameManager.FPS_Val(50.0)
   
      Draw()
   End Method
   
   Method Leave()
   End Method
   
   Method Draw()
      DrawText GameManager.FPS(), 10, 300
      DrawRect x, y, 10, 10
   End Method

End Type


Type TMyOtherState Extends TGameState

   Method Enter()
   End Method
   
   Method Process()
   
      If KeyHit(KEY_ESCAPE) Then
         GameManager.SetGameState(Null)
         Return
      EndIf
   
      If KeyHit(KEY_SPACE) Then
         GameManager.SetGameState(New TMyState)
         Return
      EndIf
      
      Draw()
   End Method
   
   Method Leave()
   End Method
   
   Method Draw()
      DrawText "Der andere Gamestate", 10, 10
   End Method
   
End Type


'**** HAUPTTEIL ****
Graphics 1024,768,32,-1

GameManager.Run(New TMyState)

EndGraphics
FlushMem
End


Was haltet ihr davon?

Edit2: Mit dieser Variante kann man sogar GameStates beibehalten. Also man wechselt auf einen anderen GameState und speichert den alten in einer Variable. Dann kann man wieder auf diesen zurückschalten und alles läuft von da an weiter wo man aufgehört hat.

diGGa

GruppenKaspar

BeitragMi, Mai 18, 2005 14:45
Antworten mit Zitat
Benutzer-Profile anzeigen
versteh bei den downloads von mingw nix.. wäre cool wenn du eine version online stellst Smile
Gestern Nacht Schlug der Regen an mein Fenster
Ich ging durch das dunkle Zimmer und
glaubte im Licht der Straßenlampe
Den Geist unseres jahrhunderts auf der
Straße zu sehen
Der uns sagte, daß wir alle am Rande
des Abgrunds stehen.
- Al Steward


Athlon 64 3000+ / Radeon 9600 / 1024mb ddram

Jolinah

BeitragMi, Mai 18, 2005 15:57
Antworten mit Zitat
Benutzer-Profile anzeigen
http://prdownloads.sf.net/ming...e?download
Das empfehl ich dir, ist leider etwas gross..

Aber hier nun das kompilierte Modul:
http://zehr.de/blitz3d/gamemanager.mod.zip

In BlitzMax\mod\pub.mod den Ordner gamemanager.mod erstellen und das Zip da drin entpacken. Sollten zwei .a Dateien sein, Release und Debug.

Danach BlitzMax neu starten (falls es geöffnet war) und der Beispielcode von mir sollte sich dann in BlitzMax normal kompilieren lassen.

Firstdeathmaker

BeitragFr, Aug 12, 2005 17:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Also, was muss ich jetzt genau machen um Module compilieren zu können? Ich hab mir das runtergeladen, aber ich verstehe den Hinweis den Mark Silby auf der Website hat nicht genau:

Zitat:
To enable module development, you must install the Mingw package (main download here), and add the Mingw 'bin' directory to your PATH environment variable. You must also add a MINGW environment variable that contains the base directory of the Mingw installation.
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image

Jolinah

BeitragFr, Aug 12, 2005 18:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Also wenn du MinGW in C:\MinGW installiert hast musst du deine Path Umgebungsvariable anpassen und zusätzlich noch ne neue Umgebungsvariable namens MINGW erstellen.

Dazu klickst du mit rechts auf Arbeitsplatz, dann Eigenschaften auswählen. Dort das Tab Erweitert auswählen und unten den Knopf Umgebungsvariablen klicken.

Dort gibts dann 2 Listboxes. In der unteren wo Systemvariablen steht wählst du Path aus und klickst auf Bearbeiten. Dann schreibst du ans Ende ";C:\MinGW\bin" (ohne Anführungszeichen, Semikolon am Anfang ist wichtig).

Nun klickst du noch auf Neu. Als Name MINGW eingeben und bei Wert "C:\MinGW" (ohne Anführungszeichen).

Jetzt BMax neustarten und die Module sollten sich kompilieren lassen (Build Modules).

Firstdeathmaker

BeitragFr, Aug 12, 2005 19:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok, Danke, funktioniert alles perfekt. Wieder was dazu gelernt Wink
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group