第19章Delta3D應用程序框架_第1頁
第19章Delta3D應用程序框架_第2頁
第19章Delta3D應用程序框架_第3頁
第19章Delta3D應用程序框架_第4頁
第19章Delta3D應用程序框架_第5頁
已閱讀5頁,還剩7頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、第19章 Delta3D應用程序框架目錄19.1 基于dtABC:Application的程序框架119.2 基于GameStart.exe的程序框架519.2.1 GameStart的源代碼519.2.2自定義程序入口類819.2.3創建動態鏈接庫9可以利用Delta3D引擎提供的兩種方案快速構建三維虛擬應用程序框架。第一種是直接利用Delta3D提供的dtABC:Application類;另一種方法是利用Delta3D提供的GameStart.exe和相應的入口程序。下面分別介紹這兩種方法。19.1 基于dtABC:Application的程序框架dtABC庫是Delta3D提供的一個應用

2、類庫,包含了一系列開發3D應用程序的高端基類,我們可以直接從這些基類派生從而創建應用程序框架。應用程序可以從Delta3D提供的dtABC:application類開始。步驟如下:(1)從dtABC:Application派生一個自定義類,如MyApplicationinclude<dtABC/application.h>class MyApplication: public dtABC:Application public: MyApplication (const std:string& configFilename = "config.xml");

3、 virtual void Config(); 這個類中的兩個公有函數是應用程序的固定模式,必須有的,也是特別重要的兩個函數。其中之一是構造函數,其參數的默認值是“config.xml”。在開發應用程序時,必須建立一個對應的congfig.xml文件,其中記錄程序運行的基本設置。congfig.xml是一個用xml語言編寫的一個文件,默認情況下在Delta3D的安裝路徑。如果要將該文件放置到其他路徑下,則必須在構造函數中進行路徑的指定。這個類的構造函數在默認情況下,將這個設置文件讀入,并進行相應的程序設置。下面是構造函數的定義,主要進行config.xml文件的確認。MyApplication

4、:MyApplication(const std:string& configFilename): dtABC:Application(configFilename) /Generating a default config file if there isn't one already if(!osgDB:fileExists(configFilename) GenerateDefaultConfigFile(); 可以看出,自定義應用類的構造函數調用了基類的構造函數,仔細分析基類的構造函數將有助于我們深刻理解引擎的框架。下面是dtABC:Application類的構造函數的

