Magic_Game/Easy2D/v1/Node/MouseNode.cpp

175 lines
2.8 KiB
C++
Raw Normal View History

2017-10-13 11:45:20 +08:00
#include "..\easy2d.h"
MouseNode::MouseNode() :
m_bBlock(true),
m_bTarget(false),
m_ClickCallback([]() {}),
m_OnMouseInCallback([]() {}),
m_OnMouseOutCallback([]() {}),
m_OnSelectCallback([]() {}),
m_OnUnselectCallback([]() {})
{
}
MouseNode::~MouseNode()
{
}
bool MouseNode::_exec(bool active)
{
// <20><> display <20><><EFBFBD><EFBFBD>Ϊ false<73><65><EFBFBD>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD>
if (!m_bDisplay)
{
return false;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD>ý<EFBFBD><C3BD><EFBFBD><E3A3AC><EFBFBD>ð<EFBFBD>ť<EFBFBD><C5A5><EFBFBD>Բ<EFBFBD><D4B2>˳<EFBFBD>
if (!active)
{
reset();
return false;
}
// <20>жϽڵ㵱ǰ<E3B5B1><C7B0>״̬
// <20><><EFBFBD>ڵ<EFBFBD>δȡ<CEB4>ý<EFBFBD><C3BD><EFBFBD><E3A3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϽڵ<CFBD>״̬
if (!m_bTarget)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD>ڽڵ<DABD><DAB5><EFBFBD><EFBFBD>ڵľ<DAB5><C4BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (_isMouseIn())
{
// ״̬<D7B4><CCAC>Ϊ MOUSEIN
_setStatus(MOUSEIN);
// <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (MouseMsg::getMsg() == MouseMsg::LBUTTON_DOWN)
{
m_bTarget = true; // ȡ<>ý<EFBFBD><C3BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
_setStatus(SELECTED); // ״̬<D7B4><CCAC>Ϊ SELECTED
}
// <20><><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>ȡ<EFBFBD>û<EFBFBD><C3BB><EFBFBD><E6BDB9>
if (m_bBlock) return true;
}
else
{
reset(); // <20>ָ<EFBFBD>Ĭ<EFBFBD><C4AC>״̬
}
}
else
{
// <20>ڵ<EFBFBD>ȡ<EFBFBD>ý<EFBFBD><C3BD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̧<EFBFBD><CCA7>
if (MouseMsg::getMsg() == MouseMsg::LBUTTON_UP)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̧<EFBFBD><CCA7>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڽڵ<DABD><DAB5><EFBFBD>
if (_isMouseIn())
{
m_ClickCallback(); // ִ<>лص<D0BB><D8B5><EFBFBD><EFBFBD><EFBFBD>
}
reset(); // <20>ָ<EFBFBD>Ĭ<EFBFBD><C4AC>״̬
}
// <20><><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>ȡ<EFBFBD>û<EFBFBD><C3BB><EFBFBD><E6BDB9>
if (m_bBlock) return true;
}
return false;
}
void MouseNode::_onDraw()
{
// <20>ڵ<EFBFBD><DAB5>Ƿ<EFBFBD><C7B7><EFBFBD>ʾ
if (!m_bDisplay)
{
return;
}
// <20>ڵ<EFBFBD><DAB5>Ƿ<EFBFBD><C7B7><EFBFBD>ѡ<EFBFBD><D1A1>
if (m_eStatus == SELECTED)
{
_onSelected();
}
else
{
// <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7>ڽڵ<DABD><DAB5><EFBFBD>
if (m_eStatus == MOUSEIN)
{
_onMouseIn();
}
else
{
_onNormal();
}
}
}
bool MouseNode::_isMouseIn()
{
return isPointIn(MouseMsg::getPos());
}
void MouseNode::_setStatus(Status status)
{
if (m_eStatus != status)
{
// <20>˳<EFBFBD>ij<EFBFBD><C4B3>״̬<D7B4>Ļص<C4BB><D8B5><EFBFBD><EFBFBD><EFBFBD>
if (m_eStatus == MOUSEIN)
{
m_OnMouseOutCallback();
}
else if (m_eStatus == SELECTED)
{
m_OnUnselectCallback();
}
// <20><><EFBFBD><EFBFBD>ij<EFBFBD><C4B3>״̬<D7B4>Ļص<C4BB><D8B5><EFBFBD><EFBFBD><EFBFBD>
if (status == MOUSEIN)
{
m_OnMouseInCallback();
}
else if (status == SELECTED)
{
m_OnSelectCallback();
}
m_eStatus = status;
}
}
bool MouseNode::isMouseIn()
{
return m_eStatus == MOUSEIN || m_eStatus == SELECTED;
}
bool MouseNode::isSelected()
{
return m_eStatus == SELECTED;
}
void MouseNode::setClickedCallback(const CLICK_CALLBACK & callback)
{
m_ClickCallback = callback;
}
void MouseNode::setMouseInCallback(const CLICK_CALLBACK & callback)
{
m_OnMouseInCallback = callback;
}
void MouseNode::setMouseOutCallback(const CLICK_CALLBACK & callback)
{
m_OnMouseOutCallback = callback;
}
void MouseNode::setSelectCallback(const CLICK_CALLBACK & callback)
{
m_OnSelectCallback = callback;
}
void MouseNode::setUnselectCallback(const CLICK_CALLBACK & callback)
{
m_OnUnselectCallback = callback;
}
void MouseNode::reset()
{
m_bTarget = false; // ʧȥ<CAA7><C8A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
_setStatus(NORMAL); // <20>ָ<EFBFBD>Ĭ<EFBFBD><C4AC>״̬
}
void MouseNode::setBlock(bool block)
{
m_bBlock = block;
}