现在将程序中下列代码段注释掉 mEditorGuiSheet=
CEGUI::WindowManager::getSingleton().createWindow((CEGUI::utf8*)\ mGUISystem->setGUISheet(mEditorGuiSheet);
CEGUI::PushButton* quitButton =
(CEGUI::PushButton*)CEGUI::WindowManager::getSingleton().createWindow
(\(CEGUI::utf8*)\
mEditorGuiSheet->addChildWindow(quitButton); quitButton->setPosition(CEGUI::Point(0.35f, 0.45f)); quitButton->setSize(CEGUI::Size(0.3f, 0.1f)); quitButton->setText(\在同样位置添加下列代码 mEditorGuiSheet =
CEGUI::WindowManager::getSingleton().loadWindowLayout((CEGUI::utf8*)\
mGUISystem->setGUISheet(mEditorGuiSheet);
CEGUI::PushButton* quitButton=(CEGUI::PushButton*)CEGUI:: WindowManager::getSingleton().getWindow((CEGUI::utf8*)%uit\
最后一行多余的,因为我们没有在之后使用指针,但是其说明了如何通过加载文件来进行访问。注意:我们在创建xml文件时要根据实际窗口进行设计。 完成后编译并执行,程序在外观上并没有变化。
尝试
?视线相交和选取Ogre mesh—当鼠标没有从GUI元素上移过。 ?定义一个在GUI根菜单上的鼠标点击动作。当你鼠标点击一个不在根窗口中的GUI元素时,它将会响应你的鼠标点击。如果你的鼠标并没有从一个 GUI元素上滑过(也就是说当你的鼠标指针还在我们的3D场景中)则根窗口响应鼠标点击。 ?将鼠标点击转换到世界坐标系和视线相交((Camera::getCamera)到ViewportRay(mouseX, mouseY)) // Start a new ray query
Ogre::Ray cameraRay = root::getSingleton( ).
getCamera( )->getCameraToViewportRay( mouseX, mouseY ); Ogre::RaySceneQuery *raySceneQuery = root::getSingleton( ). getSceneManager( )->createRayQuery( cameraRay ); raySceneQuery->execute( );
Ogre::RaySceneQueryResult result = raySceneQuery->getLastResults( );
Ogre::MovableObject *closestObject = NULL; real closestDistance = LONG_MAX;
std::list< Ogre::RaySceneQueryResultEntry >::iterator rayIterator; for ( rayIterator = result.begin( ); rayIterator != result.end( ); rayIterator++ ) {
if ( ( *rayIterator ).movable->getUserObject( ) != NULL ) {
if ( ( *rayIterator ).distance < closestDistance ) {
closestObject = ( *rayIterator ).movable; closestDistance = ( *rayIterator ).distance; } } }
// No object clicked
if ( closestObject == NULL ) {
clickedObject = NULL; ---- clickedObject is a class scoped variable } else {
clickedObject = static_cast<
object* >( closestObject->getUserObject( ) ); }
raySceneQuery->clearResults( );
root::getSingleton( ).getSceneManager( )->destroyQuery( raySceneQuery )
如何在两个GUI(用户界面)之间转换(使用透明度)
例如:如果你有一个登陆界面,在成功登陆后,进入了你的用户主界面。你将会想在这两个界面间切换。 ?第一步,加载登陆用户界面。 //First loading with this
mGUIRenderer = new CEGUI::OgreCEGUIRenderer(mWindow, Ogre::RENDER_QUEUE_OVERLAY, false, 3000,mSceneMgr); mGUISystem = new CEGUI::System(mGUIRenderer);
CEGUI::Logger::getSingleton().setLoggingLevel(CEGUI::Informative);
CEGUI::SchemeManager::getSingleton().loadScheme((CEGUI::utf8*)\
mGUISystem->setDefaultMouseCursor((CEGUI::utf8*)\ok\ CEGUI::Font *f =
CEGUI::FontManager::getSingleton().createFont(\.font\
mGUISystem->setDefaultFont(f); //End \ //Load a XML file mEditorGuiSheet =
CEGUI::WindowManager::getSingleton().loadWindowLayout((CEGUI::utf8*)\
mGUISystem->setGUISheet(mEditorGuiSheet); 第二步,如果你想删除并重建一个GUI,你需要做到以下: if(mEditorGuiSheet)
CEGUI::WindowManager::getSingleton().destroyWindow(mEditorGuiSheet);
最后一步,加载其他的GUI mEditorGuiSheet =
CEGUI::WindowManager::getSingleton().loadWindowLayout((CEGUI::utf8*)\
mGUISystem->setGUISheet(mEditorGuiSheet); 重做第二步和最后一步来加载其他GUI。 结论
这个教程为你展示了在Ogre3D下使用CEGUI的一些基本方法,你可以感受下使用CUEGUI编程的乐趣:)