Advertisement
Guest User

Untitled

a guest
Nov 13th, 2011
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. //Statemanager.h
  2. #ifndef STATEMANAGER_H
  3. #define STATEMANAGER_H
  4.  
  5. #include "State.h"
  6. #include <map>
  7.  
  8. class StateManager
  9. {
  10. private:
  11.   //Speichert alle Zustände als Assoziatives Array
  12.   std::map<std::string, State*> _statesById;
  13.   //Aktueller Zustand
  14.   State *_currentState;
  15.  
  16. public:
  17.   StateManager();
  18.   ~StateManager();
  19.  
  20.   void AddState(const std::string &id, State *state);
  21.   void SetState(const std::string &id);
  22.   bool Update(float elapsedTime);
  23.   void Render();
  24. };
  25.  
  26. #endif
  27.  
  28. //Statemanager.cpp
  29. #include "StateManager.h"
  30.  
  31. //erzeugt ein StateManager-Objekt
  32. StateManager::StateManager():
  33.   _currentState(NULL)
  34. {
  35. }
  36.  
  37. //Löscht das StateManager-objekt mit allen Zuständen.
  38. StateManager::~StateManager()
  39. {
  40.     for(std::map<std::string, State*>::iterator it = _statesById.begin(); it != _statesById.end(); ++it)
  41.     {
  42.         delete (*it).second;
  43.     }
  44. }
  45.  
  46. //Registriert einen Zustand für den Manager an Hand der ID. Diese muss
  47. //eindeutig und nicht leer sein.
  48. void StateManager::AddState(const std::string &id, State *state)
  49. {
  50.     if (id.length() == 0)
  51.         throw std::exception("Id has to be a valid string");
  52.     if (state == NULL)
  53.         throw std::exception("State must not be null");
  54.  
  55.     std::map<std::string, State*>::iterator it = _statesById.find(id);
  56.     if (it != _statesById.end())
  57.     {
  58.         std::string error("State with ID ");
  59.         error.append(id);
  60.         error.append(" already exist.");
  61.         throw std::exception(error.c_str());
  62.     }
  63.    
  64.     _statesById[id] = state;
  65. }
  66.  
  67. //Setzt den aktuellen Zustand
  68. void StateManager::SetState(const std::string &id)
  69. {
  70.     std::map<std::string, State*>::iterator nextStateIt = _statesById.find(id);
  71.  
  72.     //Wenn der Zustand im Manager registriert ist
  73.     if (nextStateIt != _statesById.end())
  74.     {
  75.         //und nicht der aktuelle ist
  76.         if (nextStateIt->second != _currentState)
  77.         {
  78.             //Rufe OnLeave() vom alten Zustand auf, falls es einen gab
  79.             if (_currentState != NULL)
  80.                 _currentState->OnLeave();
  81.            
  82.             //setze den neuen aktuellen Zustand
  83.             _currentState = nextStateIt->second;
  84.      
  85.             //Da zu einem neuen Zustand gewechselt worden ist, rufe das Eingangsereignis auf
  86.             _currentState->OnEnter();
  87.         }
  88.     }
  89.     else
  90.         //ansonsten gibt es diesen Zustand nicht!
  91.         throw std::exception("State does not exist.");
  92. }
  93.  
  94. //Aktualisert den Spielzustand. der Rückgabewert gibt an, ob das Programm weiterläuft.
  95. //Es läuft nicht weiter, wenn der aktuelle Zustand verlassen und kein weiterer Zustand zugewiesen wird.
  96. bool StateManager::Update(float elapsedTime)
  97. {
  98.     //Es muss ein Zustand gesetzt sein!
  99.     if (_currentState == NULL)
  100.         throw std::exception("Current state not set.");
  101.    
  102.     //aktualisere den Zustand und schaue, ob der Zustand eventuell verlassen werden soll
  103.     bool running = _currentState->OnUpdate(elapsedTime);
  104.  
  105.     //wenn er verlassen werden soll und der Folgezustand gesetzt ist
  106.     if (!running && !_currentState->NextState().length() > 0)
  107.     {
  108.         //Wechsle den Zustand
  109.         SetState(_currentState->NextState());
  110.    
  111.         //Programm läuft weiter
  112.         return true;
  113.     }
  114.  
  115.     //
  116.     return running;
  117. }
  118.  
  119. //Zeichnet den aktuellen Zustand.
  120. void StateManager::Render()
  121. {
  122.     //Es muss ein Zustand gesetzt sein!
  123.     if (_currentState == NULL)
  124.         throw std::exception("Current state not set.");
  125.    
  126.     //Zeichne den aktuellen Zustand
  127.     _currentState->OnRender();
  128. }  
  129.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement