天天看點

ogre與CEGUI結合

注意需要4個動态連結庫,才行,一個是ceguibase,一個是渲染器CEGUIFalagardWRBase.dll,一個是CEGUIExpatParser.dll

,還有一個就是ogreRender:CEGUIOgreRenderer.dll,否則第一個函數bootstrapSystem就會有異常,

這四個動态連結庫中:渲染器和xml分析器ExpatParser是動态加載的。

還有要設定mainsheet才行,不然視窗顯示不出來:mGUISystem->setGUISheet(MainSheet);

可以用多個layout來組織程式用到的界面,用其中一個layout作為gui系統的mainsheet。其他的layout要顯示出來,首先要作為

mainsheet的子視窗才行:MainSheet->addChildWindow(wnd);

關于光标:Ogre的BaseApplication類裡面有個OgreBites::SdkTrayManager,這個東西是做界面的,裡面有各種控件,還可以設定光标,這個光标是用overlay做的

在ois的滑鼠各種事件監聽函數裡面,以及各種幀監聽器裡面調用SdkTrayManager相應的事件函數,驅動這個東西工作。

要把SdkTrayManager的光标隐藏。

CEGUI也有自己的光标,這兩個東西都是界面,放一起用,理論上不好,隻用一個就好了。

可以事先把需要用的ImageSet和Font寫入到scheme檔案裡面,這樣在解析scheme檔案的時候自動解析這些檔案

進而不用自己在代碼裡面手動建立這些東西了。

CEGUI::WindowManager::getSingleton().loadWindowLayout函數傳回的是layout裡面的最後一個視窗。

當cegui找不到對應的imageset和image的時候,不會報錯,隻是不顯示。

當設定了視窗屬性AlwaysOnTop的時候,滑鼠點選其他視窗是無效的,目前視窗相當于模态對話框視窗了。

當系統設定了預設字型的時候:若視窗某個地方需要用到其他字型而這個字型沒有定義的時候,就會使用預設字型。

layout視窗的大小不是你看到的大小,而是layout裡面最頂級父視窗的大小,有的時候這個大小是看不到的,

這個頂級父視窗可能覆寫了其他的視窗,但由于他是透明的,所有有的時候你點選其他的視窗老是切換不過去就是這個原因

CEGUI中視窗的Zorder:

cegui中沒有什麼屬性是指定視窗的z order的,我發現,視窗的Zorder跟視窗的建立順序有關,最後建立的視窗在最前面。

但有幾個函數控制zorder的:setRiseOnClickEnabled(true),滑鼠一點選視窗就到最頂層。

setZOrderingEnabled()表示zorder是否可以改變。這個函數影響:moveToFront, moveToBack, moveInFront and moveBehind

cegui的初始化代碼:

mGUIRenderer = &CEGUI::OgreRenderer::bootstrapSystem();

mGUISystem = CEGUI::System::getSingletonPtr();

CEGUI::SchemeManager::getSingleton().create((CEGUI::utf8*)"WindowsLook.scheme");

CEGUI::SchemeManager::getSingleton().create((CEGUI::utf8*)"VanillaSkin.scheme");

//mGUISystem->setDefaultMouseCursor((CEGUI::utf8*)"TaharezLook", (CEGUI::utf8*)"MouseArrow");

//CEGUI::MouseCursor::getSingleton().setImage((CEGUI::utf8*)"TaharezLook",(CEGUI::utf8*)"MouseMoveCursor"); 

//CEGUI::System::getSingleton().setDefaultTooltip( (CEGUI::utf8*)"TaharezLook/Tooltip" );

CEGUI::FontManager::getSingleton().create("SimHei-12.font");

mGUISystem->setDefaultFont("SimHei-12");

CEGUI::Window *MainSheet=CEGUI::WindowManager::getSingleton().loadWindowLayout((CEGUI::utf8*)"EntranceWnd.layout");

mGUISystem->setGUISheet(MainSheet);

mEntranceWnd = CEGUI::WindowManager::getSingleton().getWindow("EntranceWnd");

mEntranceWnd->hide();

mEntranceButton = static_cast<CEGUI::PushButton*>(CEGUI::WindowManager::getSingleton().getWindow("Button/Entrance"));

mEntranceButton->subscribeEvent(CEGUI::PushButton::EventClicked, CEGUI::Event::Subscriber(&TutorialApplication::entranceButtonHandle, this));

一個滑鼠鍵轉換函數:

CEGUI::MouseButton convertButton(OIS::MouseButtonID buttonID)

{

switch (buttonID)

{

case OIS::MB_Left:

return CEGUI::LeftButton;

case OIS::MB_Right:

return CEGUI::RightButton;

case OIS::MB_Middle:

return CEGUI::MiddleButton;

default:

return CEGUI::LeftButton;

}

}

每一幀都要調用:

CEGUI::System::getSingleton().injectTimePulse(evt.timeSinceLastFrame);

還有滑鼠和鍵盤處理:

bool TutorialApplication::mouseMoved( const OIS::MouseEvent &arg )

{

BaseApplication::mouseMoved(arg);

mGUISystem->injectMouseMove( arg.state.X.rel, arg.state.Y.rel );

mGUISystem->injectMouseWheelChange(arg.state.Z.rel);

return true;

}

bool TutorialApplication::mousePressed( const OIS::MouseEvent &arg, OIS::MouseButtonID id )

{

BaseApplication::mousePressed(arg,id);

mGUISystem->injectMouseButtonDown(convertButton(id));

return true;

}

bool TutorialApplication::mouseReleased( const OIS::MouseEvent &arg, OIS::MouseButtonID id )

{

BaseApplication::mouseReleased(arg,id);

mGUISystem->injectMouseButtonUp(convertButton(id));

return true;

}

bool TutorialApplication::keyPressed(const OIS::KeyEvent &arg )

{

BaseApplication::keyPressed(arg);

mGUISystem->injectKeyDown(arg.key);

mGUISystem->injectChar(arg.text);

return true;

}

bool TutorialApplication::keyReleased( const OIS::KeyEvent &arg )

{

if(arg.key == OIS::KC_X)

{

std::cout<<mCamera->getPosition();

std::cout<<std::endl;

}

mGUISystem->injectKeyUp(arg.key);

return BaseApplication::keyReleased(arg);

}

CEGUI的事件處理函數:

bool eventHandler(const CEGUI::EventArgs& e)

在視窗事件處理函數裡面,可以對參數const CEGUI::EventArgs& e,進行轉換,如果事先知道是哪種視窗的事件:

((RadioButton*)((const WindowEventArgs&)e).window),通過這樣可以得到觸發這個事件的視窗指針。

根據一個圖檔檔案建立Imageset,這樣建立的Imageset裡面隻有一個image,名字為full_image。

CEGUI::ImagesetManager::getSingleton().createFromImageFile("bkdddd", "bkdddd.tga");

wnd->setProperty("Image", "set: bkdddd image:full_image");