আমি একবারে একটি নিবন্ধ জুড়ে এসেছি যা আপনার সমস্যাটি বেশ মার্জিতভাবে সমাধান করে। এটি একটি প্রাথমিক এফএসএম বাস্তবায়ন, এটি আপনার মূল লুপে ডাকা হয়। আমি এই উত্তরটির বাকি অংশে নিবন্ধটির মূল রুনডাউনটি রূপরেখা করেছি।
আপনার বেসিক গেমের অবস্থাটি দেখতে এমন দেখাচ্ছে:
class CGameState
{
public:
// Setup and destroy the state
void Init();
void Cleanup();
// Used when temporarily transitioning to another state
void Pause();
void Resume();
// The three important actions within a game loop
void HandleEvents();
void Update();
void Draw();
};
প্রতিটি গেমের অবস্থা এই ইন্টারফেসের প্রয়োগ দ্বারা প্রতিনিধিত্ব করা হয়। আপনার ব্যাটলেস উদাহরণের জন্য, এর অর্থ এই রাজ্যগুলির অর্থ হতে পারে:
- ভূমিকা অ্যানিমেশন
- প্রধান সূচি
- দাবা বোর্ড সেটআপ অ্যানিমেশন
- প্লেয়ার মুভ ইনপুট
- প্লেয়ার সরানো অ্যানিমেশন
- প্রতিপক্ষ সরানো অ্যানিমেশন
- বিরতি মেনু
- endgame পর্দা
রাজ্যগুলি আপনার রাজ্যের ইঞ্জিনে পরিচালিত হয়:
class CGameEngine
{
public:
// Creating and destroying the state machine
void Init();
void Cleanup();
// Transit between states
void ChangeState(CGameState* state);
void PushState(CGameState* state);
void PopState();
// The three important actions within a game loop
// (these will be handled by the top state in the stack)
void HandleEvents();
void Update();
void Draw();
// ...
};
নোট করুন যে প্রতিটি রাজ্যের কোনও সময়ে সিজামেঞ্জিনে একটি পয়েন্টার প্রয়োজন, সুতরাং নতুন রাষ্ট্র প্রবেশ করানো উচিত কিনা তা রাষ্ট্র নিজেই সিদ্ধান্ত নিতে পারে। নিবন্ধটি হ্যান্ডলিভেনটস, আপডেট এবং অঙ্কনের জন্য প্যারামিটার হিসাবে সিগামেঞ্জিনে পাস করার পরামর্শ দেয়।
শেষ পর্যন্ত, আপনার প্রধান লুপটি কেবলমাত্র রাষ্ট্র ইঞ্জিনের সাথে ডিল করে:
int main ( int argc, char *argv[] )
{
CGameEngine game;
// initialize the engine
game.Init( "Engine Test v1.0" );
// load the intro
game.ChangeState( CIntroState::Instance() );
// main loop
while ( game.Running() )
{
game.HandleEvents();
game.Update();
game.Draw();
}
// cleanup the engine
game.Cleanup();
return 0;
}