Ogre1.8.1 Basic Tutorial 6 - The Ogre Startup Sequence

原文地址:http://www.ogre3d.org/tikiwiki/tiki-index.php?page=Basic+Tutorial+6&structure=Tutorials

 

1. Ogre的基本生命周期如下:

(1) 创建Root对象

(2) 定义Ogre将要使用的资源

(3) 选择并且设置渲染系统(就是DirectX, OpenGL等等)

(4) 创建渲染窗口

(5) 初始化将要使用的资源

(6) 使用资源创建一个场景

(7) 设置第三方库和插件

(8) 创建任意数量的帧监听(frame listeners)

(9) 启动渲染循环

Note:第一步到第四步应该按顺序执行。第五步和第六步如果你喜欢也可以放在之后执行。第七步和第八步可以在第五步和第六步之前执行,但是不应该在第四步之前执行。此外,帧监听或第三方库在资源未初始化并且场景未创建之前不能访问任何游戏相关的资源(例如摄像机,实体对象等)。

 

2. 如果你喜欢可以自由的使用任意的解析工具和配置文件格式来替代Ogre的ConfigFile解析工具,这对于加载资源没有影响,只要保证把解析的资源添加到ResourceGroupManager由其来加载就可以了。

 

3. 可以使用Root::getAvailableRenderers()来获取所有可用的RenderSystems。一旦获取到一个RenderSystem,就可以使用RenderSystem::getConfigOptions来获取所有可用的选项,下图展示了Direct3D9 Rendering Subsystem所具有的可用选项:

 

4. 可以通过Root::initialize()函数并将第一个参数设置为true来通知Ogre帮你自动创建RenderWindow。另外也可以使用win32 API, wxWidgets或任意的GUI系统来自己创建窗口,然后取得窗口句柄,之后使用NameValuePairList并将窗口句柄赋值给"externalWindowHandle",最后调用Root::CreateRenderWindow()函数来创建RenderWindow:

1 mRoot->initialise( false ); // 初始化RenderSystem,第一个参数传递false来通知Ogre无须为我们自动创建RenderWindow
2 
3 HWND hWnd = 0; // 获取我们自己创建的窗口句柄
4 NameValuePairList misc;
5 misc["externalWindowHandle"] = StringConverter::toString( (int)hWnd );
6 RenderWindow *win = mRoot->createRenderWindow( "Main RenderWindow", 800, 600, false, &misc );

 

5. 在初始化资源之前,应该设置纹理使用的mipmap数量,要注意必须在初始化资源之前设置,否则不会起效。

 

6. 在使用OIS初始化鼠标之后,会发现窗口的光标消失了。在OIS的初始化源代码中,我们可以发现鼠标被设置为独占模式:

根据MSDN,可以发现如下说明:If the system mouse is acquired in exclusive mode, the pointer is removed from the screen until the device is unacquired。因此,在独占模式下,光标是看不到的。所以,在使用OIS初始化鼠标的代码中,我加入了两行代码,将鼠标设置为非独占模式:

1 OIS::ParamList paramList;
2 paramList.insert( std::make_pair(std::string("WINDOW"), strWindowHandle.str()) );
3 paramList.insert( std::make_pair(std::string("w32_mouse"), std::string("DISCL_FOREGROUND")) );
4 paramList.insert( std::make_pair(std::string("w32_mouse"), std::string("DISCL_NONEXCLUSIVE")) );
5 
6 m_pInputManager = OIS::InputManager::createInputSystem( paramList );
7 m_pMouse = dynamic_cast<OIS::Mouse*>( m_pInputManager->createInputObject(OIS::OISMouse, false) );

这样就可以看到光标了。

posted @ 2013-07-09 09:38  EnigmaJJ  阅读(405)  评论(1编辑  收藏  举报