我正在Windows中使用Ogre14.1进行开发,以便在我的项目中制作一个可点击的按钮。 我遵循下面给出的官方食人魔文档链接。 https://ogrecave.github.io/ogre/api/latest/trays.html
这是我的整个应用程序代码
class MyApplication : public ApplicationContext, public InputListener {
public:
ShaderGenerator* shadergen = nullptr;
MyTrayListener mlistener; //see next code
SceneManager* scnMgr = nullptr;
SceneNode* LightNode = nullptr;
SceneNode* CameraNode = nullptr;
Viewport* viewport = nullptr;
void run() {
// Main loop
playing = true;
while (playing) {
getRoot()->renderOneFrame();
}
}
void setup() override {
ApplicationContext::setup();
Root* root = getRoot();
// Get the scene manager
scnMgr = root->createSceneManager();
// Register the input listeners
addInputListener(this);
// Create and set up the scene
createScene(); //adding lights, cameras, etc
addModels(); //added some models
scnMgr->addRenderQueueListener(getOverlaySystem());
}
void loadResources() override
{
addUI(); // ADDED TRAY BUTTONS
}
bool frameRenderingQueued(const Ogre::FrameEvent& evt) override
{
mTrayMgr->frameRendered(evt);
return ApplicationContext::frameRenderingQueued(evt);
}
void addUI() {
cout << "creating UI" << endl;
OgreBites::TrayManager* mTrayMgr = new OgreBites::TrayManager("InterfaceName", getRenderWindow(), &mlistener);
mTrayMgr->setListener(&mlistener);
mTrayMgr->showCursor();
mTrayMgr->showTrays();
mTrayMgr->showFrameStats(TL_BOTTOMLEFT, -1);
Button* b = mTrayMgr->createButton(TL_TOPLEFT,"MyButton", "OK!", 50.0f);
}
};
这是我的 TrayListener 实现
class MyTrayListener : public OgreBites::TrayListener {
public:
void buttonHit(OgreBites::Button* button) override {
cout << "buttonHit"; //not printed, function not getting called
if (button->getName() == "MyButton") {
// Handle button click event here
button->setCaption("Clicked!");
}
}
};
它没有给出任何错误,但没有触发buttonHit()函数。
编辑1: 正如评论中所理解的,我已将 mlistener 移至类范围:
class MyApplication : public ApplicationContext, public InputListener {
public:
ShaderGenerator* shadergen = nullptr;
SceneManager* scnMgr = nullptr;
MyTrayListener mlistener; // <-----------------
...
}
编辑2: 我错误地从 setup() 而不是 loadResources() 创建了 TrayManager,因此解决了这个问题。但现在 TrayManager 构造函数抛出异常,在以下行找不到文件:
mCursor = (Ogre::OverlayContainer*)om.createOverlayElementFromTemplate("SdkTrays/Cursor", "Panel", nameBase + "Cursor");
我已经在 resources.cfg 文件中添加了“SdkTrays.zip”。
父类ApplicationContext在其loadResources()中加载resources.cfg中的所有资源;我们没有覆盖它。
void loadResources() override
{
ApplicationContext::loadResources();
addUI(); // ADDED TRAY BUTTONS
}