ฉันเคยเจอบทความที่แก้ปัญหาของคุณได้อย่างงดงาม เป็นการใช้งาน FSM ขั้นพื้นฐานที่เรียกว่าในลูปหลักของคุณ ฉันได้สรุปบทสรุปพื้นฐานของบทความในส่วนที่เหลือของคำตอบนี้
สถานะเกมพื้นฐานของคุณมีลักษณะดังนี้:
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();
};
แต่ละสถานะของเกมจะแสดงโดยการใช้อินเทอร์เฟซนี้ สำหรับตัวอย่าง Battlechess ของคุณนี่อาจหมายถึงสถานะเหล่านี้:
- นิเมชั่นบทนำ
- เมนูหลัก
- ภาพเคลื่อนไหวการตั้งค่ากระดานหมากรุก
- ผู้เล่นย้ายอินพุต
- ภาพเคลื่อนไหวย้ายผู้เล่น
- นิเมชั่นย้ายฝ่ายตรงข้าม
- เมนูหยุดชั่วคราว
- หน้าจอเกม
สถานะถูกจัดการในเอ็นจิ้นรัฐของคุณ:
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();
// ...
};
โปรดทราบว่าแต่ละรัฐต้องการตัวชี้ไปยัง CGameEngine ในบางจุดดังนั้นรัฐสามารถตัดสินใจได้ว่าควรป้อนสถานะใหม่หรือไม่ บทความแนะนำให้ส่งผ่าน CGameEngine เป็นพารามิเตอร์สำหรับ HandleEvents, Update และ 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;
}