我和朋友一塊在做游戲編輯器練手,鑒于大家以前都沒有經驗,就會寫寫圖形。就照著開源的Ogitor學習罷。我首先負責的就是草體部分,考慮到哥是最弱的。。。所以寫到現在才完工。。。講下學習心得吧,只寫下思路,具體的過程懶得寫。(高手勿看了。。)
Ogitor的代碼寫的非常易讀,要是你能編譯次ogitor的話,跟著程序走一邊就能很快清楚其結構。所以嘛,先提下編譯,ogitor的編譯其實還是有些麻煩的,尤其是對像我這種命令行菜鳥來說,ogitor的wiki上有詳細的教程,[url]http://wiki.ogitor.org/Building+Ogitor&structure=Development[/url]基本很完善了,不過我還是遇到許多麻煩,強烈建議裝vs2008,因為Qt有專門適用08的源碼包,而且記著一定按著Jacmoe寫的步驟來,別先過cmake那塊,先把QtPropertyBrowser弄好,設置環境變量的時候我出了個小白錯誤,在PATH變量后面加Qt目錄前加了個空格,導致系統不接受后面的路徑。(。。。悲劇的很。。)然后的步驟就沒啥問題了。如果你在編譯的時候出現(vs08命令行下或者Qt Creator下,后者不建議,得改qt的編譯器,我反正沒找到在哪里改。。。)
[code]g++:
Documents\Programmer\Ogre\unstable-06e26a1bed18\qtOgitor\qtpropertybrowser-2.5\lib\libQtSolutions_PropertyBrowser-2.5d.a:
No such file or directory
mingw32-make[1]: *** [..\lib\QtSolutions_PropertyBrowser-2.5d.dll] Error 1
mingw32-make: *** [debug-all] Error 2
Exited with code 2.
Error while building project buildlib
When executing build step 'Make'
[/code]記著肯定是你裝了mingw,編譯得用vs的編譯器。
Ogitor的草體也是借由PageGemotry庫(下面縮寫為PG)實現的,Ogre的 Addons fourm里有詳細介紹,這個庫相當強大,而且使用輕便,簡單的刷草體我們利用里面的GrassLoader即可,就是公告板。這塊代碼他們沒有寫在ogPageGeometry里,那塊別看了,否則你們會向我一樣給帶跑的。Ismail(Ogitor的主要開發人員)將這塊寫在TerrainGroupManager里,直接和地形刷交互,仔細想想,這也是最好的方法。(我走工廠方法的歪路想了4,5天才拐回來。。之前沒發現他寫在TerrainGroupManager里了。。。)由于PG實現草體的加載只有兩種,要么隨機,要么通過加載密度紋理。不像treeLoader一樣,可以直接AddEntity。(想想為什么)所以要想實現草體刷,咱就得創建一張動態紋理來實現了。我們修改每個TerrainPageObject(頁地形),向其加入GrassLayer。而在TerrainGroupManager里保留具體的更新者PagedGeometry和GrassLoader。這里不做具體解釋,建議去看看PG的源碼,10個文件左右,(一半Header,一半Source)代碼也很易懂。還有,Ogitor的工廠對象注冊機制很好,(我對設計模式沒什么研究不知道叫啥。。)新手這個一定得細看看,Ogitor在解耦上做的也近乎完美,面向對象的界面編程Qt加上Ismail自己寫的很多基類,使得程序分離的很好,推薦看看OgitorsProperty類,里面就是照著Qt的信號機制寫的,這塊我也沒深看。我們用的是MFC,所以這塊沒有寫成純面向對象的,用的還是離散型的單件。我兄弟說Ogitor那樣效率差點,不過我覺得挺酷的,畢竟寫的漂亮。Ogitor的工廠對象的初始化部分是寫在CreateProperties里的,因為許多變量需要有用戶修改,所以構造函數沒有初始化所有變量。
最后帶句:Ogitor的大哥們相當熱情,有問題多去他們的forum里提,基本第二天就回了。(有時差)