2016-11-10 5 views
0

버튼에 마우스 입력을 가져 오는 예제를 작성했습니다. 나는 사용자가 화면을 클릭 할 때 어떤 마우스 위치 x와 마우스 위치 Y를보고 싶다. 그러나 X와 Y는 항상 정크 값을 갖는다.irrlicht로 마우스 위치를 얻으려면 어떻게해야합니까?

https://i.stack.imgur.com/dQEMs.png

가 어떻게이 문제를 해결할 수 :

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

그리고 결과 이미지 : 이것은 내 코드? 마우스 입력 위치를 잡을 다른 방법이 있습니까?

답변

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

대단히 감사합니다. –

관련 문제