如何通过irrlicht获得鼠标位置?

时间:2016-11-10 00:13:12

标签: c++ 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

我该如何解决这个问题?是否有其他方法可以获取鼠标输入位置?

1 个答案:

答案 0 :(得分:2)

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;
       ...
   }
}