第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

提交评论