gpt4 book ai didi

c++ - Irrlicht - 单独文件中的 EventReceiver 类

转载 作者:行者123 更新时间:2023-11-28 06:42:39 27 4
gpt4 key购买 nike

我在 MSVC++ 10 中开发了一个应用程序。它是一个 Irrlicht 项目。该应用程序绘制了两个简单的按钮。在我阅读的教程中,它使用了一个类 MyEventReceiver。该类与主类位于同一文件中。我打算移动类 MyEventReceiver。我这样做了,但收到“访问冲突错误”。我错过了什么 ? (我的意思是初始化一些东西)。代码如下:

main.cpp

      #include <irrlicht.h>
#include <driverChoice.h>
#include "CMyEventReceiver.h"
using namespace irr;
using namespace core;
using namespace video;
using namespace gui;

int main()
{
IrrlichtDevice *device = createDevice(EDT_OPENGL, dimension2d<u32>(640, 480), 16, false, false, false, 0);
if (!device)
return 1;
device->setWindowCaption(L"Irrlicht Test");
IVideoDriver *driver = device->getVideoDriver();
IGUIEnvironment *guienv = device->getGUIEnvironment();
IGUIFont *font = guienv->getFont("../debug/lucida.xml");
guienv->addButton(rect<s32>(250, 20, 250 + 120, 50), 0, GUI_ID_QUIT_BUTTON, L"Exit", L"Exits Program");
guienv->addButton(rect<s32>(400, 20, 400 + 120, 50), 0, GUI_ID_NEW_WINDOW_BUTTON, L"New Window", L"Launches a new Window");
SAppContext context;
context.device = device;
CMyEventReceiver receiver(context);
device->setEventReceiver(&receiver);
while(device->run())
{
driver->beginScene(true, true, SColor(255, 128, 192, 255));
guienv->drawAll();
driver->endScene();
}
device->drop();
return 0;
}

CMyEventReceiver.h

    #pragma comment(lib, "Irrlicht.lib")

#include <irrlicht.h>
#include <driverChoice.h>

using namespace irr;
using namespace gui;
using namespace core;

struct SAppContext
{
IrrlichtDevice *device;
};

enum
{
GUI_ID_QUIT_BUTTON = 101,
GUI_ID_NEW_WINDOW_BUTTON
};

class CMyEventReceiver : public IEventReceiver
{
public:
CMyEventReceiver(SAppContext &context);
virtual bool OnEvent(const SEvent &e);
private:
SAppContext *sac;
};

CMyEventReceiver.cpp

    #include "CMyEventReceiver.h"

CMyEventReceiver::CMyEventReceiver(SAppContext &context) {}

bool CMyEventReceiver::OnEvent(const SEvent &e)
{

if (e.EventType == EET_GUI_EVENT)
{
s32 id = e.GUIEvent.Caller->getID();
IGUIEnvironment* guienv = sac->device->getGUIEnvironment();
if (e.GUIEvent.EventType == EGET_BUTTON_CLICKED)
{
if (id == GUI_ID_QUIT_BUTTON)
{
sac->device->closeDevice();
return true;
}
if (id == GUI_ID_NEW_WINDOW_BUTTON)
{
IGUIWindow* window = guienv->addWindow(rect<s32>(100, 100, 300, 200),false, L"New window");
return true;
}
}
}
return false;
}

如果我让文件中的代码(进行一些小的更正)它就可以工作。我更喜欢将它作为一个单独的文件,它更优雅也更有用。

感谢您的耐心等待。

EeBb

最佳答案

看起来您未能分配 sac CMyEventReciever 中的成员变量构造函数。

CMyEventReceiver receiver(context); 

但是,您的构造函数是这样的:

CMyEventReceiver::CMyEventReceiver(SAppContext &context) {}

基本上是一个“什么都不做”的构造函数。

修复应该是这样的:

CMyEventReceiver::CMyEventReceiver(SAppContext &context) : sac(&context) {}

然而,sac当对象实际使用它时,依赖于指针“活着”。所以 IMO 似乎是一个有缺陷的设计,但对于简单的 main() 程序来说,应该没问题。

现在如果程序更复杂,那么您应该使用 std::shared_ptr<SAppContext> 进行研究, 因此该指针只会在程序终止时终止。

关于c++ - Irrlicht - 单独文件中的 EventReceiver 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25671902/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com