5、一部分。IMPLEMENT_MANAGEMENT_LAYER(Application) Application:Application(const std:string& configFilename, dtCore:DeltaWin* win) : BaseClass("Application") 1. RegisterInstance(this); 2. mWindow = win; 3. if (!configFilename.empty() 4. std:string foundPath = dtCore:FindFileInPathList(configF

6、ilename); 5. if (foundPath.empty() 6. LOG_WARNING("Application: Can't find config file, " + configFilename + ", using defaults instead.") ; 7. else if (!ParseConfigFile(foundPath) 8. LOG_WARNING("Application: Error loading config file, using defaults instead."); 上述代

7、碼IMPLEMENT_MANAGEMENT_LAYER(Application) 是一個宏定義,實現了一些特定功能,與構造函數當中的RegisterInstance(this)配合使用,詳細的分析我們將在后續章節進行。 第4行代碼,通過dtCore:FindFileInPathList函數,由文件名config.xml找到對應的路徑。 如果沒有找到對應的文件(見第5行)或者所找的config文件不符合規范(見第7行),則提示使用缺省的config文件,此文件在MyApplication類的構造函數內進行創建。下面給出另外一個函數Config()。void MyApplication:Confi

8、g() GetWindow()->SetWindowTitle("MyApplication"); /setup scene here mTerrain = new dtCore:InfiniteTerrain; mTerrain->SetVerticalScale(0.5); mTerrain->Regenerate(); mEnvironment = new dtCore:Environment(); mEnvironment->SetDateTime(2009, 9, 18, 2, 0, 0); / Add a nice Sky mEnviro

9、nment->AddEffect(new dtCore:SkyDome(); mEnvironment->AddEffect(new dtCore:CloudPlane(6, 0.5, 6, 1, .3, 0.96, 256,1800); / Create character datamCharacterWrapper =new dtAnim:CharacterWrapper("/examples/data/demoMap/SkeletalMeshes/marine.xml"); if(!mCharacterWrapper.valid() exit(-1); /

10、 Tripod for looking at the camera mTripod = new dtCore:Tripod(GetCamera(), mCharacterWrapper.get(); / Overriden class to handle keyboard / mouse. mKeyController = new KeyController(mCharacterWrapper.get(), GetKeyboard(); / Set the character to origin mCharacterWrapper.get()->SetTransform(Transfor

11、m(0, 0, 0, 0, 0, 0); / Add the Objects to the scene GetScene()->AddDrawable(mTerrain.get(); GetScene()->AddDrawable(mEnvironment.get(); GetScene()->AddDrawable(mCharacterWrapper.get(); / Makes the camera you sent in earlier, look at the character mTripod->SetLookAtTarget(mCharacterWrappe

12、r.get(); Application:Config(); 可以看出,主要的場景導入都可以在Config()函數中進行,主要工作包括:設置窗口名稱、導入地形數據、設置環境(其中包括時間和天空效果)、導入角色數據、將上述物體加入場景。 到目前為止,我們定義了一個應用程序的基本框架,知道了在何處進行程序參數的設置,在何處導入場景數據。自定義MyApplication的使用如下:#include<MyApplication.h>#include<dtCore/globals.h>int main() /set data search path to parent direc

13、tory and delta3d/data dtCore:SetDataFilePathList( ".;" + dtCore:GetDeltaDataPathList() + "" +dtCore:GetDeltaRootPath(); /Instantiate the application and look for the config file dtCore:RefPtr<MyApplication> app = new MyApplication(); app->Config(); /configuring the appli

14、cation app->Run(); / running the simulation loop return 0; 執行這個程序得到如下圖1的場景。圖19.1dtCore:RefPtr<MyApplication> app = new MyApplication()代碼用到了智能指針的概念。它的主要優點是,向動態存儲區申請內存空間后,不用程序員人為去進行存儲空間的釋放,只要該指針超出其生命域,相應的所占據的空間自動釋放。建議在Delta3D的開發中都使用智能指針進行變量的存儲,關于智能指針的具體定義,見附錄1。從概念上來說,main()函數并沒有做很多事情,任何時候Delt

15、a3D應用程序都被告知到磁盤上去搜尋文件(比如,導入一個config文件或網格模型)。應用程序將會根據這里設置的路徑(即第1行)進行文件的搜尋。一個好的做法就是將程序運行時所需的所有數據保存在一個單獨的稱為data的目錄中,這樣你可以一次性在這里進行路徑的設置,以后就不用再管了。在這個應用程序中,數據與應用程序在同一個目錄中,所以我們需要將當前目錄"."加入。在windows操縱系統中,目錄之間是用分號分開的。第2個加入的路徑(dtCore:GetDeltaDataPathList()返回的值)是環境變量DELTA_DATA的值。Delta3D應用程序的運行需要依賴某些數據

16、文件(data file),所以要確保這些路徑字符串在應用程序的搜索路徑中。利用dtABC:Application進行應用程序的構建比較適合于較小規模的應用系統,因為這樣的系統可以不利用GameManager進行系統的管理。一旦涉及到很多游戲對象,特別是要用到網絡功能時,必須要創建GameManager,而利用游戲入口的方法GameEntryPoint可以自動創建一個GameManager,比較適合于較大型的應用系統的開發。19.2 基于GameStart.exe的程序框架19.2.1 GameStart的源代碼GM(Game Manager)構架提供了一個獨立可執行文件GameStart.e

17、xe和相應的應用程序入口,用來直接啟動應用程序,而不用將該應用程序編譯為可執行文件。GameStart的代碼如下:#include <dtCore/refptr.h>#include <dtGame/gameapplication.h>#include <dtGame/exceptionenum.h>#include <dtGame/gamemanager.h>#include <dtUtil/fileutils.h>#include <dtUtil/exception.h>#include <dtUtil/log.

18、h>#include <iostream>#include <cstdlib>void ShowUsageAndExit() std:cerr << "Usage: GameStart -configFileName <file> <AppLibraryName> App Library argsn" std:cerr << " Note: AppLibraryName should not have the extension or Unix library prefix on it.

19、n" std:cerr << " For example libMyApp.so, MyApp.dll, or libMyApp.dylib would all be loaded as 'GameStart MyApp'." << std:endl; exit(1);int main(int argc, char* argv) bool showUsage = false; std:string appToLoad; int curArg = 1; std:string configFileName("confi

20、g.xml"); while (!showUsage && appToLoad.empty() && curArg < argc) std:string curArgv = argvcurArg; if (!curArgv.empty() if (curArgv = "-configFileName") +curArg; if (curArg < argc) configFileName = argvcurArg; else showUsage = true; else if (curArgv0 = '-'

21、;) std:cerr << "Unknown option: " << curArgv << std:endl; showUsage = true; elseappToLoad = curArgv; +curArg; /The loop always overruns by one, so subtract it back off. -curArg; if (appToLoad.empty() | showUsage) ShowUsageAndExit(); argc -= curArg; argv = argv + curArg; t

22、ry dtCore:RefPtr<dtGame:GameApplication> app = new dtGame:GameApplication(argc, argv, configFileName); app->SetGameLibraryName(appToLoad); app->Config(); app->Run(); app = NULL; std:cerr << "The Game Manager is now shutting down . " << std:endl; catch (const dtUt

23、il:Exception& ex) LOG_ERROR("GameStart caught exception: "); ex.LogException(dtUtil:Log:LOG_ERROR); return -1; return 0;上面的代碼中設置游戲庫名和配置是關鍵: app->SetGameLibraryName(appToLoad); app->Config();可以查看底層的源代碼,做進一步的理解。19.2.2自定義程序入口類GameStart運行之后會尋找庫中的GameEntryPoint類,一旦找到該程序入口,則調用3個成員函數,然后

24、離開它自己的GameApplication,接著執行游戲循環。游戲的入口GameEntryPoint對于GameStart就像ActorPluginRegistry對于ActorLibrary的作用。建立游戲入口簡單但屬于必須的步驟。自定義的游戲入口類的基本構成如下:class ShipSimulatorGameEntryPoint : public dtGame:GameEntryPointpublic:ShipSimulatorGameEntryPoint();virtual ShipSimulatorGameEntryPoint();virtual void Initialize(dtG

25、ame:GameApplication& app, int argc, char *argv);virtual void OnStartup(dtGame:GameApplication& app);virtual void OnShutdown(dtGame:GameApplication& app);在這個類里面創建GM和組件。MyGameEntryPoint類的主要成員函數包括:(1)重載基類的初始化函數Initialize()進行程序開始階段的初始化,這個函數會在dtGame:GameApplication類的Config()函數中動態調用。在該初始化函數中進行

26、游戲的早期配置工作,比如命令行的解析,游戲窗口的配置,數據文件的路徑設置等,但不要將有關GM的工作在此處進行;(2)OnStartup()函數,該函數在游戲循環開始之前調用,創建GM CreateGameManager(),組件的創建、地圖的導入、角色的創建等工作,所以該函數是一個非常重要的函數。我們的主要工作就體現在這個函數中。該函數是其父類的純虛函數(OnStartup())的重載函數,在GameApplication類的Config()函數中動態地調用,即通過GameStart程序的主函數中的語言app->Config()進行自動調用;(3)程序關閉OnShutdown()。我們可

27、以基于dtABC:Application開發Delta3D應用程序,那為何要使用GameEntryPoint而不使用dtABC:Application?主要原因是這樣可以使得應用程序是可配置的,你只要簡單構建自己開發的庫或地圖,然后運行GameStart可執行程序啟動游戲即可。通過這種方法可以在編輯器當中直接啟動游戲程序。另外,由于Initialize()是第一個被調用的函數,所以可以在該函數中進行不同測試模式或選用不同的應用程序配置。19.2.3創建動態鏈接庫按如下的步驟利用Visual Studio生成dll文件:(1)打開vs2008新建一個win32工程,應用程序設置為dll的空文件。把頭文件和源文件分別復制到工程文件當中,如圖4.2所示圖19.2(2)點擊打開項目菜單,項目-> 屬性->調試,在命令,命令參數,工作目錄,添加好如下內容(注:命令參數是項目工程文件的名稱,工作目錄是動態鏈接庫所在的目錄),圖19.3給出了某種設置的截圖。圖19.3(3)打開export.h頭文件,將文件中ifdef后面的TUTORIAL_TANK_LIBRARY添加到編譯器的預處理器定義中。圖

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論