Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
Quellcode |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
class Statemanager { private Map<enum StateType, reference State> states; private enum StateType currentState; public void AddState(enum StateType, reference State) { states.add(StateType, State); } public void Update() { states.get(currentState).Update(); } public void ChangeState(enum StateType new) { states.get(currentState).Exit(); currentState = new; states.get(currentState).Init(); } } |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 |
std::map<enum StateType, ???> States; void CStateManager::addState(enum StateType) { } void CStateManager::changeState(enum StateType newState) { } |
Kannst du mir eben einen Fall sagen, in dem man den "Namen" eines States wissen muss, statt einfach zu wissen, welcher State es ist?
Da will man ja sogar oft in den Grundzustand des Menüs wechseln weshalb man den Zustand jedes mal reseten müsste.
Wie soll ich das machen das ich dort anstatt der ??? meine klasse angeben kann. bzw der Map sagen das in Zukunft dort klassen gespeichert werden sollen.
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 |
void CStateManager::addState(StateType type, State* newState) { States.insert(type, newState); } void CStateManager::changeState(StateType newState) { currentState = States.find(newState); } |
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Koschi« (21.05.2015, 17:07)
Als erstes mal das Bsp. von Schorsch ist Pseudocode, das heist bissi selber überlegen muss man da schon noch. Das enum ist überall überflüssig.
Ich könnte dir hier jetzt ein Lösung hin klatschne aber ich glaube das ist nicht Sinn der Übung.
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
class CStateManager : public TSingleton<CStateManager> { private: CGameState * CurrentState; public: CStateManager(){}; ~CStateManager(); void Update(); void Render(); enum StateType; map<StateType, CGameState> States; pair<StateType, CGameState> StatePair; void addState(StateType newState,CGameState *GameState); void changeState(StateType newState); }; |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
void CStateManager::addState(StateType newState,CGameState *GameState) { StatePair = make_pair(newState, &GameState); States.insert(StatePair); } void CStateManager::changeState(StateType newState) { CurrentState->Exit(); auto i = States.find(newState); *CurrentState = i->second; CurrentState->Init(); } |
C-/C++-Quelltext |
|
1 2 3 |
CGameState * GameState; GameState = new CGame; StateManager->addState("name", GameState); |
1. Wie ich das von Schorch mitbekommen habe kann ich doch keine Enum erweitern oder? Somit ist meine addState Methode mit den Enums etwas plöd. sollte ich nicht lieber einfach nur strings benutzen, wenn ich eine Flexible GameStates haben möchte.
2. wann und von Wo soll ich den addState() aufrufen. Aktuell hatte ich nur im Kopf sie aus meiner main.cpp auszuführen. Würde dann ca so aussehen:
Schorsch hat es ja im prinzip schon erklärt. Wenn du mit Enum arbeitest sagt dir der Compiler schon das es ein State nicht gibt, ausgelagert in eine DLL gibt es später dann aber keine Möglichkeit die Aufzählung zu erweitern. Im aktuellen Code kannst du ihn natürlich beliebieg erweitern.
Fällt mir spontan nicht ein was ich bei einem MainMenü Reseten wollen würde.
Werbeanzeige