Ogre 14.1 中的托盘库按钮无法捕获鼠标事件

问题描述 投票:0回答:1

我正在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”。

c++ game-development ogre
1个回答
0
投票

父类ApplicationContext在其loadResources()中加载resources.cfg中的所有资源;我们没有覆盖它。

void loadResources() override
{
    ApplicationContext::loadResources();
    addUI(); // ADDED TRAY BUTTONS
}
© www.soinside.com 2019 - 2024. All rights reserved.