From 0aa057c8a78f2bf302d8a7d61eae2f48c32cd9bd Mon Sep 17 00:00:00 2001 From: Nomango <569629550@qq.com> Date: Tue, 7 Nov 2017 22:20:46 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BA=86=E6=89=80=E6=9C=89?= =?UTF-8?q?=E5=9B=9E=E8=B0=83=E5=87=BD=E6=95=B0=E4=B8=8D=E6=A3=80=E6=B5=8B?= =?UTF-8?q?=E7=A9=BA=E5=BC=95=E7=94=A8=E5=B0=B1=E6=89=A7=E8=A1=8C=E7=9A=84?= =?UTF-8?q?bug=EF=BC=9B=E4=BF=AE=E5=A4=8D=E4=BA=86EFont=E6=9F=90=E4=BA=9B?= =?UTF-8?q?=E6=83=85=E5=86=B5=E4=B8=8B=E5=B4=A9=E6=BA=83=E7=9A=84bug?= =?UTF-8?q?=EF=BC=9B=E4=BF=AE=E5=A4=8D=E4=BA=86EButton=E6=B2=A1=E6=9C=89?= =?UTF-8?q?=E8=8E=B7=E5=8F=96=E5=90=AF=E7=94=A8=E5=92=8C=E7=A6=81=E7=94=A8?= =?UTF-8?q?=E7=8A=B6=E6=80=81=E7=9A=84=E5=87=BD=E6=95=B0=E7=9A=84bug?= =?UTF-8?q?=EF=BC=9B=E4=BF=AE=E5=A4=8D=E4=BA=86EButton=E4=B8=8D=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E7=A6=81=E7=94=A8=E7=8A=B6=E6=80=81=E7=9A=84bug?= =?UTF-8?q?=EF=BC=9B=E6=9B=B4=E6=96=B0=E4=BA=86EButton=E7=9A=84=E7=9B=91?= =?UTF-8?q?=E5=90=AC=E6=96=B9=E6=B3=95=EF=BC=9B=E5=A2=9E=E5=8A=A0=E4=BA=86?= =?UTF-8?q?EButtonToggle=E5=BC=80=E5=85=B3=E6=8C=89=E9=92=AE=E7=B1=BB?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ConsoleDemo/main.cpp | 30 +- Easy2D/Common/EFont.cpp | 1 + Easy2D/Easy2D.vcxproj | 1 + Easy2D/Easy2D.vcxproj.filters | 3 + Easy2D/Listener/EListenerKeyboard.cpp | 11 +- Easy2D/Listener/EListenerKeyboardPress.cpp | 5 +- Easy2D/Listener/EListenerMouse.cpp | 11 +- Easy2D/Listener/EListenerMouseClick.cpp | 7 +- Easy2D/Listener/EListenerMouseDoubleClick.cpp | 7 +- Easy2D/Listener/EListenerMouseDrag.cpp | 7 +- Easy2D/Listener/EListenerMousePress.cpp | 7 +- Easy2D/Listener/EListenerPhysics.cpp | 15 +- Easy2D/Listener/EListenerPhysicsCollision.cpp | 14 +- Easy2D/Node/EButton.cpp | 206 +++++++------ Easy2D/Node/EButtonToggle.cpp | 290 ++++++++++++++++++ Easy2D/Tool/ETimer.cpp | 7 +- Easy2D/enodes.h | 190 ++++++++++-- Easy2D/etypedef.h | 12 +- 18 files changed, 665 insertions(+), 159 deletions(-) create mode 100644 Easy2D/Node/EButtonToggle.cpp diff --git a/ConsoleDemo/main.cpp b/ConsoleDemo/main.cpp index c1fe64c5..3248efa4 100644 --- a/ConsoleDemo/main.cpp +++ b/ConsoleDemo/main.cpp @@ -4,21 +4,31 @@ int main() { EApp app; - if (app.init(L"Easy2D Demo", 640, 640)) + if (app.init(L"Easy2D Demo", 640, 480)) { app.showConsole(); auto scene = new EScene(); - auto sprite = new ESprite(L"haha.png"); - // 获取窗口宽度 - float width = EApp::getWidth(); - // 获取窗口高度 - float height = EApp::getHeight(); - // 移动精灵的位置 - sprite->setPos(width / 2 + sprite->getWidth(), height / 2); - scene->add(sprite); + // 创建一个文本 + auto btnNormal = new EText(L"开"); + auto btnSelected = new EText(L"开"); + btnSelected->movePosY(2); + auto btnNormal2 = new EText(L"关"); + auto btnSelected2 = new EText(L"关"); + btnSelected2->movePosY(2); + // 创建一个按钮 + auto button = new EButtonToggle(btnNormal, btnNormal2, btnSelected, btnSelected2); + button->setCallback([=]() { + //button->setEnable(false); + }); + button->toggle(); + button->setPos(EApp::getWidth() / 2, EApp::getHeight() / 2); + scene->add(button); - scene->getRoot()->runAction(new EActionLoop(new EActionRotateBy(1, 60))); + // 创建按钮 + auto button2 = new EButton(new EText(L"关闭"), [=]() { button->setEnable(!button->isEnable()); }); + button2->setPos(40, 40); + scene->add(button2); app.enterScene(scene); diff --git a/Easy2D/Common/EFont.cpp b/Easy2D/Common/EFont.cpp index 92c2c4d9..5e56c7a2 100644 --- a/Easy2D/Common/EFont.cpp +++ b/Easy2D/Common/EFont.cpp @@ -12,6 +12,7 @@ e2d::EFont::EFont() } e2d::EFont::EFont(EString fontFamily, float fontSize /* = 22 */, UINT32 color /* = EColor::WHITE */, UINT32 fontWeight, bool italic /* = false */) + : EFont() { this->setFamily(fontFamily); this->setSize(fontSize); diff --git a/Easy2D/Easy2D.vcxproj b/Easy2D/Easy2D.vcxproj index 28fede94..0e0414bf 100644 --- a/Easy2D/Easy2D.vcxproj +++ b/Easy2D/Easy2D.vcxproj @@ -235,6 +235,7 @@ + diff --git a/Easy2D/Easy2D.vcxproj.filters b/Easy2D/Easy2D.vcxproj.filters index d012d305..30b95085 100644 --- a/Easy2D/Easy2D.vcxproj.filters +++ b/Easy2D/Easy2D.vcxproj.filters @@ -210,6 +210,9 @@ Listener + + Node + diff --git a/Easy2D/Listener/EListenerKeyboard.cpp b/Easy2D/Listener/EListenerKeyboard.cpp index cecd0989..046ba683 100644 --- a/Easy2D/Listener/EListenerKeyboard.cpp +++ b/Easy2D/Listener/EListenerKeyboard.cpp @@ -3,29 +3,34 @@ e2d::EListenerKeyboard::EListenerKeyboard() : EListener() + , m_Callback(nullptr) { } e2d::EListenerKeyboard::EListenerKeyboard(const EString & name) : EListener(name) + , m_Callback(nullptr) { } e2d::EListenerKeyboard::EListenerKeyboard(const KEY_LISTENER_CALLBACK & callback) : EListener() + , m_Callback(callback) { - m_Callback = callback; } e2d::EListenerKeyboard::EListenerKeyboard(const EString & name, const KEY_LISTENER_CALLBACK & callback) : EListener(name) + , m_Callback(callback) { - m_Callback = callback; } void e2d::EListenerKeyboard::_callOn() { - m_Callback(); + if (m_Callback) + { + m_Callback(); + } } void e2d::EListenerKeyboard::setCallback(const KEY_LISTENER_CALLBACK & callback) diff --git a/Easy2D/Listener/EListenerKeyboardPress.cpp b/Easy2D/Listener/EListenerKeyboardPress.cpp index 51c2cadf..c0454d86 100644 --- a/Easy2D/Listener/EListenerKeyboardPress.cpp +++ b/Easy2D/Listener/EListenerKeyboardPress.cpp @@ -24,6 +24,9 @@ void e2d::EListenerKeyboardPress::_callOn() { if (EKeyboardMsg::getMsg() == EKeyboardMsg::KEYBOARD_MSG::KEY_DOWN) { - m_Callback(); + if (m_Callback) + { + m_Callback(); + } } } diff --git a/Easy2D/Listener/EListenerMouse.cpp b/Easy2D/Listener/EListenerMouse.cpp index 3be322b6..12b1bb64 100644 --- a/Easy2D/Listener/EListenerMouse.cpp +++ b/Easy2D/Listener/EListenerMouse.cpp @@ -3,29 +3,34 @@ e2d::EListenerMouse::EListenerMouse() : EListener() + , m_Callback(nullptr) { } e2d::EListenerMouse::EListenerMouse(const EString & name) : EListener(name) + , m_Callback(nullptr) { } e2d::EListenerMouse::EListenerMouse(const MOUSE_LISTENER_CALLBACK & callback) : EListener() + , m_Callback(callback) { - m_Callback = callback; } e2d::EListenerMouse::EListenerMouse(const EString & name, const MOUSE_LISTENER_CALLBACK & callback) : EListener(name) + , m_Callback(callback) { - m_Callback = callback; } void e2d::EListenerMouse::_callOn() { - m_Callback(); + if (m_Callback) + { + m_Callback(); + } } void e2d::EListenerMouse::setCallback(const MOUSE_LISTENER_CALLBACK & callback) diff --git a/Easy2D/Listener/EListenerMouseClick.cpp b/Easy2D/Listener/EListenerMouseClick.cpp index cc131f42..dff2e8d0 100644 --- a/Easy2D/Listener/EListenerMouseClick.cpp +++ b/Easy2D/Listener/EListenerMouseClick.cpp @@ -3,12 +3,14 @@ e2d::EListenerMouseClick::EListenerMouseClick() : EListenerMouse() , m_bPressed(false) + , m_Callback(nullptr) { } e2d::EListenerMouseClick::EListenerMouseClick(const EString & name) : EListenerMouse(name) , m_bPressed(false) + , m_Callback(nullptr) { } @@ -35,7 +37,10 @@ void e2d::EListenerMouseClick::_callOn() } else if (m_bPressed && EMouseMsg::getMsg() == EMouseMsg::LBUTTON_UP) { - m_Callback(EMouseMsg::getPos()); + if (m_Callback) + { + m_Callback(EMouseMsg::getPos()); + } m_bPressed = false; } } diff --git a/Easy2D/Listener/EListenerMouseDoubleClick.cpp b/Easy2D/Listener/EListenerMouseDoubleClick.cpp index f4274b40..045d5dfe 100644 --- a/Easy2D/Listener/EListenerMouseDoubleClick.cpp +++ b/Easy2D/Listener/EListenerMouseDoubleClick.cpp @@ -3,12 +3,14 @@ e2d::EListenerMouseDoubleClick::EListenerMouseDoubleClick() : EListenerMouse() , m_bPressed(false) + , m_Callback(nullptr) { } e2d::EListenerMouseDoubleClick::EListenerMouseDoubleClick(const EString & name) : EListenerMouse(name) , m_bPressed(false) + , m_Callback(nullptr) { } @@ -38,7 +40,10 @@ void e2d::EListenerMouseDoubleClick::_callOn() } else if (m_bPressed && EMouseMsg::getMsg() == EMouseMsg::LBUTTON_UP) { - m_Callback(EMouseMsg::getPos()); + if (m_Callback) + { + m_Callback(EMouseMsg::getPos()); + } m_bPressed = false; } } diff --git a/Easy2D/Listener/EListenerMouseDrag.cpp b/Easy2D/Listener/EListenerMouseDrag.cpp index 38c1ac6d..1f2d1d99 100644 --- a/Easy2D/Listener/EListenerMouseDrag.cpp +++ b/Easy2D/Listener/EListenerMouseDrag.cpp @@ -2,11 +2,13 @@ e2d::EListenerMouseDrag::EListenerMouseDrag() : EListenerMouse() + , m_Callback(nullptr) { } e2d::EListenerMouseDrag::EListenerMouseDrag(const EString & name) : EListenerMouse(name) + , m_Callback(nullptr) { } @@ -31,7 +33,10 @@ void e2d::EListenerMouseDrag::_callOn() } else if (EMouseMsg::isLButtonDown() && EMouseMsg::getMsg() == EMouseMsg::MOVE) { - m_Callback(m_Begin, EMouseMsg::getPos()); + if (m_Callback) + { + m_Callback(m_Begin, EMouseMsg::getPos()); + } } } diff --git a/Easy2D/Listener/EListenerMousePress.cpp b/Easy2D/Listener/EListenerMousePress.cpp index 0761262e..9dbe6b94 100644 --- a/Easy2D/Listener/EListenerMousePress.cpp +++ b/Easy2D/Listener/EListenerMousePress.cpp @@ -2,11 +2,13 @@ e2d::EListenerMousePress::EListenerMousePress() : EListenerMouse() + , m_Callback(nullptr) { } e2d::EListenerMousePress::EListenerMousePress(const EString & name) : EListenerMouse(name) + , m_Callback(nullptr) { } @@ -27,7 +29,10 @@ void e2d::EListenerMousePress::_callOn() if (EMouseMsg::getMsg() == EMouseMsg::LBUTTON_DOWN || EMouseMsg::getMsg() == EMouseMsg::LBUTTON_DBLCLK) { - m_Callback(EMouseMsg::getPos()); + if (m_Callback) + { + m_Callback(EMouseMsg::getPos()); + } } } diff --git a/Easy2D/Listener/EListenerPhysics.cpp b/Easy2D/Listener/EListenerPhysics.cpp index 7929b8e3..e69c1eb0 100644 --- a/Easy2D/Listener/EListenerPhysics.cpp +++ b/Easy2D/Listener/EListenerPhysics.cpp @@ -4,33 +4,34 @@ e2d::EListenerPhysics::EListenerPhysics() : EListener() + , m_Callback(nullptr) { } e2d::EListenerPhysics::EListenerPhysics(const EString & name) : EListener(name) + , m_Callback(nullptr) { } e2d::EListenerPhysics::EListenerPhysics(const PHYSICS_LISTENER_CALLBACK & callback) : EListener() + , m_Callback(callback) { - m_Callback = callback; } e2d::EListenerPhysics::EListenerPhysics(const EString & name, const PHYSICS_LISTENER_CALLBACK & callback) : EListener(name) + , m_Callback(callback) { - m_Callback = callback; } void e2d::EListenerPhysics::_callOn() { - m_Callback( - EPhysicsMsg::getActiveGeometry()->getParentNode(), - EPhysicsMsg::getPassiveGeometry()->getParentNode(), - EPhysicsMsg::getMsg() - ); + if (m_Callback) + { + m_Callback(); + } } void e2d::EListenerPhysics::setCallback(const PHYSICS_LISTENER_CALLBACK & callback) diff --git a/Easy2D/Listener/EListenerPhysicsCollision.cpp b/Easy2D/Listener/EListenerPhysicsCollision.cpp index 0b8511d4..808f81a0 100644 --- a/Easy2D/Listener/EListenerPhysicsCollision.cpp +++ b/Easy2D/Listener/EListenerPhysicsCollision.cpp @@ -3,24 +3,26 @@ e2d::EListenerPhysicsCollision::EListenerPhysicsCollision() : EListenerPhysics() + , m_Callback(nullptr) { } e2d::EListenerPhysicsCollision::EListenerPhysicsCollision(const EString & name) : EListenerPhysics(name) + , m_Callback(nullptr) { } e2d::EListenerPhysicsCollision::EListenerPhysicsCollision(const COLLISION_LISTENER_CALLBACK & callback) : EListenerPhysics() + , m_Callback(callback) { - this->m_Callback = callback; } e2d::EListenerPhysicsCollision::EListenerPhysicsCollision(const EString & name, const COLLISION_LISTENER_CALLBACK & callback) : EListenerPhysics(name) + , m_Callback(callback) { - this->m_Callback = callback; } void e2d::EListenerPhysicsCollision::_callOn() @@ -29,9 +31,9 @@ void e2d::EListenerPhysicsCollision::_callOn() EPhysicsMsg::getMsg() == EPhysicsMsg::CONTAINS || EPhysicsMsg::getMsg() == EPhysicsMsg::IS_CONTAINED) { - m_Callback( - EPhysicsMsg::getActiveGeometry()->getParentNode(), - EPhysicsMsg::getPassiveGeometry()->getParentNode() - ); + if (m_Callback) + { + m_Callback(); + } } } diff --git a/Easy2D/Node/EButton.cpp b/Easy2D/Node/EButton.cpp index 2ca40d18..c605bcdb 100644 --- a/Easy2D/Node/EButton.cpp +++ b/Easy2D/Node/EButton.cpp @@ -4,15 +4,15 @@ #include "..\Win\winbase.h" e2d::EButton::EButton() - : m_Callback([] {}) + : m_Callback((const BUTTON_CLICK_CALLBACK &)nullptr) , m_eStatus(STATUS::NORMAL) - , m_bIsDisable(false) + , m_bEnable(true) , m_bIsSelected(false) , m_pNormal(nullptr) , m_pMouseover(nullptr) , m_pSelected(nullptr) , m_pDisabled(nullptr) - , m_pDisplayed(nullptr) + , m_pListener(nullptr) { } @@ -50,174 +50,206 @@ e2d::EButton::EButton(ENode * normal, ENode * mouseover, ENode * selected, ENode this->setCallback(callback); } +bool e2d::EButton::isEnable() const +{ + return m_bEnable; +} + void e2d::EButton::setNormal(ENode * normal) { - if (normal) + if (normal != m_pNormal) { + // 移除旧的 if (m_pNormal) { this->removeChild(m_pNormal); } + // 添加新的 + if (normal) + { + this->addChild(normal); + } m_pNormal = normal; - this->addChild(m_pNormal); + _updateVisiable(); } } void e2d::EButton::setMouseOver(ENode * mouseover) { - if (mouseover) + if (mouseover != m_pNormal) { + // 移除旧的 if (m_pMouseover) { this->removeChild(m_pMouseover); } + // 添加新的 + if (mouseover) + { + this->addChild(mouseover); + } m_pMouseover = mouseover; - this->addChild(m_pMouseover); + _updateVisiable(); } } void e2d::EButton::setSelected(ENode * selected) { - if (selected) + if (selected != m_pNormal) { + // 移除旧的 if (m_pSelected) { this->removeChild(m_pSelected); } + // 添加新的 + if (selected) + { + this->addChild(selected); + } m_pSelected = selected; - this->addChild(m_pSelected); + _updateVisiable(); } } void e2d::EButton::setDisabled(ENode * disabled) { - if (disabled) + if (disabled != m_pNormal) { + // 移除旧的 if (m_pDisabled) { this->removeChild(m_pDisabled); } + // 添加新的 + if (disabled) + { + this->addChild(disabled); + } m_pDisabled = disabled; - this->addChild(m_pDisabled); + _updateVisiable(); } } -void e2d::EButton::setDisable(bool disable) +void e2d::EButton::setEnable(bool bEnable) { - m_bIsDisable = disable; + if (m_bEnable != bEnable) + { + m_bEnable = bEnable; + _updateStatus(); + } } void e2d::EButton::setCallback(const BUTTON_CLICK_CALLBACK & callback) { + WARN_IF(m_pNormal == nullptr, "EButton cannot work without something to show. Please set its normal displayed."); + m_Callback = callback; - // 停止其他监听器 - EMsgManager::stopAllMouseListenersBindedWith(this); - // 新建一个监听器 - auto listener = new EListenerMouse(std::bind(&EButton::_listenerCallback, this)); - listener->setAlwaysWorking(true); - EMsgManager::bindListener(listener, this); + if (m_pListener == nullptr) + { + m_pListener = new EListenerMouse(std::bind(&EButton::_updateStatus, this)); + m_pListener->setAlwaysWorking(true); + EMsgManager::bindListener(m_pListener, this); + } } -void e2d::EButton::_callOn() +void e2d::EButton::_setStatus(STATUS status) { - if (!m_bVisiable) + if (m_eStatus != status) { - return; + m_eStatus = status; + _updateVisiable(); } +} - if (m_bTransformChildrenNeeded) +void e2d::EButton::_updateVisiable() +{ + if (m_pNormal) m_pNormal->setVisiable(false); + if (m_pMouseover) m_pMouseover->setVisiable(false); + if (m_pSelected) m_pSelected->setVisiable(false); + if (m_pDisabled) m_pDisabled->setVisiable(false); + + if (m_bEnable) { - _updateTransform(this); - } - - if (!m_vChildren.empty()) - { - GetRenderTarget()->SetTransform(m_Matri); - - if (m_eStatus == STATUS::DISABLED && m_pDisabled) + if (m_eStatus == STATUS::SELECTED && m_pSelected) { - m_pDisabled->_callOn(); - } - else if (m_eStatus == STATUS::SELECTED && m_pSelected) - { - m_pSelected->_callOn(); + m_pSelected->setVisiable(true); } else if (m_eStatus == STATUS::MOUSEOVER && m_pMouseover) { - m_pMouseover->_callOn(); + m_pMouseover->setVisiable(true); } - else if (m_pNormal) + else { - m_pNormal->_callOn(); + if (m_pNormal) m_pNormal->setVisiable(true); + } + } + else + { + if (m_pDisabled) + { + m_pDisabled->setVisiable(true); + } + else + { + if (m_pNormal) m_pNormal->setVisiable(true); } } } -void e2d::EButton::_listenerCallback() +void e2d::EButton::_updateStatus() { - if (!m_bIsDisable) + if (m_bEnable && m_pNormal) { - if (!m_pDisplayed) - { - m_pDisplayed = m_pNormal; - } + ENode * pMouseover = m_pMouseover ? m_pMouseover : m_pNormal; + ENode * pSelected = m_pSelected ? m_pSelected : m_pNormal; - if (EMouseMsg::getMsg() == EMouseMsg::LBUTTON_DOWN && - m_pDisplayed && - m_pDisplayed->isPointIn(EMouseMsg::getPos())) - { - // 鼠标左键按下,且位于按钮内时,标记 m_bIsSelected 为 true - m_bIsSelected = true; - } - else if (EMouseMsg::getMsg() == EMouseMsg::LBUTTON_UP) + if (EMouseMsg::getMsg() == EMouseMsg::LBUTTON_UP) { // 鼠标左键抬起时,判断鼠标坐标是否在按钮内部 - if (m_bIsSelected && - m_pDisplayed && - m_pDisplayed->isPointIn(EMouseMsg::getPos())) + if (m_bIsSelected && + pSelected->isPointIn(EMouseMsg::getPos())) { - m_Callback(); - m_eStatus = STATUS::NORMAL; - m_pDisplayed = m_pNormal; + _runCallback(); } // 标记 m_bIsSelected 为 false m_bIsSelected = false; } - if (EMouseMsg::isLButtonDown() && - m_bIsSelected && - m_pSelected && - m_pSelected->isPointIn(EMouseMsg::getPos())) + if (EMouseMsg::getMsg() == EMouseMsg::LBUTTON_DOWN) { - // 鼠标左键按下,且按钮是被选中的状态,且鼠标 - // 在按钮内时,按钮状态变为 SELECTED - m_eStatus = STATUS::SELECTED; - m_pDisplayed = m_pSelected; + if (pMouseover->isPointIn(EMouseMsg::getPos())) + { + // 鼠标左键按下,且位于按钮内时,标记 m_bIsSelected 为 true + m_bIsSelected = true; + _setStatus(STATUS::SELECTED); + return; + } } - else if (EMouseMsg::getMsg() == EMouseMsg::MOVE && - m_pDisplayed && - m_pDisplayed->isPointIn(EMouseMsg::getPos()) && - m_pMouseover) + + if (m_bIsSelected && EMouseMsg::isLButtonDown()) { - m_eStatus = STATUS::MOUSEOVER; - m_pDisplayed = m_pMouseover; + if (pSelected->isPointIn(EMouseMsg::getPos())) + { + _setStatus(STATUS::SELECTED); + return; + } } - else + else if (m_pNormal->isPointIn(EMouseMsg::getPos())) { - m_eStatus = STATUS::NORMAL; - m_pDisplayed = m_pNormal; - } - } - else - { - if (m_pDisplayed) - { - m_eStatus = STATUS::DISABLED; - } - else - { - m_eStatus = STATUS::NORMAL; + _setStatus(STATUS::MOUSEOVER); + return; } + + _setStatus(STATUS::NORMAL); + } +} + +void e2d::EButton::_runCallback() +{ + if (m_Callback) + { + m_Callback(); } } diff --git a/Easy2D/Node/EButtonToggle.cpp b/Easy2D/Node/EButtonToggle.cpp new file mode 100644 index 00000000..ff5c029d --- /dev/null +++ b/Easy2D/Node/EButtonToggle.cpp @@ -0,0 +1,290 @@ +#include "..\enodes.h" +#include "..\elisteners.h" +#include "..\emanagers.h" +#include "..\Win\winbase.h" + +e2d::EButtonToggle::EButtonToggle() + : EButton() + , m_bToggle(true) + , m_pNormalOn(nullptr) + , m_pMouseoverOn(nullptr) + , m_pSelectedOn(nullptr) + , m_pDisabledOn(nullptr) + , m_pNormalOff(nullptr) + , m_pMouseoverOff(nullptr) + , m_pSelectedOff(nullptr) + , m_pDisabledOff(nullptr) +{ +} + +e2d::EButtonToggle::EButtonToggle(ENode * toggleOnNormal, ENode * toggleOffNormal, const BUTTON_CLICK_CALLBACK & callback) + : EButtonToggle() +{ + this->setNormal(toggleOnNormal); + this->setNormalOff(toggleOffNormal); + this->setCallback(callback); +} + +e2d::EButtonToggle::EButtonToggle(ENode * toggleOnNormal, ENode * toggleOffNormal, ENode * toggleOnSelected, ENode * toggleOffSelected, const BUTTON_CLICK_CALLBACK & callback) + : EButtonToggle() +{ + this->setNormal(toggleOnNormal); + this->setNormalOff(toggleOffNormal); + this->setSelected(toggleOnSelected); + this->setSelectedOff(toggleOffSelected); + this->setCallback(callback); +} + +e2d::EButtonToggle::EButtonToggle(ENode * toggleOnNormal, ENode * toggleOffNormal, ENode * toggleOnMouseOver, ENode * toggleOffMouseOver, ENode * toggleOnSelected, ENode * toggleOffSelected, const BUTTON_CLICK_CALLBACK & callback) + : EButtonToggle() +{ + this->setNormal(toggleOnNormal); + this->setNormalOff(toggleOffNormal); + this->setMouseOver(toggleOnMouseOver); + this->setMouseOverOff(toggleOffMouseOver); + this->setSelected(toggleOnSelected); + this->setSelectedOff(toggleOffSelected); + this->setCallback(callback); +} + +e2d::EButtonToggle::EButtonToggle(ENode * toggleOnNormal, ENode * toggleOffNormal, ENode * toggleOnMouseOver, ENode * toggleOffMouseOver, ENode * toggleOnSelected, ENode * toggleOffSelected, ENode * toggleOnDisabled, ENode * toggleOffDisabled, const BUTTON_CLICK_CALLBACK & callback) + : EButtonToggle() +{ + this->setNormal(toggleOnNormal); + this->setNormalOff(toggleOffNormal); + this->setMouseOver(toggleOnMouseOver); + this->setMouseOverOff(toggleOffMouseOver); + this->setSelected(toggleOnSelected); + this->setSelectedOff(toggleOffSelected); + this->setDisabled(toggleOnDisabled); + this->setDisabledOff(toggleOffDisabled); + this->setCallback(callback); +} + +void e2d::EButtonToggle::toggle() +{ + m_bToggle = !m_bToggle; + _updateToggle(); + _updateVisiable(); +} + +bool e2d::EButtonToggle::isToggleOn() const +{ + return m_bToggle; +} + +void e2d::EButtonToggle::setToggle(bool toggle) +{ + if (m_bToggle != toggle) + { + m_bToggle = toggle; + _updateToggle(); + } +} + +void e2d::EButtonToggle::setNormal(ENode * normal) +{ + if (normal != m_pNormalOn) + { + // 移除旧的 + if (m_pNormalOn) + { + this->removeChild(m_pNormalOn); + } + // 添加新的 + if (normal) + { + this->addChild(normal); + } + m_pNormalOn = normal; + + _updateToggle(); + _updateVisiable(); + } +} + +void e2d::EButtonToggle::setMouseOver(ENode * mouseover) +{ + if (mouseover != m_pMouseoverOn) + { + // 移除旧的 + if (m_pMouseoverOn) + { + this->removeChild(m_pMouseoverOn); + } + // 添加新的 + if (mouseover) + { + this->addChild(mouseover); + } + m_pMouseoverOn = mouseover; + + _updateToggle(); + _updateVisiable(); + } +} + +void e2d::EButtonToggle::setSelected(ENode * selected) +{ + if (selected != m_pSelectedOn) + { + // 移除旧的 + if (m_pSelectedOn) + { + this->removeChild(m_pSelectedOn); + } + // 添加新的 + if (selected) + { + this->addChild(selected); + } + m_pSelectedOn = selected; + + _updateToggle(); + _updateVisiable(); + } +} + +void e2d::EButtonToggle::setDisabled(ENode * disabled) +{ + if (disabled != m_pDisabledOn) + { + // 移除旧的 + if (m_pDisabledOn) + { + this->removeChild(m_pDisabledOn); + } + // 添加新的 + if (disabled) + { + this->addChild(disabled); + } + m_pDisabledOn = disabled; + + _updateToggle(); + _updateVisiable(); + } +} + +void e2d::EButtonToggle::setNormalOff(ENode * normal) +{ + if (normal != m_pNormalOff) + { + // 移除旧的 + if (m_pNormalOff) + { + this->removeChild(m_pNormalOff); + } + // 添加新的 + if (normal) + { + this->addChild(normal); + } + m_pNormalOff = normal; + + _updateToggle(); + _updateVisiable(); + } +} + +void e2d::EButtonToggle::setMouseOverOff(ENode * mouseover) +{ + if (mouseover != m_pMouseoverOff) + { + // 移除旧的 + if (m_pMouseoverOff) + { + this->removeChild(m_pMouseoverOff); + } + // 添加新的 + if (mouseover) + { + this->addChild(mouseover); + } + m_pMouseoverOff = mouseover; + + _updateToggle(); + _updateVisiable(); + } +} + +void e2d::EButtonToggle::setSelectedOff(ENode * selected) +{ + if (selected != m_pSelectedOff) + { + // 移除旧的 + if (m_pSelectedOff) + { + this->removeChild(m_pSelectedOff); + } + // 添加新的 + if (selected) + { + this->addChild(selected); + } + m_pSelectedOff = selected; + + _updateToggle(); + _updateVisiable(); + } +} + +void e2d::EButtonToggle::setDisabledOff(ENode * disabled) +{ + if (disabled != m_pDisabledOff) + { + // 移除旧的 + if (m_pDisabledOff) + { + this->removeChild(m_pDisabledOff); + } + // 添加新的 + if (disabled) + { + this->addChild(disabled); + } + m_pDisabledOff = disabled; + + _updateToggle(); + _updateVisiable(); + } +} + +void e2d::EButtonToggle::_updateToggle() +{ + if (m_bToggle) + { + m_pNormal = m_pNormalOn; + m_pMouseover = m_pMouseoverOn; + m_pSelected = m_pSelectedOn; + m_pDisabled = m_pDisabledOn; + + if (m_pNormalOff) m_pNormalOff->setVisiable(false); + if (m_pMouseoverOff) m_pMouseoverOff->setVisiable(false); + if (m_pSelectedOff) m_pSelectedOff->setVisiable(false); + if (m_pDisabledOff) m_pDisabledOff->setVisiable(false); + } + else + { + m_pNormal = m_pNormalOff; + m_pMouseover = m_pMouseoverOff; + m_pSelected = m_pSelectedOff; + m_pDisabled = m_pDisabledOff; + + if (m_pNormalOn) m_pNormalOn->setVisiable(false); + if (m_pMouseoverOn) m_pMouseoverOn->setVisiable(false); + if (m_pSelectedOn) m_pSelectedOn->setVisiable(false); + if (m_pDisabledOn) m_pDisabledOn->setVisiable(false); + } +} + +void e2d::EButtonToggle::_runCallback() +{ + m_bToggle = !m_bToggle; + _updateToggle(); + + if (m_Callback) + { + m_Callback(); + } +} diff --git a/Easy2D/Tool/ETimer.cpp b/Easy2D/Tool/ETimer.cpp index 187b2509..7042dcd2 100644 --- a/Easy2D/Tool/ETimer.cpp +++ b/Easy2D/Tool/ETimer.cpp @@ -6,7 +6,7 @@ e2d::ETimer::ETimer() : m_bRunning(false) , m_nRunTimes(0) , m_pParentNode(nullptr) - , m_Callback([](int) {}) + , m_Callback(nullptr) , m_nInterval(0) , m_nRepeatTimes(0) , m_bAtOnce(false) @@ -96,7 +96,10 @@ void e2d::ETimer::_callOn() return; } - m_Callback(m_nRunTimes); + if (m_Callback) + { + m_Callback(m_nRunTimes); + } m_nRunTimes++; } diff --git a/Easy2D/enodes.h b/Easy2D/enodes.h index 0fe9cb64..2e92426c 100644 --- a/Easy2D/enodes.h +++ b/Easy2D/enodes.h @@ -8,6 +8,7 @@ class EText; class ESprite; class EAction; class EButton; +class EButtonToggle; class EGeometry; class ENode : @@ -15,6 +16,7 @@ class ENode : { friend EScene; friend EButton; + friend EButtonToggle; friend EGeometry; public: @@ -661,82 +663,210 @@ public: // 创建按钮 EButton( - ENode * normal, - const BUTTON_CLICK_CALLBACK & callback + ENode * normal, /* 普通状态 */ + const BUTTON_CLICK_CALLBACK & callback = nullptr ); // 创建按钮 EButton( - ENode * normal, - ENode * selected, - const BUTTON_CLICK_CALLBACK & callback + ENode * normal, /* 普通状态 */ + ENode * selected, /* 鼠标按下状态 */ + const BUTTON_CLICK_CALLBACK & callback = nullptr ); // 创建按钮 EButton( - ENode * normal, - ENode * mouseover, - ENode * selected, - const BUTTON_CLICK_CALLBACK & callback + ENode * normal, /* 普通状态 */ + ENode * mouseover, /* 鼠标移入状态 */ + ENode * selected, /* 鼠标按下状态 */ + const BUTTON_CLICK_CALLBACK & callback = nullptr ); // 创建按钮 EButton( - ENode * normal, - ENode * mouseover, - ENode * selected, - ENode * disabled, - const BUTTON_CLICK_CALLBACK & callback + ENode * normal, /* 普通状态 */ + ENode * mouseover, /* 鼠标移入状态 */ + ENode * selected, /* 鼠标移入状态 */ + ENode * disabled, /* 按钮禁用状态 */ + const BUTTON_CLICK_CALLBACK & callback = nullptr + ); + + // 获取按钮状态是启用还是禁用 + bool isEnable() const; + + // 设置按钮启用或禁用 + void setEnable( + bool bEnable ); // 设置一般情况下显示的按钮 - void setNormal( + virtual void setNormal( ENode * normal ); // 设置鼠标移入按钮时显示的按钮 - void setMouseOver( + virtual void setMouseOver( ENode * mouseover ); // 设置鼠标选中按钮时显示的按钮 - void setSelected( + virtual void setSelected( ENode * selected ); // 设置按钮被禁用时显示的按钮 - void setDisabled( + virtual void setDisabled( ENode * disabled ); - // 设置按钮禁用 - void setDisable( - bool disable - ); - // 设置回调函数 void setCallback( const BUTTON_CLICK_CALLBACK & callback ); protected: - // 渲染按钮 - virtual void _callOn() override; + enum STATUS { NORMAL, MOUSEOVER, SELECTED }; - // 鼠标消息监听 - void _listenerCallback(); + // 设置按钮状态 + virtual void _setStatus(STATUS status); + + // 刷新按钮显示 + virtual void _updateVisiable(); + + // 刷新按钮状态 + virtual void _updateStatus(); + + // 执行按钮回调函数 + virtual void _runCallback(); protected: - enum STATUS { NORMAL, MOUSEOVER, SELECTED, DISABLED }; STATUS m_eStatus; ENode * m_pNormal; ENode * m_pMouseover; ENode * m_pSelected; ENode * m_pDisabled; - ENode * m_pDisplayed; - bool m_bIsDisable; + bool m_bEnable; bool m_bIsSelected; + EListenerMouse * m_pListener; BUTTON_CLICK_CALLBACK m_Callback; }; + +class EButtonToggle : + public EButton +{ +public: + // 创建一个空的开关按钮 + EButtonToggle(); + + // 创建开关按钮 + EButtonToggle( + ENode * toggleOnNormal, + ENode * toggleOffNormal, + const BUTTON_CLICK_CALLBACK & callback = nullptr + ); + + // 创建开关按钮 + EButtonToggle( + ENode * toggleOnNormal, + ENode * toggleOffNormal, + ENode * toggleOnSelected, + ENode * toggleOffSelected, + const BUTTON_CLICK_CALLBACK & callback = nullptr + ); + + // 创建开关按钮 + EButtonToggle( + ENode * toggleOnNormal, + ENode * toggleOffNormal, + ENode * toggleOnMouseOver, + ENode * toggleOffMouseOver, + ENode * toggleOnSelected, + ENode * toggleOffSelected, + const BUTTON_CLICK_CALLBACK & callback = nullptr + ); + + // 创建开关按钮 + EButtonToggle( + ENode * toggleOnNormal, + ENode * toggleOffNormal, + ENode * toggleOnMouseOver, + ENode * toggleOffMouseOver, + ENode * toggleOnSelected, + ENode * toggleOffSelected, + ENode * toggleOnDisabled, + ENode * toggleOffDisabled, + const BUTTON_CLICK_CALLBACK & callback = nullptr + ); + + // 切换开关状态 + void toggle(); + + // 获取开关状态 + bool isToggleOn() const; + + // 打开或关闭开关 + void setToggle( + bool toggle + ); + + // 设置按钮打开状态下显示的按钮 + virtual void setNormal( + ENode * normal + ) override; + + // 设置按钮打开状态下,鼠标移入按钮时显示的按钮 + virtual void setMouseOver( + ENode * mouseover + ) override; + + // 设置按钮打开状态下,鼠标选中按钮时显示的按钮 + virtual void setSelected( + ENode * selected + ) override; + + // 设置按钮打开状态下,被禁用时显示的按钮 + virtual void setDisabled( + ENode * disabled + ) override; + + // 设置按钮关闭状态下显示的按钮 + void setNormalOff( + ENode * normal + ); + + // 设置按钮关闭状态下,鼠标移入按钮时显示的按钮 + void setMouseOverOff( + ENode * mouseover + ); + + // 设置按钮关闭状态下,鼠标选中按钮时显示的按钮 + void setSelectedOff( + ENode * selected + ); + + // 设置按钮关闭状态下,按钮被禁用时显示的按钮 + void setDisabledOff( + ENode * disabled + ); + +protected: + // 刷新按钮开关 + virtual void _updateToggle(); + + // 执行按钮回调函数 + virtual void _runCallback() override; + +protected: + ENode * m_pNormalOn; + ENode * m_pNormalOff; + ENode * m_pMouseoverOn; + ENode * m_pMouseoverOff; + ENode * m_pSelectedOn; + ENode * m_pSelectedOff; + ENode * m_pDisabledOn; + ENode * m_pDisabledOff; + bool m_bToggle; +}; + } \ No newline at end of file diff --git a/Easy2D/etypedef.h b/Easy2D/etypedef.h index 9e273ed9..c32af2bc 100644 --- a/Easy2D/etypedef.h +++ b/Easy2D/etypedef.h @@ -132,18 +132,18 @@ typedef std::function MOUSE_LISTENER_CALLBACK; typedef std::function MOUSE_CLICK_LISTENER_CALLBACK; // 鼠标按下消息监听回调函数(参数为按下位置) -typedef MOUSE_CLICK_LISTENER_CALLBACK MOUSE_PRESS_LISTENER_CALLBACK; +typedef MOUSE_CLICK_LISTENER_CALLBACK MOUSE_PRESS_LISTENER_CALLBACK; // 鼠标双击消息监听回调函数(参数为双击位置) -typedef MOUSE_CLICK_LISTENER_CALLBACK MOUSE_DBLCLK_LISTENER_CALLBACK; +typedef MOUSE_CLICK_LISTENER_CALLBACK MOUSE_DBLCLK_LISTENER_CALLBACK; // 鼠标拖动消息监听回调函数(参数为拖动前位置和拖动后位置) typedef std::function MOUSE_DRAG_LISTENER_CALLBACK; -// 物理世界消息监听器回调函数(参数:主动方、被动方、两方关系) -typedef std::function PHYSICS_LISTENER_CALLBACK; +// 物理世界消息监听器回调函数 +typedef std::function PHYSICS_LISTENER_CALLBACK; -// 碰撞消息监听器回调函数(参数:主动方、被动方) -typedef std::function COLLISION_LISTENER_CALLBACK; +// 碰撞消息监听器回调函数 +typedef PHYSICS_LISTENER_CALLBACK COLLISION_LISTENER_CALLBACK; } \ No newline at end of file