快速业务通道

设计自己的3D图像引擎(3):WuguiEngine之基础循环的实现

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-29
atable
2: {
3: public:
4:   BaseGame(string name);                       //Constructor
5:   GraphicsDevice* GetGraphicsDevice();                //获取GraphicsDevice
6:   void Tick();                            //一帧完整的游戏
7:   virtual void Run() = 0;                      //开始一场游戏,里面建立消息循环
8:   virtual void Dispose();
9:   virtual void Update(DWORD dt);
10:   virtual void Render(DWORD dt);
11:   virtual void Initialize();
12:   void RegisterCamera(BaseCamera* camera);
13:   BaseCamera* GetCamera();
14: protected:
15:   //方法:
16:   void SetTimeUsed();                        //设置花费的时间
17:   void ShowFPS();
18:   void UpdateCamera(DWORD dt);
19:
20:   //变量:
21:   GraphicsDevice* pDevice;                      //指向GraphicsDevice的指针
22:   bool isInitialized;                        //是否初始化
23:   BaseCamera* pCamera;
24: };

其中, IDisposed,IRenderable, IUpdatable等I开头的类是接口类,里面具有纯虚函数,重写就可以实现具体的代码了.

GraphicsDevice类是我准备将Direct3D中的IDirect3DDevice9类封装得到,使得使用起来更方便,而且增加一些实用的功能,不过目前的功能和本来的Device功能差不多,这里就不多说了.

另外值得注意的是Tick函数,其描述的是一帧游戏的过程:

1: void BaseGame::Tick()
2: {
3:   SetTimeUsed();                      //设置花费了的时间
4:   Update(TimeUsed::LastTickTimeUsed);           //调用更新函数
5:   Render(TimeUsed::LastTickTimeUsed);           //调用渲染函数
6: }

Update和Render都是虚函数, 当我们将一个类继承自BaseGame的时候, 也就会调用相应的Update和Render类.

代码中的TimeUsed是静态类,里面存储了时间相关的参数,比如一帧时间的长度, 从启动游戏到现在的时间长度等等.

其他的函数都有注释, 如果还有不太理解的地方,也可以从GoogleCode上面把源代码下下来,很快就会明白了

3. 下面举一个基本的例子,来说明这些程序是怎样一步步进行的

主要的类: TestGame(继承自BaseGame), WEWindow, BaseGame.

1) 在WinMain()中,首先完成建立窗体:

1: INT WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE, LPWSTR, int)
2: {
3:   //第一步,设置窗体
4:   WEWindow* weWindow = WEWindow::GetInstance();
5:   weWindow->SetHInstance(hInstance);
6:   weWindow->SetWEWindow(L"Hello World", 640, 480, WS_OVERLAPPEDWINDOW | WS_VISIBLE);
7:   weWindow->CreateMainWindow();

2)在WinMain()中,创建一个TestGame类的实例,并且调用TestGame->Run(继承自BaseGame的纯虚函数)

1: //第二部,初始化游戏
2: TestGame* game = new TestGame("Matrix");
3:
4: //第三步,开始游戏
5: game->Run();

3)在TestGame->Run()中, 进行初始化与建立消息循环的操作

1: void TestGame::Run()
2: {
3:   //进行初始化
4:   this->Initialize();
5:
6:   //进入消息循环
7:   this->EnterMessageLoop();
8: }

4)在TestGame::Initialize()中,完成一些初始化的工作, 为进

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号