2016-11-10 90 views
0

我寫了一個用於在按鈕上進行鼠標輸入的示例。我的意思是當用戶點擊屏幕時,我想看看鼠標位置x和鼠標位置Y.但X和Y總是有垃圾值。這是我的代碼:如何用irrlicht獲取鼠標位置?

#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

我怎樣才能解決這個問題?是否有另一種方式來獲得鼠標輸入位置?

回答

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

非常感謝。 –