如何使用 irrlicht 获取鼠标位置?
How can I get mouse position with irrlicht?
我写了一个在按钮上进行鼠标输入的例子。我的意思是当用户点击屏幕时,我想查看鼠标位置 x 和鼠标位置 Y。但是 X 和 Y 总是有垃圾值。这是我的代码:
#include <irrlicht.h>
#include <iostream>
using namespace std;
using namespace irr;
using namespace core;
using namespace scene;
using namespace video;
using namespace io;
using namespace gui;
// Declare a structure to hold some context for the event receiver so that it
// has it available inside its OnEvent() method.
struct SAppContext
{
IrrlichtDevice *device;
};
// Define some values that we'll use to identify individual GUI controls.
enum
{
GUI_ID_BUTTON = 101,
};
class MyEventReceiver : public IEventReceiver
{
public:
MyEventReceiver(SAppContext & context) : Context(context) { }
virtual bool OnEvent(const SEvent& event)
{
if (event.EventType == EET_GUI_EVENT)
{
s32 id = event.GUIEvent.Caller->getID();
switch(event.GUIEvent.EventType)
{
case EGET_BUTTON_CLICKED:
switch(id)
{
case GUI_ID_BUTTON:
cout << "X: "<< event.MouseInput.X << endl;
cout << "Y: "<< event.MouseInput.Y << endl << endl;
return true;
default:
return false;
}
break;
default:
break;
}
}
return false;
}
private:
SAppContext & Context;
};
int main(int argc, char** argv)
{
// create device and exit if creation failed
IrrlichtDevice * device = createDevice( video::EDT_SOFTWARE, core::dimension2d<u32>(1280, 720));
if (device == 0)
return 1; // could not create selected driver.
device->setWindowCaption(L"Irrlicht Engine - User Interface Demo");
device->setResizable(true);
video::IVideoDriver* driver = device->getVideoDriver();
IGUIEnvironment* env = device->getGUIEnvironment();
// add button
env->addButton(rect<s32>(0,0,640,360), 0, GUI_ID_BUTTON,
L"Button", L"Button");
// Store the appropriate data in a context structure.
SAppContext context;
context.device = device;
// Then create the event receiver, giving it that context structure.
MyEventReceiver receiver(context);
// And tell the device to use our custom event receiver.
device->setEventReceiver(&receiver);
/*
That's all, we only have to draw everything.
*/
while(device->run() && driver)
if (device->isWindowActive())
{
driver->beginScene(true, true, SColor(0,200,200,200));
env->drawAll();
driver->endScene();
}
device->drop();
return 0;
}
结果图片:
https://i.stack.imgur.com/dQEMs.png
我该如何解决这个问题?有没有其他方法可以获取鼠标输入位置?
Irrlicht 文档有关于如何使用鼠标和操纵杆进行输入的教程。 Read here.
您需要处理 EMIE_MOUSE_MOVED
的事件并将鼠标输入的当前位置存储在某处。
if (event.EventType == irr::EET_MOUSE_INPUT_EVENT)
{
switch(event.MouseInput.Event)
{
...
case EMIE_MOUSE_MOVED:
MouseState.Position.X = event.MouseInput.X;
MouseState.Position.Y = event.MouseInput.Y;
break;
...
}
}
我写了一个在按钮上进行鼠标输入的例子。我的意思是当用户点击屏幕时,我想查看鼠标位置 x 和鼠标位置 Y。但是 X 和 Y 总是有垃圾值。这是我的代码:
#include <irrlicht.h>
#include <iostream>
using namespace std;
using namespace irr;
using namespace core;
using namespace scene;
using namespace video;
using namespace io;
using namespace gui;
// Declare a structure to hold some context for the event receiver so that it
// has it available inside its OnEvent() method.
struct SAppContext
{
IrrlichtDevice *device;
};
// Define some values that we'll use to identify individual GUI controls.
enum
{
GUI_ID_BUTTON = 101,
};
class MyEventReceiver : public IEventReceiver
{
public:
MyEventReceiver(SAppContext & context) : Context(context) { }
virtual bool OnEvent(const SEvent& event)
{
if (event.EventType == EET_GUI_EVENT)
{
s32 id = event.GUIEvent.Caller->getID();
switch(event.GUIEvent.EventType)
{
case EGET_BUTTON_CLICKED:
switch(id)
{
case GUI_ID_BUTTON:
cout << "X: "<< event.MouseInput.X << endl;
cout << "Y: "<< event.MouseInput.Y << endl << endl;
return true;
default:
return false;
}
break;
default:
break;
}
}
return false;
}
private:
SAppContext & Context;
};
int main(int argc, char** argv)
{
// create device and exit if creation failed
IrrlichtDevice * device = createDevice( video::EDT_SOFTWARE, core::dimension2d<u32>(1280, 720));
if (device == 0)
return 1; // could not create selected driver.
device->setWindowCaption(L"Irrlicht Engine - User Interface Demo");
device->setResizable(true);
video::IVideoDriver* driver = device->getVideoDriver();
IGUIEnvironment* env = device->getGUIEnvironment();
// add button
env->addButton(rect<s32>(0,0,640,360), 0, GUI_ID_BUTTON,
L"Button", L"Button");
// Store the appropriate data in a context structure.
SAppContext context;
context.device = device;
// Then create the event receiver, giving it that context structure.
MyEventReceiver receiver(context);
// And tell the device to use our custom event receiver.
device->setEventReceiver(&receiver);
/*
That's all, we only have to draw everything.
*/
while(device->run() && driver)
if (device->isWindowActive())
{
driver->beginScene(true, true, SColor(0,200,200,200));
env->drawAll();
driver->endScene();
}
device->drop();
return 0;
}
结果图片:
https://i.stack.imgur.com/dQEMs.png
我该如何解决这个问题?有没有其他方法可以获取鼠标输入位置?
Irrlicht 文档有关于如何使用鼠标和操纵杆进行输入的教程。 Read here.
您需要处理 EMIE_MOUSE_MOVED
的事件并将鼠标输入的当前位置存储在某处。
if (event.EventType == irr::EET_MOUSE_INPUT_EVENT)
{
switch(event.MouseInput.Event)
{
...
case EMIE_MOUSE_MOVED:
MouseState.Position.X = event.MouseInput.X;
MouseState.Position.Y = event.MouseInput.Y;
break;
...
}
}