210 likes | 375 Views
GUI I I . Ogre3D GUI with MyGUI. Project initialization. http://cg.iit.bme.hu/gamedev/KIC/06_GUI/ 06_02_Ogre3D_ MyGui _ Base.zip Extract Run: Ogre MyGui . sln Set include and library paths (if not correct) Set working directory (if not $( SolutionDir )/bin) Compile Run Play !!.
E N D
GUI II. Ogre3D GUI with MyGUI
Project initialization • http://cg.iit.bme.hu/gamedev/KIC/06_GUI/ • 06_02_Ogre3D_MyGui_Base.zip • Extract • Run: OgreMyGui.sln • Set include and library paths (if not correct) • Set working directory (if not $(SolutionDir)/bin) • Compile • Run • Play!!
MyGUI • free, open source library • targeted at Ogre3D • relatively simple and flexible • visual tools for GUI editing • dismal documentation for coding
MyGUI compilation • there is no downloadable SDK • but included in guibase.zip for you • if code had to be compiled • requires Ogre3D SDK • requires FreeType library • for Windows, install FreeType for Windows from gnuwin32.sourceforge.net • requires CMake build tool
MyGUI configuration • in CMake specify Ogre and FreeType directories as dependencies • click “Generate” • open generated MyGUI.sln in Visual Studio • verify that boost version of the Ogre SDK is included (addition include dirs) • compile MyGUIEngine and OgrePlatform
MyGUI includes • include directories • ..\..\..\MyGUI_3.2.0\MyGUIEngine\include • ..\..\..\MyGUI_3.2.0\Platforms\Ogre\OgrePlatform\include main.cpp #include "MyGUI.h" #include "MyGUI_OgrePlatform.h"
Channeling events to the GUI class GuiInputHandler : public OIS::MouseListener , public OIS::KeyListener { public: boolmouseMoved( const OIS::MouseEvent &arg ) { return MyGUI::InputManager::getInstance().injectMouseMove( arg.state.X.abs, arg.state.Y.abs, arg.state.Z.abs); } boolmousePressed( const OIS::MouseEvent &arg, OIS::MouseButtonID id ){ return MyGUI::InputManager::getInstance().injectMousePress( arg.state.X.abs, arg.state.Y.abs, MyGUI::MouseButton::Enum(id)); } boolmouseReleased( const OIS::MouseEvent &arg,OIS::MouseButtonID id ) { return MyGUI::InputManager::getInstance().injectMouseRelease( arg.state.X.abs, arg.state.Y.abs, MyGUI::MouseButton::Enum(id)); } boolkeyPressed( const OIS::KeyEvent &arg ) { return MyGUI::InputManager::getInstance().injectKeyPress( MyGUI::KeyCode::Enum(arg.key), arg.text); } boolkeyReleased( const OIS::KeyEvent &arg ) { return MyGUI::InputManager::getInstance().injectKeyRelease( MyGUI::KeyCode::Enum(arg.key)); } };
InputManager modification (inputs.h) public: OIS::Keyboard* mKeyboard; OIS::Mouse* mMouse; mKeyboard = static_cast<OIS::Keyboard*>( OISInputManager->createInputObject( OIS::OISKeyboard, true )); mMouse = static_cast<OIS::Mouse*>( OISInputManager->createInputObject( OIS::OISMouse, true ));
Listener registrationin main.cpp: setupListeners GuiInputHandler* guiInputHander = new GuiInputHandler(); inputManager->mMouse-> setEventCallback(guiInputHander); inputManager->mKeyboard-> setEventCallback(guiInputHander);
GUI initializationmain.cpp: setupScene platform = new MyGUI::OgrePlatform(); platform->initialise(renderWindow, sceneManager); gui = new MyGUI::Gui(); gui->initialise(); // GUI element creation may commence here
Let us create a progress bar! //global MyGUI::ProgressPtrprogressBar; // in setupScene() // GUI element creation may commence here progressBar = gui->createWidget<MyGUI::ProgressBar> ("ProgressBar",100,10,500,30,MyGUI::Align::Center,"Main"); // skin^ position^ progressBar->setEnabled(true); progressBar->setProgressRange(stopTimes[numStops-1]); progressBar->setProgressPosition(0);
Indicate progress in every frame! progressBar->setProgressPosition(animTime);
Add checkbox to toggle music on/off! MyGUI::ButtonPtr button = gui->createWidget<MyGUI::Button> ("CheckBox", 10, 40, 300, 26, MyGUI::Align::Default, "Main"); button->setCaption("Music");
GameAudio.h: new method void setMusicVolume(float musicVolume) { this->musicVolume = musicVolume; AL_SAFE_CALL( alSourcef (ambientSource, AL_GAIN, musicVolume), "unable to set ambient volume"); }
Global function • void guiToggleMusic(MyGUI::Widget* _sender) { • MyGUI::ButtonPtr checkbox = • _sender->castType<MyGUI::Button>(); • if(checkbox->getStateSelected()) { • checkbox->setStateSelected(false); • gameAudio->setMusicVolume(0); • } else { • checkbox->setStateSelected(true); • gameAudio->setMusicVolume(10); • } • }
Add event listener button->eventMouseButtonClick += MyGUI::newDelegate( guiToggleMusic);