diff --git a/JGE/include/JGE.h b/JGE/include/JGE.h index 8e533fd9b..b354dd8df 100644 --- a/JGE/include/JGE.h +++ b/JGE/include/JGE.h @@ -110,6 +110,10 @@ class JGE static std::multimap keyBinds; typedef std::multimap::iterator keycodes_it; + // Mouse attributes + int mLastLeftClickX; + int mlastLeftClickY; + friend void Run(); public: @@ -272,7 +276,17 @@ class JGE void ReleaseKey(const LocalKeySym); void ReleaseKey(const JButton); + ////////////////////////////////////////////////////////////////////////// + /// Mouse events + /// x and y are int coordinates relative to SCREEN_WIDTH and SCREEN_HEIGHT + ////////////////////////////////////////////////////////////////////////// + void LeftClicked(int x, int y); + void LeftClickedProcessed(); + + // Getter, may have to move that in the JGuiListener + // Returns false if nothing has been clicked, true otherwise + bool GetLeftClickCoordinates(int& x, int& y); ////////////////////////////////////////////////////////////////////////// /// Get if the system is ended/paused or not. diff --git a/JGE/include/JGui.h b/JGE/include/JGui.h index 8e3b000bb..931558402 100644 --- a/JGE/include/JGui.h +++ b/JGE/include/JGui.h @@ -54,6 +54,9 @@ class JGuiObject virtual bool Leaving(JButton key); // when focus is transferring away from this obj, true to go ahead virtual bool ButtonPressed(); // action button pressed, return false to ignore + // Used for mouse support so that the GUI engine can found out which Object was selected + virtual bool getTopLeft(int& top, int& left) {return false;}; + int GetId(); }; diff --git a/JGE/src/JGE.cpp b/JGE/src/JGE.cpp index a5bd47ce8..2e22562e0 100644 --- a/JGE/src/JGE.cpp +++ b/JGE/src/JGE.cpp @@ -262,9 +262,33 @@ void JGE::ResetInput() { while (!keyBuffer.empty()) keyBuffer.pop(); holds.clear(); + LeftClickedProcessed(); } +void JGE::LeftClicked(int x, int y) +{ + mLastLeftClickX = x; + mlastLeftClickY = y; +} + +void JGE::LeftClickedProcessed() +{ + mLastLeftClickX = -1; + mlastLeftClickY = -1; +} + +bool JGE::GetLeftClickCoordinates(int& x, int& y) +{ + if(mLastLeftClickX != -1 || mlastLeftClickY != -1) + { + x = mLastLeftClickX; + y = mlastLeftClickY; + return true; + } + return false; +} + JGE::JGE() { mApp = NULL; @@ -295,6 +319,7 @@ void JGE::Init() JRenderer::GetInstance(); JFileSystem::GetInstance(); JSoundSystem::GetInstance(); + LeftClickedProcessed(); } void JGE::SetDelta(float delta) diff --git a/JGE/src/JGui.cpp b/JGE/src/JGui.cpp index 7c598e300..2736dd974 100644 --- a/JGE/src/JGui.cpp +++ b/JGE/src/JGui.cpp @@ -148,6 +148,37 @@ bool JGuiController::CheckUserInput(JButton key){ } return true; } + else + { // a dude may have clicked somewhere, we're gonna select the closest object from where he clicked + int x, y; + unsigned int distance2; + unsigned int minDistance2 = -1; + int n = mCurr; + if(mEngine->GetLeftClickCoordinates(x, y)) + { + for(int i = 0; i < mCount; i++) + { + int top, left; + if(mObjects[i]->getTopLeft(top, left)) + { + distance2 = (top-y)*(top-y) + (left-x)*(left-x); + if(distance2 < minDistance2) + { + minDistance2 = distance2; + n = i; + } + } + } + + if (n != mCurr && mObjects[mCurr] != NULL && mObjects[mCurr]->Leaving(JGE_BTN_DOWN)) + { + mCurr = n; + mObjects[mCurr]->Entering(); + } + mEngine->LeftClickedProcessed(); + return true; + } + } return false; } void JGuiController::Update(float dt)