Monday, November 26, 2007

重整 OGRE 的工具

支援 OGRE 的工具一向都很多,主要的 3D Content Software 都有 Exporter 可以使用,我常用的 MilkShape3D 也有 Exporter。近日我想整理一下 MilkShape3D 的 Exporter,因為改用 OGRE 以來,Exporter 中對於導出 material 檔案的功能是缺乏的,所以要加進這個功能,就這樣我的週末節目就是製作 Exporter 了。

初時用 OGRE 的功能來導出 material 資料,但很不順利,因為 exporter 不時就會 crash,追查了半天時間才發現是 Release runtime 問題。Runtime 用對了後又發現,OGRE 的 Material Serializer 生成的 material 檔案,有些設定是不能導出的,後來要自己用寫入 Text 檔案方法來完成,又沒有了半天時間。

雖然進度慢了一點,但暫時在 export 出來的 material 檔案中,都可以有基本的資料了,下一部就是加一個 Dialog Box,加一些可設定的資料 ( 又是 Win32 的 API ),再 export 出 material 檔案,計劃好像很完美呢 .....

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 之類的功能。