Thursday, November 22, 2007

做新東西是用來簡化舊東西

我本身就是喜歡簡單的人,無論生活上,又或編寫程式。

上星期有機會,和一個同事開了一個 Side Project,一隻 2D 動作遊戲,就這樣我便重拾起 2D Graphics library。我用了數天時間,將 SDL 包起來,效果也不錯,而且在當中學到了新東西,這個新東西就是 Game State Manager。

在 Internet上都看過很多有關 State Manager 的文章,在新買的 Game Programming Gems 5 中亦有一篇講解 State Manager 的,但我總是覺得複雜,那我就藉由這個 Side Project,開始了自己的 Game State Manager 製作。有趣的是,我做完這個 Game State Manager 後,發覺可以將整個遊戲的架構簡化了,我以往要做個 Demo,main.c 都會是這樣的:

bool Game_Init() {
 ...
}

bool Game_Render() {
 ...
}

bool Game_Update() {
 ...
}

bool Game_Exit() {
...
}

bool Game_Main() {
 Game_Update();
 Game_Render();
 ...
}

void main () {
 InitOGNG();
 Game_Init();
 while (1) {
  if ( IsClosed() )
   break;
  Game_Main();
 }
 Game_Exit();
 EndOGNG();
}

遊戲的主程式一定要在 Game_Main() 、 Game_Update() 內,在這裡面才是真正的遊戲的運作。但是有了 Game State Manager 後,main.c 變成了這樣:

void main() {
 InitOGNG();
 StateCreate("test01", demoStart,
demoUpdate, demoPause, demoExit);
 while (1) {
  if ( RunOGNG() == false )
   break;
 }
 EndOGNG();
}


上面的 demoStart, demoUpdate, demoPause 及 demoExit 都是 Function,StateCreate 就是建立一個新的 GameState 和登記這幾個 Function 進去,而 RunOGNG() 內都會運行每個已登記的 GameState ( 就是 demoUpdate 了 ),差不多就是這樣了。相比起來,有 Game State Manager 的 main.c 確實是簡潔很多,而且亦可以在一個 Game State 內建立另一個新 Game State,已存在的 Game State 可以 Pause 暫停下來,或是刪除掉。這樣便可以很簡單地實現,由 Main Menu 進入 Option Menu,設定完後回到 Main Menu ,又或是遊戲進行中,暫停遊戲進入 Pause Menu 之類的功能。

No comments: