无论是GearMaster还是之后开发的3d地图,都会需要一个窗口界面的地图编辑器。然而 OGRE范例提供的ExampleApplication类是针对游戏独占界面的,也就是不能和mfc/ .net windows form这类用于开发窗口界面程序的库混合使用。这个问题以前一直未解决。然而事实上解决办法十分简单。
问题的核心在于RenderWindow。OGRE是把窗口作为一个类独立于渲染系统,而我们只要把这个渲染窗口类嵌入到指定的窗口即可。代码如下:
NameValuePairList opts;
opts[ "externalWindowHandle" ] = StringConverter::toString( iHandle );
m_pRenderWindow = m_pRoot->createRenderWindow( "OGRE Panel", 100, 100, false, &opts );
我们只需要吧iHandel赋值为指定window的句柄即可。当然这个window是win32定义的概念,也就是说你可以把一个按钮当成是window。获取句柄的方法只需要参照对应的库即可。
当然,创建之后还要解决刷新的问题。范例使用了root::startRendering()了事,这样会无法配合窗口界面的更新。正确的办法是每次窗口要刷新的时候,调用:
m_pRoot->renderOneFrame();//渲染一帧
m_pRenderWindow->update();//刷新renderWindow
后面的工作就十分好办了,OGRE和form各司其职,基本不会干扰