Page 1 of 1
Problem creating a simple window in Ogre
Posted: Wed Aug 13, 2008 20:01
by majc
Im trying to create a simple window when i click in an npc but for some reason give me a memory error.
Here is the code:
Code: Select all
void cGUIInterface::vendorMenu()
{
CEGUI::SchemeManager::getSingleton().unloadAllSchemes();
loadScheme("TaharezLookSkin.scheme");
mGUISystem->setDefaultMouseCursor((CEGUI::utf8*)"TaharezLook", (CEGUI::utf8*)"MouseArrow");
CEGUI::FontManager::getSingleton().createFont("Commonwealth-10.font");
CEGUI::WidgetLookManager::getSingleton().parseLookNFeelSpecification("TaharezLook.looknfeel");
CEGUI::WindowManager& winMgr = CEGUI::WindowManager::getSingleton();
CEGUI::DefaultWindow* root = (DefaultWindow*)winMgr.createWindow("DefaultWindow", "Root");
CEGUI::System::getSingleton().setGUISheet(root);
FrameWindow* wnd = (FrameWindow*)CEGUI::WindowManager::getSingleton().createWindow((CEGUI::utf8*)"TaharezLook/FrameWindow", (CEGUI::utf8*)"Window");
root->addChildWindow(wnd);
wnd->setPosition(CEGUI::UVector2(cegui_reldim(0.25f), cegui_reldim( 0.25f)));
wnd->setSize(CEGUI::UVector2(cegui_reldim(0.5f), cegui_reldim( 0.5f)));
wnd->setMaxSize(CEGUI::UVector2(cegui_reldim(1.0f), cegui_reldim( 1.0f)));
wnd->setMinSize(CEGUI::UVector2(cegui_reldim(0.1f), cegui_reldim( 0.1f)));
wnd->setText("Weapons Vendor");
}
Give the error in this line:
Code: Select all
FrameWindow* wnd = (FrameWindow*)CEGUI::WindowManager::getSingleton().createWindow((CEGUI::utf8*)"TaharezLook/FrameWindow", (CEGUI::utf8*)"Window");
Thanks in advance!
Posted: Wed Aug 13, 2008 20:40
by Bane
have you tried just a regular window?
Posted: Wed Aug 13, 2008 21:42
by majc
How i do that?
Posted: Wed Aug 13, 2008 21:43
by majc
How i do that? Can you give me an example?
Posted: Wed Aug 13, 2008 22:09
by Bane
sure look at my post about generalized windows in the forum, right under yours right now.
or basically change CEGUI::FrameWindow*
to just CEGUI::Window*
Posted: Wed Aug 13, 2008 22:38
by majc
Yes
Posted: Thu Aug 14, 2008 01:09
by Kevin
The specific error should be listed at (or towards) the bottom of CEGUI.log after running the program. I can't be sure, but it seems like the error is likely a result of there being another window registered with the system named "Window". All windows in the entire CEGUI system must have unique names. So you could either try naming it something else, or (as of a fairly recent release of CEGUI), you can try omitting that parameter, and then the system will generate a unique name for you. The only problem with the latter option is you can then no longer refer to that window by name in other parts of the code.
If this is the not the problem (or that doesn't help) I would still recommend seeing what's in CEGUI.log.
Hope that helps.
Kevin
Posted: Fri Aug 15, 2008 09:00
by majc
Yes Kevin was that the problem thanks alot mate
But now i have another problem :S in the tutorials and exemples i only found code that we can interact with buttons loading an existing overlay, if i want to add a quit default button i must load an overlay file or i can create a new button like i did with the FrameWindow?
Here is the code i have until now:
Constructor:
Code: Select all
cGUIInterface::cGUIInterface(cGraphicalInterface *graphicalInterface)
{
// setup GUI system
mGraphInterface = graphicalInterface;
mGUIRenderer = new CEGUI::OgreCEGUIRenderer(mGraphInterface->getWindow() , Ogre::RENDER_QUEUE_OVERLAY, false, 3000, mGraphInterface->getSceneManager());
mGUISystem = new CEGUI::System(mGUIRenderer);
CEGUI::Logger::getSingleton().setLoggingLevel(CEGUI::Informative);
winMgr = &CEGUI::WindowManager::getSingleton();
root = (DefaultWindow*)winMgr->createWindow("DefaultWindow", "Root");
CEGUI::System::getSingleton().setGUISheet(root);
vendorWindow = 0;
}
Other functions needed for this example:
Code: Select all
CEGUI::MouseButton cGUIInterface::convertOISMouseButtonToCegui(int buttonID)
{
switch (buttonID)
{
case 0: return CEGUI::LeftButton;
case 1: return CEGUI::RightButton;
case 2: return CEGUI::MiddleButton;
case 3: return CEGUI::X1Button;
default: return CEGUI::LeftButton;
}
}
Code: Select all
bool cGUIInterface::handleQuit(const CEGUI::EventArgs& e)
{
if (vendorWindow)
CEGUI::WindowManager::getSingleton().destroyWindow(vendorWindow);
return true;
}
Vendor Menu window where i want to put the button to buy or sell:
Code: Select all
void cGUIInterface::vendorMenu()
{
//CEGUI::SchemeManager::getSingleton().unloadAllSchemes();
//loadScheme("TaharezLookSkin.scheme");
//CEGUI::FontManager::getSingleton().createFont("Commonwealth-10.font");
//CEGUI::WidgetLookManager::getSingleton().parseLookNFeelSpecification("TaharezLook.looknfeel");
if (vendorWindow)
CEGUI::WindowManager::getSingleton().destroyWindow(vendorWindow);
vendorWindow = (FrameWindow*)CEGUI::WindowManager::getSingleton().createWindow((CEGUI::utf8*)"TaharezLook/FrameWindow", (CEGUI::utf8*)"Window");
root->addChildWindow(vendorWindow);
mGUISystem->setDefaultMouseCursor((CEGUI::utf8*)"TaharezLook", (CEGUI::utf8*)"MouseArrow");
vendorWindow->setPosition(CEGUI::UVector2(cegui_reldim(0.25f), cegui_reldim( 0.25f)));
vendorWindow->setSize(CEGUI::UVector2(cegui_reldim(0.5f), cegui_reldim( 0.5f)));
vendorWindow->setMaxSize(CEGUI::UVector2(cegui_reldim(1.0f), cegui_reldim( 1.0f)));
vendorWindow->setMinSize(CEGUI::UVector2(cegui_reldim(0.1f), cegui_reldim( 0.1f)));
vendorWindow->setText("Weapons Vendor");
CEGUI::PushButton* pQuitButton = (CEGUI::PushButton *)CEGUI::WindowManager::getSingleton().getWindow("DefaultWindow");
pQuitButton->subscribeEvent(CEGUI::PushButton::EventClicked, CEGUI::Event::Subscriber(&cGUIInterface::handleQuit, this));
//winMgr->getWindow((CEGUI::utf8*)"TaharezLook/Button")->subscribeEvent(CEGUI::PushButton::EventClicked, CEGUI::Event::Subscriber(&cGUIInterface::handleQuit, this));
}
Here is the log error:
Code: Select all
14/08/2008 01:36:28 (Error) CEGUI::UnknownObjectException in file \Projects\CEGUI\cegui_mk2-v0-6-2003\src\CEGUIWindowManager.cpp(180) : WindowManager::getWindow - A Window object with the name 'DefaultWindow' does not exist within the system
But the default window is beeing created in the contructor :S
or all this things it seems to be easier to load Windows and buttons from a overlay file created previously.
What you advice? What is the best way? Create de windows and buttons or load them from a overlay?
Thanks in advance!
Posted: Fri Aug 15, 2008 16:11
by Jamarr
I think you are getting your WindowType and WindowName mixed up.
When you create a type of "DefaultWindow" in the constructor, you are giving it the name "Root". So if you are trying to access that window, you need to use WindowManager::getWindow("Root") instead; optionally, since that is also your GUISheet, you could use System::getGUISheet().
Posted: Fri Aug 15, 2008 16:50
by majc
Thanks mate