Search code examples
c++irrlicht

How can I get mouse position with irrlicht?


I wrote a example for take the mouse inputs on the button. I mean when user click the screen, I want see what mouse position x and mouse position Y. But X and Y always have junk value. This is my code:

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

And result image:

https://i.sstatic.net/dQEMs.png

How can I solve this problem? Is there another way for take the mouse inputs positions?


Solution

  • Irrlicht documentation has tutorial on how to use mouse and joystick for input. Read here.

    You need to handle event of EMIE_MOUSE_MOVED and store mouse input current position somewhere.

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