मैं एक गेम लिख रहा हूं, और मैं अपने अलग-अलग राज्यों को मॉडल करना चाहता हूं (गेम निर्माता समानता फ्रेम, मुझे लगता है) एक स्वच्छ, ऑब्जेक्ट उन्मुख तरीके से। पहले, मैंने इसे निम्न तरीके से किया है:आप आवेदन राज्यों को कैसे मॉडल करते हैं?
class Game
{
enum AppStates
{
APP_STARTING,
APP_TITLE,
APP_NEWGAME,
APP_NEWLEVEL,
APP_PLAYING,
APP_PAUSED,
APP_ENDED
};
typedef AppState(Game::*StateFn)();
typedef std::vector<StateFn> StateFnArray;
void Run()
{
// StateFn's to be registered here
AppState lastState(APP_STARTING);
while(lastState != APP_ENDED)
{
lastState = GetCycle_(lastState);
}
// cleanup
}
protected:
// define StateFn's here
AppState GetCycle_(AppState a)
{
// pick StateFn based on passed variable, call it and return its result.
}
StateFnArray states_;
};
यह एक छोटी परियोजना के लिए शायद ही प्रबंधनीय था। राज्यों का उपयोग करने वाले सभी चर गेम गेम में डंप किए गए थे, हालांकि मैं ऑब्जेक्ट-उन्मुखता को अधिकतम, केवल उजागर करने वाले चरों को एक से अधिक राज्यों द्वारा साझा करना चाहता हूं। मैं राज्य में ऐसा करने के बजाए इसे स्विच करते समय एक नया राज्य शुरू करने में सक्षम होना चाहता हूं जो कि अभी खत्म हो रहा है (क्योंकि इसमें कई परिणाम हो सकते हैं - APP_PLAYING APP_PAUSED, APP_GAMEOVER, APP_NEWLEVEL, आदि पर स्विच कर सकता है)।
मैं कुछ इस तरह के बारे में सोचा (! चेतावनी फजी STUFF!):
struct AppState
{
enum { LAST_STATE = -1; }
typedef int StateID;
typedef std::vector<AppState*> StateArray;
static bool Add(AppState *state, StateID desiredID);
// return false if desiredID is an id already assigned to
static void Execute(StateID state)
{
while(id != LAST_STATE)
{
// bounds check etc.
states_[id]->Execute();
}
}
AppState() {};
virtual ~AppState() {};
virtual StateID Execute() =0; // return the ID for the next state to be executed
protected:
static StageArray stages_;
};
समस्या है कि यहाँ वर्ग और उदाहरण स्तरों गड़बड़ हो रहे हैं (बनाम आभासी स्थिर) है। राज्यों को ऐपस्टेट से उत्तराधिकारी होने की आवश्यकता है, लेकिन - मैं कैसे कल्पना करूंगा - उनमें से अधिकतर सभी स्थैतिक सदस्यों के साथ कक्षाएं होंगी, या कम से कम मुझे एक वर्ग से एक से अधिक उदाहरण की आवश्यकता नहीं होगी (टाइटलस्टेट, लेवलइन्ट्रोस्टेट, प्लेइंगस्टेट , GameOverState, EndSequenceState, EditorState ... - रुकने वाले राज्यों की देखभाल करने के बजाय, अब यह एक राज्य नहीं होगा, जहां यह समझ में आता है)।
यह सुंदर और कुशलतापूर्वक कैसे किया जा सकता है?
http://gamedevgeek.com/tutorials/managing-game-states-in-c/
असल में, आप खेल राज्यों के ढेर को बनाए रखने, और सिर्फ शीर्ष राज्य चलाएँ: