上一次还和一朋友说到写博客的问题,都觉得太花费时间了,我不得不佩服那些博客更新快的同学。本来想3月更新本篇日志的,结果被其它事情及后来的D3D给耽误了。我真没想到这么多人对MYGUI关注啊。。。
关于MyGUI3.0.1和Ogre1.7.0的编译: 不知道你们有没有遇到MyGUI3.0.1使用Ogre1.7.0的库进行编译的时候,会有一些项目编译时报重复定义的错误。 解决办法:在Demo_Console项目中,找到Console.h文件,删除其中的“#include <limits>”; 在./Common/FileSystemInfo/文件夹下面,找到FileSystemInfo.h文件,删除其中的"#include <string>"和"#include <vector>"。
MyGUI从3.0开始跨平台了,增加了使用D3D和OpenGL的渲染,不过我没用过。下面仅谈谈Ogre平台下的使用:还是从初始化开始吧,因为它已经改变了!
MyGUI::OgrePlatform *mGuiPlatform = new MyGUI::OgrePlatform(); 然后初始化OgrePlatform,当然,在这之前你得初始化ogre。mGuiPlatform->initialise(mWindow,NULL,Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,"MyGui.log")); mWindow就是Ogre中的RenderWindow啦,第二个参数是Ogre中的SceneManager(因为我初始化GUI的时候,还没有建立SceneManager,可以设置为NULL,后面再对其进行设置),第三个是资源组名,第四个是Log文件名。
MyGUI::Gui *mGuiSystem = new MyGUI::Gui();
mGuiSystem->initialise("core.xml","MyGui.log"); 第一参数这里就不再说了,以前的日志有描述。关于第二个参数log名:mGuiPlatform->initialise中的log名和mGuiSystem->initialise中的log名可以是不一样的(一样的时候,所有记录的信息将写入同一个文件中),它们记录的信息也不一样。
销毁GUI:
mGuiSystem->shutdown();
delete mGuiSystem;
mGuiPlatform->shutdown();
delete mGuiPlatform;
MyGUI的更新:MyGUI3.0中,输入事件更新的函数名没有变化(如injectMouseMove等),但不能直接使用OIS的鼠标或键盘作为参数。如下:
mGuiSystem->injectKeyRelease(MyGUI::KeyCode::Enum(arg.key)); // arg的定义const OIS::MouseEvent &arg
mGuiSystem->injectMouseMove(arg.state.X.abs,arg.state.Y.abs,arg.state.Z.abs);
mGuiSystem->injectMousePress(arg.state.X.abs,arg.state.Y.abs, MyGUI::MouseButton::Enum(id));
注意:在3.0.1中,不再需要更新时调用injectFrameEntered函数了,MyGUI能自动更新。
设置Ogre::SceneManager:在我们初始化MyGUi时,并没有设置SceneManager。mGuiPlatform->getRenderManagerPtr()->setSceneManager(mMainSceneMgr); 我们可以调用此方法来设置。mGuiPlatform->getRenderManagerPtr()->setRenderWindow(mWindow);
注意:这个调用需放在创建了SceneManager、Camera和Vieport之后,否则GUI不会显示(曾经在此纠结了半天)。
如果有多个Viewport,需调用以下方法mGuiPlatform->getRenderManagerPtr()->setActiveViewport(vptNum);
vptNum是viewport的个数,如果只有一个VIeport的话,就不需要调用了。
适应窗口大小变化:在鼠标的非独占模式下(我喜欢非独占模式),如果窗口大小变化,或许你会发现鼠标的位置和GUI上面显示的位置不吻合。在ceguiOgreRender里面,cegui有一个函数SetDisplaySize,可以变化GUI的移动大小,但是MyGUI没有。 这并不说明我们就没有办法来适应窗口大小变化!
首先我定义了二个函数:
int getMatchGUIX(int oisX)
{
int matchWidth = (oisX*mWndWidth)/mWindow->getWidth(); // mWndWidth是创建渲染窗口的宽
return matchWidth;
}
int getMatchGUIY(int oisY)
{
int matchHeight = (oisY*mWndHeight)/mWindow->getHeight(); // mWndHeight是创建渲染窗口的高
return matchHeight;
}
然后更新鼠标位置时,代入的参数为转换后的位置(如下) :
int guiX = getMatchGUIX(arg.state.X.abs);
int guiY = getMatchGUIY(arg.state.Y.abs);
mGuiSystem->injectMousePress(guiX, guiY, MyGUI::MouseButton::Enum(id));
MyGUI处理了事件? 实际上injectMousePress这些函数都是有返回值的。返回了一个bool型变量,表示该消息MyGUI是否处理过(比如,没有窗口获取焦点,MyGUI将不处理事件返回false)。
关于MyGUI3.0+Ogre1.7
最新推荐文章于 2022-03-11 09:34:13 发布