From 1d5f3c7e556b6c48a49e72b8a7606c812e6b8b00 Mon Sep 17 00:00:00 2001 From: Nomango <569629550@qq.com> Date: Fri, 3 Nov 2017 12:51:01 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=BA=86=E7=9B=91=E5=90=AC?= =?UTF-8?q?=E5=99=A8=E7=9A=84=E5=91=BD=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ConsoleDemo/ConsoleDemo.vcxproj | 6 ++ ConsoleDemo/DeclareDPIAware.manifest | 7 ++ ConsoleDemo/elyse.png | Bin 0 -> 97633 bytes ConsoleDemo/main.cpp | 56 ++++------ ConsoleDemo/test.png | Bin 0 -> 21833 bytes Demo/main.cpp | 6 +- Easy2D/Action/EAction.cpp | 14 +++ Easy2D/Action/EActionCallback.cpp | 2 +- Easy2D/Action/EActionDelay.cpp | 1 + Easy2D/Action/EActionGradual.cpp | 6 ++ Easy2D/Action/EActionLoop.cpp | 39 ++++--- Easy2D/Action/EActionMoveBy.cpp | 3 + Easy2D/Action/EActionOpacityBy.cpp | 3 + Easy2D/Action/EActionRotateBy.cpp | 5 +- Easy2D/Action/EActionScaleBy.cpp | 3 + Easy2D/Action/EActionSequence.cpp | 7 +- Easy2D/Action/EActionTwo.cpp | 12 +-- Easy2D/Action/EActionTwoAtSameTime.cpp | 12 +-- Easy2D/Action/EAnimation.cpp | 3 + Easy2D/Base/EApp.cpp | 25 +++-- Easy2D/Easy2D.vcxproj | 18 ++-- Easy2D/Easy2D.vcxproj.filters | 50 ++++----- Easy2D/Listener/EContactListener.cpp | 37 ------- Easy2D/Listener/EKeyboardPressListener.cpp | 29 ----- ...oardListener.cpp => EListenerKeyboard.cpp} | 16 +-- Easy2D/Listener/EListenerKeyboardPress.cpp | 29 +++++ ...{EMouseListener.cpp => EListenerMouse.cpp} | 16 +-- ...ckListener.cpp => EListenerMouseClick.cpp} | 20 ++-- ...ener.cpp => EListenerMouseDoubleClick.cpp} | 20 ++-- ...ragListener.cpp => EListenerMouseDrag.cpp} | 20 ++-- Easy2D/Listener/EListenerMousePress.cpp | 37 +++++++ ...ysicsListener.cpp => EListenerPhysics.cpp} | 16 +-- Easy2D/Listener/EListenerPhysicsContact.cpp | 37 +++++++ Easy2D/Listener/EMousePressListener.cpp | 37 ------- Easy2D/Manager/EActionManager.cpp | 5 - Easy2D/Manager/EMsgManager.cpp | 24 ++--- Easy2D/Manager/EPhysicsManager.cpp | 12 +-- Easy2D/Node/EButton.cpp | 2 +- Easy2D/Node/ENode.cpp | 16 ++- Easy2D/Node/ESprite.cpp | 6 +- Easy2D/Node/ESpriteFrame.cpp | 4 +- Easy2D/Node/ETexture.cpp | 18 ++-- Easy2D/Tool/ETimer.cpp | 2 +- Easy2D/Transition/ETransitionMove.cpp | 2 +- Easy2D/eactions.h | 9 +- Easy2D/ebase.h | 9 +- Easy2D/elisteners.h | 102 +++++++++--------- Easy2D/emanagers.h | 18 ++-- Easy2D/enodes.h | 46 ++++---- 49 files changed, 468 insertions(+), 399 deletions(-) create mode 100644 ConsoleDemo/DeclareDPIAware.manifest create mode 100644 ConsoleDemo/elyse.png create mode 100644 ConsoleDemo/test.png delete mode 100644 Easy2D/Listener/EContactListener.cpp delete mode 100644 Easy2D/Listener/EKeyboardPressListener.cpp rename Easy2D/Listener/{EKeyboardListener.cpp => EListenerKeyboard.cpp} (57%) create mode 100644 Easy2D/Listener/EListenerKeyboardPress.cpp rename Easy2D/Listener/{EMouseListener.cpp => EListenerMouse.cpp} (59%) rename Easy2D/Listener/{EMouseClickListener.cpp => EListenerMouseClick.cpp} (57%) rename Easy2D/Listener/{EMouseDoubleClickListener.cpp => EListenerMouseDoubleClick.cpp} (59%) rename Easy2D/Listener/{EMouseDragListener.cpp => EListenerMouseDrag.cpp} (54%) create mode 100644 Easy2D/Listener/EListenerMousePress.cpp rename Easy2D/Listener/{EPhysicsListener.cpp => EListenerPhysics.cpp} (64%) create mode 100644 Easy2D/Listener/EListenerPhysicsContact.cpp delete mode 100644 Easy2D/Listener/EMousePressListener.cpp diff --git a/ConsoleDemo/ConsoleDemo.vcxproj b/ConsoleDemo/ConsoleDemo.vcxproj index 5d8465c9..3500968a 100644 --- a/ConsoleDemo/ConsoleDemo.vcxproj +++ b/ConsoleDemo/ConsoleDemo.vcxproj @@ -96,6 +96,9 @@ Console true + + DeclareDPIAware.manifest + @@ -128,6 +131,9 @@ true true + + DeclareDPIAware.manifest + diff --git a/ConsoleDemo/DeclareDPIAware.manifest b/ConsoleDemo/DeclareDPIAware.manifest new file mode 100644 index 00000000..5dea26f9 --- /dev/null +++ b/ConsoleDemo/DeclareDPIAware.manifest @@ -0,0 +1,7 @@ + + + + true + + + \ No newline at end of file diff --git a/ConsoleDemo/elyse.png b/ConsoleDemo/elyse.png new file mode 100644 index 0000000000000000000000000000000000000000..7efa0f78334808a2135f864f4e669cacab5cae86 GIT binary patch literal 97633 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≠6w9F(gwy2 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%0ABZa?SfKp~(+ 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%0DvGMY9}fJ9Hb7Bj3PUZ0XNp+8m1 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 b9{~mcZf3E!ybWyx00000NkvXXu0mjf{hjd1 literal 0 HcmV?d00001 diff --git a/ConsoleDemo/main.cpp b/ConsoleDemo/main.cpp index 9d3e6070..13f1f568 100644 --- a/ConsoleDemo/main.cpp +++ b/ConsoleDemo/main.cpp @@ -4,43 +4,33 @@ int main() { EApp app; - if (app.init(L"Easy2D Demo", 640, 480, true)) + if (app.init(L"Easy2D Demo", 320, 320)) { auto scene = new EScene(); - auto node = new ENode(); - node->setPos(50, 80); - node->_setSize(30, 180); - scene->add(node); - - /*auto listener = new EMouseListener([=] { - if (!EMouseMsg::isLButtonDown()) - { - if (EMouseMsg::getMsg() == EMouseMsg::MOVE) - { - node->setPos(EMouseMsg::getPos()); - } - } - });*/ - - auto listener = new EKeyboardPressListener([=] { - if (EKeyboardMsg::isCapitalLockOn()) - { - if (EKeyboardMsg::getVal() == EKeyboardMsg::KEY::LEFT) - { - node->move(-3, 0); - } - if (EKeyboardMsg::getVal() == EKeyboardMsg::KEY::RIGHT) - { - node->move(3, 0); - } - } + auto sprite = new ESprite(L"elyse.png"); + sprite->setScale(0.3f); + // 获取窗口宽度 + float width = EApp::getWidth(); + // 获取窗口高度 + float height = EApp::getHeight(); + // 移动精灵的位置 + sprite->setPos(width / 2, height / 2); + //sprite->setAnchor(0, 0); + scene->add(sprite); + auto text = new EText(L"balabalabalabalabala", L"宋体", 80, EColor::BLUE); + //text->setWordWrapping(true); + //text->setWordWrappingWidth(50); + text->setAnchor(0, 0); + + auto listener = new EListenerMouseClick([=](EPoint) { + EPoint p = EMouseMsg::getPos(); + sprite->setPos(p); }); - - listener->bindWith(node); - - EMsgManager::bindListener(listener, scene); - + listener->bindWith(scene); + EMsgManager::stopAllMouseListeners(); + EMsgManager::stopAllKeyboardListeners(); + scene->add(text, -1); app.enterScene(scene); app.run(); diff --git a/ConsoleDemo/test.png b/ConsoleDemo/test.png new file mode 100644 index 0000000000000000000000000000000000000000..23b604623cfa24166dd9310929b57ee6de3aafba GIT binary patch literal 21833 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 literal 0 HcmV?d00001 diff --git a/Demo/main.cpp b/Demo/main.cpp index bd2130b1..b564cd24 100644 --- a/Demo/main.cpp +++ b/Demo/main.cpp @@ -16,18 +16,16 @@ int WINAPI WinMain( float h = EApp::getHeight(); auto scene = new EScene(); - auto text = new EText(L"中文测试中文测试中文测试中文测试中文测试中文测试中文测试", EColor::WHITE, L"楷体"); + auto text = new EText(L"中文测试中文测试中文测试中文测试中文测试中文测试中文测试", L"楷体"); text->setPos(EApp::getWidth() / 2, EApp::getHeight() / 2); //text->setWordWrapping(true); //text->setWordWrappingWidth(130); text->setRotation(40); - text->getFont()->setItalic(true); text->setAnchor(0.5f, 0.5f); - text->setColor(EColor::WHITE); //text->runAction(new EActionLoop(new EActionTwo(new EActionFadeOut(1), new EActionFadeIn(1)))); scene->add(text); - auto listener = new EKeyboardPressListener([=]() { + auto listener = new EListenerKeyboardPress([=]() { if (EKeyboardMsg::getVal() == EKeyboardMsg::KEY::SPACE) { EApp::backScene(new ETransitionFade(0.5f, 0.5f)); diff --git a/Easy2D/Action/EAction.cpp b/Easy2D/Action/EAction.cpp index 40899116..321de49d 100644 --- a/Easy2D/Action/EAction.cpp +++ b/Easy2D/Action/EAction.cpp @@ -55,6 +55,12 @@ void e2d::EAction::setInterval(LONGLONG milliSeconds) void e2d::EAction::setTarget(ENode * node) { + if (m_pTarget) + { + // 动作只能有一个目标 + return; + } + if (node) { m_pTarget = node; @@ -79,6 +85,14 @@ void e2d::EAction::_init() m_tLast = GetNow(); } +void e2d::EAction::_callOn() +{ + if (!m_bInit) + { + _init(); + } +} + void e2d::EAction::_reset() { m_bInit = false; diff --git a/Easy2D/Action/EActionCallback.cpp b/Easy2D/Action/EActionCallback.cpp index 05bb4b18..0b7aafbb 100644 --- a/Easy2D/Action/EActionCallback.cpp +++ b/Easy2D/Action/EActionCallback.cpp @@ -12,7 +12,7 @@ e2d::EActionCallback * e2d::EActionCallback::clone() const void e2d::EActionCallback::_init() { - EAction::_init(); + // 执行回调函数的动作不需要初始化 } void e2d::EActionCallback::_callOn() diff --git a/Easy2D/Action/EActionDelay.cpp b/Easy2D/Action/EActionDelay.cpp index 629ac683..7047ede3 100644 --- a/Easy2D/Action/EActionDelay.cpp +++ b/Easy2D/Action/EActionDelay.cpp @@ -18,6 +18,7 @@ void e2d::EActionDelay::_init() void e2d::EActionDelay::_callOn() { + EAction::_callOn(); // 判断时间间隔是否足够 if (GetInterval(m_tLast) > m_nAnimationInterval) { diff --git a/Easy2D/Action/EActionGradual.cpp b/Easy2D/Action/EActionGradual.cpp index 1d449179..5ff45ebf 100644 --- a/Easy2D/Action/EActionGradual.cpp +++ b/Easy2D/Action/EActionGradual.cpp @@ -21,6 +21,12 @@ void e2d::EActionGradual::_init() bool e2d::EActionGradual::_isDelayEnough() { // 判断时间间隔是否足够 + if (m_fTotalDuration == 0) + { + m_fRateOfProgress = 1; + return true; + } + if (GetInterval(m_tLast) > m_nAnimationInterval) { // 重新记录时间 diff --git a/Easy2D/Action/EActionLoop.cpp b/Easy2D/Action/EActionLoop.cpp index eb2bfd11..4808732e 100644 --- a/Easy2D/Action/EActionLoop.cpp +++ b/Easy2D/Action/EActionLoop.cpp @@ -1,42 +1,55 @@ #include "..\eactions.h" -e2d::EActionLoop::EActionLoop(EAction * action) : - m_Action(action) +e2d::EActionLoop::EActionLoop(EAction * action, int times /* = -1 */) + : m_pAction(action) + , m_nTimes(0) + , m_nTotalTimes(times) { - m_Action->retain(); + m_pAction->retain(); } e2d::EActionLoop::~EActionLoop() { - SafeRelease(&m_Action); + SafeRelease(&m_pAction); } e2d::EActionLoop * e2d::EActionLoop::clone() const { - return new EActionLoop(m_Action->clone()); + return new EActionLoop(m_pAction->clone()); } void e2d::EActionLoop::_init() { EAction::_init(); - if (!m_Action->getTarget() && m_pTarget) - { - m_Action->setTarget(m_pTarget); - } - m_Action->_init(); + m_pAction->setTarget(m_pTarget); + m_pAction->_init(); } void e2d::EActionLoop::_callOn() { - m_Action->_callOn(); + EAction::_callOn(); - if (m_Action->_isEnding()) + if (m_nTimes == m_nTotalTimes) { - m_Action->_reset(); + this->stop(); + return; + } + + m_pAction->_callOn(); + + if (m_pAction->_isEnding()) + { + m_nTimes++; + + EAction::_reset(); + m_pAction->_reset(); } } void e2d::EActionLoop::_reset() { EAction::_reset(); + + m_pAction->_reset(); + m_nTimes = 0; } diff --git a/Easy2D/Action/EActionMoveBy.cpp b/Easy2D/Action/EActionMoveBy.cpp index 5f6cd930..da3ca261 100644 --- a/Easy2D/Action/EActionMoveBy.cpp +++ b/Easy2D/Action/EActionMoveBy.cpp @@ -18,11 +18,14 @@ void e2d::EActionMoveBy::_init() void e2d::EActionMoveBy::_callOn() { + EAction::_callOn(); + if (m_pTarget == nullptr) { this->stop(); return; } + while (EActionGradual::_isDelayEnough()) { // 移动节点 diff --git a/Easy2D/Action/EActionOpacityBy.cpp b/Easy2D/Action/EActionOpacityBy.cpp index 6ac9e3de..7833e425 100644 --- a/Easy2D/Action/EActionOpacityBy.cpp +++ b/Easy2D/Action/EActionOpacityBy.cpp @@ -18,11 +18,14 @@ void e2d::EActionOpacityBy::_init() void e2d::EActionOpacityBy::_callOn() { + EAction::_callOn(); + if (m_pTarget == nullptr) { this->stop(); return; } + while (EActionGradual::_isDelayEnough()) { // 设置节点透明度 diff --git a/Easy2D/Action/EActionRotateBy.cpp b/Easy2D/Action/EActionRotateBy.cpp index 52828138..732d5306 100644 --- a/Easy2D/Action/EActionRotateBy.cpp +++ b/Easy2D/Action/EActionRotateBy.cpp @@ -12,17 +12,20 @@ void e2d::EActionRotateBy::_init() EActionGradual::_init(); if (m_pTarget) { - m_nBeginVal = m_pTarget->getOpacity(); + m_nBeginVal = m_pTarget->getRotation(); } } void e2d::EActionRotateBy::_callOn() { + EAction::_callOn(); + if (m_pTarget == nullptr) { this->stop(); return; } + while (EActionGradual::_isDelayEnough()) { // 旋转节点 diff --git a/Easy2D/Action/EActionScaleBy.cpp b/Easy2D/Action/EActionScaleBy.cpp index 0bf1178b..8e3f8d17 100644 --- a/Easy2D/Action/EActionScaleBy.cpp +++ b/Easy2D/Action/EActionScaleBy.cpp @@ -27,11 +27,14 @@ void e2d::EActionScaleBy::_init() void e2d::EActionScaleBy::_callOn() { + EAction::_callOn(); + if (m_pTarget == nullptr) { this->stop(); return; } + while (EActionGradual::_isDelayEnough()) { // 缩放节点 diff --git a/Easy2D/Action/EActionSequence.cpp b/Easy2D/Action/EActionSequence.cpp index 1109efa5..f62c5eea 100644 --- a/Easy2D/Action/EActionSequence.cpp +++ b/Easy2D/Action/EActionSequence.cpp @@ -37,10 +37,7 @@ void e2d::EActionSequence::_init() { for (auto action : m_vActions) { - if (!action->getTarget()) - { - action->setTarget(m_pTarget); - } + action->setTarget(m_pTarget); } } // 初始化第一个动作 @@ -49,6 +46,8 @@ void e2d::EActionSequence::_init() void e2d::EActionSequence::_callOn() { + EAction::_callOn(); + auto &action = m_vActions[m_nActionIndex]; action->_callOn(); diff --git a/Easy2D/Action/EActionTwo.cpp b/Easy2D/Action/EActionTwo.cpp index e2f29af4..014ba43b 100644 --- a/Easy2D/Action/EActionTwo.cpp +++ b/Easy2D/Action/EActionTwo.cpp @@ -34,20 +34,16 @@ e2d::EActionTwo * e2d::EActionTwo::reverse(bool actionReverse) const void e2d::EActionTwo::_init() { EAction::_init(); - if (!m_pFirstAction->getTarget() && m_pTarget) - { - m_pFirstAction->setTarget(m_pTarget); - } - if (!m_pSecondAction->getTarget() && m_pTarget) - { - m_pSecondAction->setTarget(m_pTarget); - } + m_pFirstAction->setTarget(m_pTarget); + m_pSecondAction->setTarget(m_pTarget); m_pFirstAction->_init(); } void e2d::EActionTwo::_callOn() { + EAction::_callOn(); + if (!m_pFirstAction->_isEnding()) { m_pFirstAction->_callOn(); diff --git a/Easy2D/Action/EActionTwoAtSameTime.cpp b/Easy2D/Action/EActionTwoAtSameTime.cpp index c9a5ed08..0ab8af70 100644 --- a/Easy2D/Action/EActionTwoAtSameTime.cpp +++ b/Easy2D/Action/EActionTwoAtSameTime.cpp @@ -34,14 +34,8 @@ e2d::EActionTwoAtSameTime * e2d::EActionTwoAtSameTime::reverse(bool actionRevers void e2d::EActionTwoAtSameTime::_init() { EAction::_init(); - if (!m_pFirstAction->getTarget() && m_pTarget) - { - m_pFirstAction->setTarget(m_pTarget); - } - if (!m_pSecondAction->getTarget() && m_pTarget) - { - m_pSecondAction->setTarget(m_pTarget); - } + m_pFirstAction->setTarget(m_pTarget); + m_pSecondAction->setTarget(m_pTarget); m_pFirstAction->_init(); m_pSecondAction->_init(); @@ -49,6 +43,8 @@ void e2d::EActionTwoAtSameTime::_init() void e2d::EActionTwoAtSameTime::_callOn() { + EAction::_callOn(); + if (!m_pFirstAction->_isEnding()) { m_pFirstAction->_callOn(); diff --git a/Easy2D/Action/EAnimation.cpp b/Easy2D/Action/EAnimation.cpp index 756726c7..c325a21a 100644 --- a/Easy2D/Action/EAnimation.cpp +++ b/Easy2D/Action/EAnimation.cpp @@ -30,11 +30,14 @@ void e2d::EAnimation::_init() void e2d::EAnimation::_callOn() { + EAction::_callOn(); + if (m_pTarget == nullptr) { this->stop(); return; } + // 判断时间间隔是否足够 while (GetInterval(m_tLast) > m_nAnimationInterval) { diff --git a/Easy2D/Base/EApp.cpp b/Easy2D/Base/EApp.cpp index 51b231eb..bc7fb8d1 100644 --- a/Easy2D/Base/EApp.cpp +++ b/Easy2D/Base/EApp.cpp @@ -19,6 +19,7 @@ static std::stack s_SceneStack; // 游戏开始时间 static steady_clock::time_point s_tStart; + e2d::EApp::EApp() : m_bEnd(false) , m_bPaused(false) @@ -26,7 +27,7 @@ e2d::EApp::EApp() , m_bTransitional(false) , m_bTopMost(false) , m_bShowConsole(false) - , nAnimationInterval(17LL) + , m_nAnimationInterval(17LL) , m_ClearColor(EColor::BLACK) , m_pCurrentScene(nullptr) , m_pNextScene(nullptr) @@ -112,7 +113,7 @@ bool e2d::EApp::init(const EString &title, UINT32 width, UINT32 height, EWindowS // 取最小值 width = min(width, screenWidth); height = min(height, screenHeight); - + // 创建窗口样式 DWORD dwStyle = WS_OVERLAPPED | WS_SYSMENU; if (!wStyle.m_bNoMiniSize) @@ -251,9 +252,10 @@ void e2d::EApp::run() { SetWindowPos(GetHWnd(), HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); } + // 记录开始时间 s_tStart = steady_clock::now(); - + // 窗口消息 MSG msg; while (!m_bEnd) @@ -275,7 +277,7 @@ void e2d::EApp::run() void e2d::EApp::setFPS(UINT32 fps) { fps = min(max(fps, 30), 120); - s_pInstance->nAnimationInterval = 1000 / fps; + s_pInstance->m_nAnimationInterval = 1000 / fps; } bool e2d::EApp::onActivate() @@ -295,10 +297,10 @@ bool e2d::EApp::onCloseWindow() void e2d::EApp::_mainLoop() { - // 时间间隔 - static LONGLONG nInterval = 0LL; // 挂起时长 static LONGLONG nWaitMS = 0L; + // 时间间隔 + static LONGLONG nInterval; // 上一帧画面绘制时间 static steady_clock::time_point tLast = steady_clock::now(); @@ -307,10 +309,10 @@ void e2d::EApp::_mainLoop() // 计算时间间隔 nInterval = GetInterval(tLast); // 判断间隔时间是否足够 - if (nInterval >= nAnimationInterval) + if (nInterval >= m_nAnimationInterval) { // 记录当前时间 - tLast += microseconds(nAnimationInterval); + tLast += microseconds(m_nAnimationInterval); // 游戏控制流程 _onControl(); // 刷新游戏画面 @@ -319,7 +321,7 @@ void e2d::EApp::_mainLoop() else { // 计算挂起时长 - nWaitMS = nAnimationInterval - nInterval - 1; + nWaitMS = m_nAnimationInterval - nInterval - 1; // 挂起线程,释放 CPU 占用 if (nWaitMS > 1LL) { @@ -436,6 +438,11 @@ float e2d::EApp::getHeight() return GetRenderTarget()->GetSize().height; } +e2d::ESize e2d::EApp::getSize() +{ + return ESize(GetRenderTarget()->GetSize().width, GetRenderTarget()->GetSize().height); +} + void e2d::EApp::enterScene(EScene * scene, bool saveCurrentScene /* = true */) { enterScene(scene, nullptr, saveCurrentScene); diff --git a/Easy2D/Easy2D.vcxproj b/Easy2D/Easy2D.vcxproj index 20b91013..352074d5 100644 --- a/Easy2D/Easy2D.vcxproj +++ b/Easy2D/Easy2D.vcxproj @@ -217,16 +217,16 @@ - - - + + + - - - - - - + + + + + + diff --git a/Easy2D/Easy2D.vcxproj.filters b/Easy2D/Easy2D.vcxproj.filters index df69779c..ed54ad4e 100644 --- a/Easy2D/Easy2D.vcxproj.filters +++ b/Easy2D/Easy2D.vcxproj.filters @@ -135,30 +135,9 @@ Manager - - Listener - - - Listener - Listener - - Listener - - - Listener - - - Listener - - - Listener - - - Listener - Node @@ -201,13 +180,34 @@ Manager - - Listener - Geometry - + + Listener + + + Listener + + + Listener + + + Listener + + + Listener + + + Listener + + + Listener + + + Listener + + Listener diff --git a/Easy2D/Listener/EContactListener.cpp b/Easy2D/Listener/EContactListener.cpp deleted file mode 100644 index 7afec872..00000000 --- a/Easy2D/Listener/EContactListener.cpp +++ /dev/null @@ -1,37 +0,0 @@ -#include "..\elisteners.h" -#include "..\egeometry.h" - -e2d::EContactListener::EContactListener() - : EPhysicsListener() -{ -} - -e2d::EContactListener::EContactListener(const EString & name) - : EPhysicsListener(name) -{ -} - -e2d::EContactListener::EContactListener(const COLLISION_LISTENER_CALLBACK & callback) - : EPhysicsListener() -{ - this->m_Callback = callback; -} - -e2d::EContactListener::EContactListener(const EString & name, const COLLISION_LISTENER_CALLBACK & callback) - : EPhysicsListener(name) -{ - this->m_Callback = callback; -} - -void e2d::EContactListener::_callOn() -{ - if (EPhysicsMsg::getMsg() == EPhysicsMsg::OVERLAP || - EPhysicsMsg::getMsg() == EPhysicsMsg::CONTAINS || - EPhysicsMsg::getMsg() == EPhysicsMsg::IS_CONTAINED) - { - m_Callback( - EPhysicsMsg::getActiveGeometry()->getParentNode(), - EPhysicsMsg::getPassiveGeometry()->getParentNode() - ); - } -} diff --git a/Easy2D/Listener/EKeyboardPressListener.cpp b/Easy2D/Listener/EKeyboardPressListener.cpp deleted file mode 100644 index b6990598..00000000 --- a/Easy2D/Listener/EKeyboardPressListener.cpp +++ /dev/null @@ -1,29 +0,0 @@ -#include "..\elisteners.h" - -e2d::EKeyboardPressListener::EKeyboardPressListener() - : EKeyboardListener() -{ -} - -e2d::EKeyboardPressListener::EKeyboardPressListener(const EString & name) - : EKeyboardListener(name) -{ -} - -e2d::EKeyboardPressListener::EKeyboardPressListener(const KEY_LISTENER_CALLBACK & callback) - : EKeyboardListener(callback) -{ -} - -e2d::EKeyboardPressListener::EKeyboardPressListener(const EString & name, const KEY_LISTENER_CALLBACK & callback) - : EKeyboardListener(name, callback) -{ -} - -void e2d::EKeyboardPressListener::_callOn() -{ - if (EKeyboardMsg::getMsg() == EKeyboardMsg::KEYBOARD_MSG::KEY_DOWN) - { - m_Callback(); - } -} diff --git a/Easy2D/Listener/EKeyboardListener.cpp b/Easy2D/Listener/EListenerKeyboard.cpp similarity index 57% rename from Easy2D/Listener/EKeyboardListener.cpp rename to Easy2D/Listener/EListenerKeyboard.cpp index 571dcf00..cecd0989 100644 --- a/Easy2D/Listener/EKeyboardListener.cpp +++ b/Easy2D/Listener/EListenerKeyboard.cpp @@ -1,39 +1,39 @@ #include "..\elisteners.h" #include "..\emanagers.h" -e2d::EKeyboardListener::EKeyboardListener() +e2d::EListenerKeyboard::EListenerKeyboard() : EListener() { } -e2d::EKeyboardListener::EKeyboardListener(const EString & name) +e2d::EListenerKeyboard::EListenerKeyboard(const EString & name) : EListener(name) { } -e2d::EKeyboardListener::EKeyboardListener(const KEY_LISTENER_CALLBACK & callback) +e2d::EListenerKeyboard::EListenerKeyboard(const KEY_LISTENER_CALLBACK & callback) : EListener() { m_Callback = callback; } -e2d::EKeyboardListener::EKeyboardListener(const EString & name, const KEY_LISTENER_CALLBACK & callback) +e2d::EListenerKeyboard::EListenerKeyboard(const EString & name, const KEY_LISTENER_CALLBACK & callback) : EListener(name) { m_Callback = callback; } -void e2d::EKeyboardListener::_callOn() +void e2d::EListenerKeyboard::_callOn() { m_Callback(); } -void e2d::EKeyboardListener::setCallback(const KEY_LISTENER_CALLBACK & callback) +void e2d::EListenerKeyboard::setCallback(const KEY_LISTENER_CALLBACK & callback) { m_Callback = callback; } -void e2d::EKeyboardListener::bindWith(EScene * pParentScene) +void e2d::EListenerKeyboard::bindWith(EScene * pParentScene) { WARN_IF(m_pParentNode != nullptr, "A listener cannot bind with two object."); @@ -43,7 +43,7 @@ void e2d::EKeyboardListener::bindWith(EScene * pParentScene) } } -void e2d::EKeyboardListener::bindWith(ENode * pParentNode) +void e2d::EListenerKeyboard::bindWith(ENode * pParentNode) { WARN_IF(m_pParentNode != nullptr, "A listener cannot bind with two object."); diff --git a/Easy2D/Listener/EListenerKeyboardPress.cpp b/Easy2D/Listener/EListenerKeyboardPress.cpp new file mode 100644 index 00000000..51c2cadf --- /dev/null +++ b/Easy2D/Listener/EListenerKeyboardPress.cpp @@ -0,0 +1,29 @@ +#include "..\elisteners.h" + +e2d::EListenerKeyboardPress::EListenerKeyboardPress() + : EListenerKeyboard() +{ +} + +e2d::EListenerKeyboardPress::EListenerKeyboardPress(const EString & name) + : EListenerKeyboard(name) +{ +} + +e2d::EListenerKeyboardPress::EListenerKeyboardPress(const KEY_LISTENER_CALLBACK & callback) + : EListenerKeyboard(callback) +{ +} + +e2d::EListenerKeyboardPress::EListenerKeyboardPress(const EString & name, const KEY_LISTENER_CALLBACK & callback) + : EListenerKeyboard(name, callback) +{ +} + +void e2d::EListenerKeyboardPress::_callOn() +{ + if (EKeyboardMsg::getMsg() == EKeyboardMsg::KEYBOARD_MSG::KEY_DOWN) + { + m_Callback(); + } +} diff --git a/Easy2D/Listener/EMouseListener.cpp b/Easy2D/Listener/EListenerMouse.cpp similarity index 59% rename from Easy2D/Listener/EMouseListener.cpp rename to Easy2D/Listener/EListenerMouse.cpp index 31c675eb..3be322b6 100644 --- a/Easy2D/Listener/EMouseListener.cpp +++ b/Easy2D/Listener/EListenerMouse.cpp @@ -1,39 +1,39 @@ #include "..\elisteners.h" #include "..\emanagers.h" -e2d::EMouseListener::EMouseListener() +e2d::EListenerMouse::EListenerMouse() : EListener() { } -e2d::EMouseListener::EMouseListener(const EString & name) +e2d::EListenerMouse::EListenerMouse(const EString & name) : EListener(name) { } -e2d::EMouseListener::EMouseListener(const MOUSE_LISTENER_CALLBACK & callback) +e2d::EListenerMouse::EListenerMouse(const MOUSE_LISTENER_CALLBACK & callback) : EListener() { m_Callback = callback; } -e2d::EMouseListener::EMouseListener(const EString & name, const MOUSE_LISTENER_CALLBACK & callback) +e2d::EListenerMouse::EListenerMouse(const EString & name, const MOUSE_LISTENER_CALLBACK & callback) : EListener(name) { m_Callback = callback; } -void e2d::EMouseListener::_callOn() +void e2d::EListenerMouse::_callOn() { m_Callback(); } -void e2d::EMouseListener::setCallback(const MOUSE_LISTENER_CALLBACK & callback) +void e2d::EListenerMouse::setCallback(const MOUSE_LISTENER_CALLBACK & callback) { m_Callback = callback; } -void e2d::EMouseListener::bindWith(EScene * pParentScene) +void e2d::EListenerMouse::bindWith(EScene * pParentScene) { WARN_IF(m_pParentNode != nullptr, "A listener cannot bind with two object."); @@ -43,7 +43,7 @@ void e2d::EMouseListener::bindWith(EScene * pParentScene) } } -void e2d::EMouseListener::bindWith(ENode * pParentNode) +void e2d::EListenerMouse::bindWith(ENode * pParentNode) { WARN_IF(m_pParentNode != nullptr, "A listener cannot bind with two object."); diff --git a/Easy2D/Listener/EMouseClickListener.cpp b/Easy2D/Listener/EListenerMouseClick.cpp similarity index 57% rename from Easy2D/Listener/EMouseClickListener.cpp rename to Easy2D/Listener/EListenerMouseClick.cpp index e1717c1b..cc131f42 100644 --- a/Easy2D/Listener/EMouseClickListener.cpp +++ b/Easy2D/Listener/EListenerMouseClick.cpp @@ -1,32 +1,32 @@ #include "..\elisteners.h" -e2d::EMouseClickListener::EMouseClickListener() - : EMouseListener() +e2d::EListenerMouseClick::EListenerMouseClick() + : EListenerMouse() , m_bPressed(false) { } -e2d::EMouseClickListener::EMouseClickListener(const EString & name) - : EMouseListener(name) +e2d::EListenerMouseClick::EListenerMouseClick(const EString & name) + : EListenerMouse(name) , m_bPressed(false) { } -e2d::EMouseClickListener::EMouseClickListener(const MOUSE_CLICK_LISTENER_CALLBACK & callback) - : EMouseListener() +e2d::EListenerMouseClick::EListenerMouseClick(const MOUSE_CLICK_LISTENER_CALLBACK & callback) + : EListenerMouse() , m_Callback(callback) , m_bPressed(false) { } -e2d::EMouseClickListener::EMouseClickListener(const EString & name, const MOUSE_CLICK_LISTENER_CALLBACK & callback) - : EMouseListener(name) +e2d::EListenerMouseClick::EListenerMouseClick(const EString & name, const MOUSE_CLICK_LISTENER_CALLBACK & callback) + : EListenerMouse(name) , m_Callback(callback) , m_bPressed(false) { } -void e2d::EMouseClickListener::_callOn() +void e2d::EListenerMouseClick::_callOn() { if (EMouseMsg::getMsg() == EMouseMsg::LBUTTON_DOWN || EMouseMsg::getMsg() == EMouseMsg::LBUTTON_DBLCLK) @@ -40,7 +40,7 @@ void e2d::EMouseClickListener::_callOn() } } -void e2d::EMouseClickListener::setCallback(const MOUSE_CLICK_LISTENER_CALLBACK & callback) +void e2d::EListenerMouseClick::setCallback(const MOUSE_CLICK_LISTENER_CALLBACK & callback) { m_Callback = callback; } diff --git a/Easy2D/Listener/EMouseDoubleClickListener.cpp b/Easy2D/Listener/EListenerMouseDoubleClick.cpp similarity index 59% rename from Easy2D/Listener/EMouseDoubleClickListener.cpp rename to Easy2D/Listener/EListenerMouseDoubleClick.cpp index e353d731..f4274b40 100644 --- a/Easy2D/Listener/EMouseDoubleClickListener.cpp +++ b/Easy2D/Listener/EListenerMouseDoubleClick.cpp @@ -1,32 +1,32 @@ #include "..\elisteners.h" -e2d::EMouseDoubleClickListener::EMouseDoubleClickListener() - : EMouseListener() +e2d::EListenerMouseDoubleClick::EListenerMouseDoubleClick() + : EListenerMouse() , m_bPressed(false) { } -e2d::EMouseDoubleClickListener::EMouseDoubleClickListener(const EString & name) - : EMouseListener(name) +e2d::EListenerMouseDoubleClick::EListenerMouseDoubleClick(const EString & name) + : EListenerMouse(name) , m_bPressed(false) { } -e2d::EMouseDoubleClickListener::EMouseDoubleClickListener(const MOUSE_DBLCLK_LISTENER_CALLBACK & callback) - : EMouseListener() +e2d::EListenerMouseDoubleClick::EListenerMouseDoubleClick(const MOUSE_DBLCLK_LISTENER_CALLBACK & callback) + : EListenerMouse() , m_Callback(callback) , m_bPressed(false) { } -e2d::EMouseDoubleClickListener::EMouseDoubleClickListener(const EString & name, const MOUSE_DBLCLK_LISTENER_CALLBACK & callback) - : EMouseListener(name) +e2d::EListenerMouseDoubleClick::EListenerMouseDoubleClick(const EString & name, const MOUSE_DBLCLK_LISTENER_CALLBACK & callback) + : EListenerMouse(name) , m_Callback(callback) , m_bPressed(false) { } -void e2d::EMouseDoubleClickListener::_callOn() +void e2d::EListenerMouseDoubleClick::_callOn() { if (EMouseMsg::getMsg() == EMouseMsg::LBUTTON_DOWN) { @@ -43,7 +43,7 @@ void e2d::EMouseDoubleClickListener::_callOn() } } -void e2d::EMouseDoubleClickListener::setCallback(const MOUSE_DBLCLK_LISTENER_CALLBACK & callback) +void e2d::EListenerMouseDoubleClick::setCallback(const MOUSE_DBLCLK_LISTENER_CALLBACK & callback) { m_Callback = callback; } diff --git a/Easy2D/Listener/EMouseDragListener.cpp b/Easy2D/Listener/EListenerMouseDrag.cpp similarity index 54% rename from Easy2D/Listener/EMouseDragListener.cpp rename to Easy2D/Listener/EListenerMouseDrag.cpp index a56c54a2..38c1ac6d 100644 --- a/Easy2D/Listener/EMouseDragListener.cpp +++ b/Easy2D/Listener/EListenerMouseDrag.cpp @@ -1,28 +1,28 @@ #include "..\elisteners.h" -e2d::EMouseDragListener::EMouseDragListener() - : EMouseListener() +e2d::EListenerMouseDrag::EListenerMouseDrag() + : EListenerMouse() { } -e2d::EMouseDragListener::EMouseDragListener(const EString & name) - : EMouseListener(name) +e2d::EListenerMouseDrag::EListenerMouseDrag(const EString & name) + : EListenerMouse(name) { } -e2d::EMouseDragListener::EMouseDragListener(const MOUSE_DRAG_LISTENER_CALLBACK & callback) - : EMouseListener() +e2d::EListenerMouseDrag::EListenerMouseDrag(const MOUSE_DRAG_LISTENER_CALLBACK & callback) + : EListenerMouse() , m_Callback(callback) { } -e2d::EMouseDragListener::EMouseDragListener(const EString & name, const MOUSE_DRAG_LISTENER_CALLBACK & callback) - : EMouseListener(name) +e2d::EListenerMouseDrag::EListenerMouseDrag(const EString & name, const MOUSE_DRAG_LISTENER_CALLBACK & callback) + : EListenerMouse(name) , m_Callback(callback) { } -void e2d::EMouseDragListener::_callOn() +void e2d::EListenerMouseDrag::_callOn() { if (EMouseMsg::getMsg() == EMouseMsg::LBUTTON_DOWN || EMouseMsg::getMsg() == EMouseMsg::LBUTTON_DBLCLK) @@ -35,7 +35,7 @@ void e2d::EMouseDragListener::_callOn() } } -void e2d::EMouseDragListener::setCallback(const MOUSE_DRAG_LISTENER_CALLBACK & callback) +void e2d::EListenerMouseDrag::setCallback(const MOUSE_DRAG_LISTENER_CALLBACK & callback) { m_Callback = callback; } diff --git a/Easy2D/Listener/EListenerMousePress.cpp b/Easy2D/Listener/EListenerMousePress.cpp new file mode 100644 index 00000000..0761262e --- /dev/null +++ b/Easy2D/Listener/EListenerMousePress.cpp @@ -0,0 +1,37 @@ +#include "..\elisteners.h" + +e2d::EListenerMousePress::EListenerMousePress() + : EListenerMouse() +{ +} + +e2d::EListenerMousePress::EListenerMousePress(const EString & name) + : EListenerMouse(name) +{ +} + +e2d::EListenerMousePress::EListenerMousePress(const MOUSE_PRESS_LISTENER_CALLBACK & callback) + : EListenerMouse() + , m_Callback(callback) +{ +} + +e2d::EListenerMousePress::EListenerMousePress(const EString & name, const MOUSE_PRESS_LISTENER_CALLBACK & callback) + : EListenerMouse(name) + , m_Callback(callback) +{ +} + +void e2d::EListenerMousePress::_callOn() +{ + if (EMouseMsg::getMsg() == EMouseMsg::LBUTTON_DOWN || + EMouseMsg::getMsg() == EMouseMsg::LBUTTON_DBLCLK) + { + m_Callback(EMouseMsg::getPos()); + } +} + +void e2d::EListenerMousePress::setCallback(const MOUSE_PRESS_LISTENER_CALLBACK & callback) +{ + m_Callback = callback; +} diff --git a/Easy2D/Listener/EPhysicsListener.cpp b/Easy2D/Listener/EListenerPhysics.cpp similarity index 64% rename from Easy2D/Listener/EPhysicsListener.cpp rename to Easy2D/Listener/EListenerPhysics.cpp index 60300c2c..7929b8e3 100644 --- a/Easy2D/Listener/EPhysicsListener.cpp +++ b/Easy2D/Listener/EListenerPhysics.cpp @@ -2,29 +2,29 @@ #include "..\egeometry.h" #include "..\emanagers.h" -e2d::EPhysicsListener::EPhysicsListener() +e2d::EListenerPhysics::EListenerPhysics() : EListener() { } -e2d::EPhysicsListener::EPhysicsListener(const EString & name) +e2d::EListenerPhysics::EListenerPhysics(const EString & name) : EListener(name) { } -e2d::EPhysicsListener::EPhysicsListener(const PHYSICS_LISTENER_CALLBACK & callback) +e2d::EListenerPhysics::EListenerPhysics(const PHYSICS_LISTENER_CALLBACK & callback) : EListener() { m_Callback = callback; } -e2d::EPhysicsListener::EPhysicsListener(const EString & name, const PHYSICS_LISTENER_CALLBACK & callback) +e2d::EListenerPhysics::EListenerPhysics(const EString & name, const PHYSICS_LISTENER_CALLBACK & callback) : EListener(name) { m_Callback = callback; } -void e2d::EPhysicsListener::_callOn() +void e2d::EListenerPhysics::_callOn() { m_Callback( EPhysicsMsg::getActiveGeometry()->getParentNode(), @@ -33,12 +33,12 @@ void e2d::EPhysicsListener::_callOn() ); } -void e2d::EPhysicsListener::setCallback(const PHYSICS_LISTENER_CALLBACK & callback) +void e2d::EListenerPhysics::setCallback(const PHYSICS_LISTENER_CALLBACK & callback) { m_Callback = callback; } -void e2d::EPhysicsListener::bindWith(EScene * pParentScene) +void e2d::EListenerPhysics::bindWith(EScene * pParentScene) { WARN_IF(m_pParentNode != nullptr, "A listener cannot bind with two object."); @@ -48,7 +48,7 @@ void e2d::EPhysicsListener::bindWith(EScene * pParentScene) } } -void e2d::EPhysicsListener::bindWith(ENode * pParentNode) +void e2d::EListenerPhysics::bindWith(ENode * pParentNode) { WARN_IF(m_pParentNode != nullptr, "A listener cannot bind with two object."); diff --git a/Easy2D/Listener/EListenerPhysicsContact.cpp b/Easy2D/Listener/EListenerPhysicsContact.cpp new file mode 100644 index 00000000..3d78c900 --- /dev/null +++ b/Easy2D/Listener/EListenerPhysicsContact.cpp @@ -0,0 +1,37 @@ +#include "..\elisteners.h" +#include "..\egeometry.h" + +e2d::EListenerPhysicsContact::EListenerPhysicsContact() + : EListenerPhysics() +{ +} + +e2d::EListenerPhysicsContact::EListenerPhysicsContact(const EString & name) + : EListenerPhysics(name) +{ +} + +e2d::EListenerPhysicsContact::EListenerPhysicsContact(const COLLISION_LISTENER_CALLBACK & callback) + : EListenerPhysics() +{ + this->m_Callback = callback; +} + +e2d::EListenerPhysicsContact::EListenerPhysicsContact(const EString & name, const COLLISION_LISTENER_CALLBACK & callback) + : EListenerPhysics(name) +{ + this->m_Callback = callback; +} + +void e2d::EListenerPhysicsContact::_callOn() +{ + if (EPhysicsMsg::getMsg() == EPhysicsMsg::OVERLAP || + EPhysicsMsg::getMsg() == EPhysicsMsg::CONTAINS || + EPhysicsMsg::getMsg() == EPhysicsMsg::IS_CONTAINED) + { + m_Callback( + EPhysicsMsg::getActiveGeometry()->getParentNode(), + EPhysicsMsg::getPassiveGeometry()->getParentNode() + ); + } +} diff --git a/Easy2D/Listener/EMousePressListener.cpp b/Easy2D/Listener/EMousePressListener.cpp deleted file mode 100644 index c2c369ab..00000000 --- a/Easy2D/Listener/EMousePressListener.cpp +++ /dev/null @@ -1,37 +0,0 @@ -#include "..\elisteners.h" - -e2d::EMousePressListener::EMousePressListener() - : EMouseListener() -{ -} - -e2d::EMousePressListener::EMousePressListener(const EString & name) - : EMouseListener(name) -{ -} - -e2d::EMousePressListener::EMousePressListener(const MOUSE_PRESS_LISTENER_CALLBACK & callback) - : EMouseListener() - , m_Callback(callback) -{ -} - -e2d::EMousePressListener::EMousePressListener(const EString & name, const MOUSE_PRESS_LISTENER_CALLBACK & callback) - : EMouseListener(name) - , m_Callback(callback) -{ -} - -void e2d::EMousePressListener::_callOn() -{ - if (EMouseMsg::getMsg() == EMouseMsg::LBUTTON_DOWN || - EMouseMsg::getMsg() == EMouseMsg::LBUTTON_DBLCLK) - { - m_Callback(EMouseMsg::getPos()); - } -} - -void e2d::EMousePressListener::setCallback(const MOUSE_PRESS_LISTENER_CALLBACK & callback) -{ - m_Callback = callback; -} diff --git a/Easy2D/Manager/EActionManager.cpp b/Easy2D/Manager/EActionManager.cpp index 8e2e7cd7..731c50b4 100644 --- a/Easy2D/Manager/EActionManager.cpp +++ b/Easy2D/Manager/EActionManager.cpp @@ -149,11 +149,6 @@ void e2d::EActionManager::ActionProc() } else { - // 初始化动作 - if (!action->m_bInit) - { - action->_init(); - } // 执行动作 action->_callOn(); } diff --git a/Easy2D/Manager/EMsgManager.cpp b/Easy2D/Manager/EMsgManager.cpp index c9597ec1..d5d1cf20 100644 --- a/Easy2D/Manager/EMsgManager.cpp +++ b/Easy2D/Manager/EMsgManager.cpp @@ -5,9 +5,9 @@ // 鼠标消息监听器 -e2d::EVector s_vMouseListeners; +e2d::EVector s_vMouseListeners; // 按键消息监听器 -e2d::EVector s_vKeyboardListeners; +e2d::EVector s_vKeyboardListeners; void e2d::EMsgManager::MouseProc(UINT message, WPARAM wParam, LPARAM lParam) @@ -60,20 +60,20 @@ void e2d::EMsgManager::KeyboardProc(UINT message, WPARAM wParam, LPARAM lParam) } } -void e2d::EMsgManager::bindListener(e2d::EMouseListener * listener, EScene * pParentScene, bool always /* = false */) +void e2d::EMsgManager::bindListener(e2d::EListenerMouse * listener, EScene * pParentScene, bool always /* = false */) { EMsgManager::bindListener(listener, pParentScene->getRoot(), always); } -void e2d::EMsgManager::bindListener(EKeyboardListener * listener, EScene * pParentScene, bool always /* = false */) +void e2d::EMsgManager::bindListener(EListenerKeyboard * listener, EScene * pParentScene, bool always /* = false */) { EMsgManager::bindListener(listener, pParentScene->getRoot(), always); } -void e2d::EMsgManager::bindListener(EMouseListener * listener, ENode * pParentNode, bool always /* = false */) +void e2d::EMsgManager::bindListener(EListenerMouse * listener, ENode * pParentNode, bool always /* = false */) { - WARN_IF(listener == nullptr, "EMouseListener NULL pointer exception!"); - WARN_IF(pParentNode == nullptr, "Bind EMouseListener with a NULL ENode pointer!"); + WARN_IF(listener == nullptr, "EListenerMouse NULL pointer exception!"); + WARN_IF(pParentNode == nullptr, "Bind EListenerMouse with a NULL ENode pointer!"); if (listener && pParentNode) { @@ -90,10 +90,10 @@ void e2d::EMsgManager::bindListener(EMouseListener * listener, ENode * pParentNo } } -void e2d::EMsgManager::bindListener(EKeyboardListener * listener, ENode * pParentNode, bool always /* = false */) +void e2d::EMsgManager::bindListener(EListenerKeyboard * listener, ENode * pParentNode, bool always /* = false */) { - WARN_IF(listener == nullptr, "EKeyboardListener NULL pointer exception!"); - WARN_IF(pParentNode == nullptr, "Bind EKeyboardListener with a NULL ENode pointer!"); + WARN_IF(listener == nullptr, "EListenerKeyboard NULL pointer exception!"); + WARN_IF(pParentNode == nullptr, "Bind EListenerKeyboard with a NULL ENode pointer!"); if (listener && pParentNode) { @@ -135,7 +135,7 @@ void e2d::EMsgManager::stopMouseListeners(const EString & name) void e2d::EMsgManager::delMouseListeners(const EString & name) { // 删除鼠标消息监听器 - EVector::iterator mIter; + EVector::iterator mIter; for (mIter = s_vMouseListeners.begin(); mIter != s_vMouseListeners.end();) { if ((*mIter)->getName() == name) @@ -177,7 +177,7 @@ void e2d::EMsgManager::stopKeyboardListeners(const EString & name) void e2d::EMsgManager::delKeyboardListeners(const EString & name) { // 删除按键消息监听器 - EVector::iterator kIter; + EVector::iterator kIter; for (kIter = s_vKeyboardListeners.begin(); kIter != s_vKeyboardListeners.end();) { if ((*kIter)->getName() == name) diff --git a/Easy2D/Manager/EPhysicsManager.cpp b/Easy2D/Manager/EPhysicsManager.cpp index ab4449ae..bf6cb5a9 100644 --- a/Easy2D/Manager/EPhysicsManager.cpp +++ b/Easy2D/Manager/EPhysicsManager.cpp @@ -4,7 +4,7 @@ #include "..\egeometry.h" // 监听器集合 -e2d::EVector s_vListeners; +e2d::EVector s_vListeners; // 形状集合 e2d::EVector s_vGeometries; @@ -62,15 +62,15 @@ void e2d::EPhysicsManager::PhysicsListenerProc() } } -void e2d::EPhysicsManager::bindListener(EPhysicsListener * listener, EScene * pParentScene) +void e2d::EPhysicsManager::bindListener(EListenerPhysics * listener, EScene * pParentScene) { EPhysicsManager::bindListener(listener, pParentScene->getRoot()); } -void e2d::EPhysicsManager::bindListener(EPhysicsListener * listener, ENode * pParentNode) +void e2d::EPhysicsManager::bindListener(EListenerPhysics * listener, ENode * pParentNode) { - WARN_IF(listener == nullptr, "EPhysicsListener NULL pointer exception!"); - WARN_IF(pParentNode == nullptr, "EPhysicsListener add to a NULL ENode pointer!"); + WARN_IF(listener == nullptr, "EListenerPhysics NULL pointer exception!"); + WARN_IF(pParentNode == nullptr, "EListenerPhysics add to a NULL ENode pointer!"); if (listener && pParentNode) { @@ -135,7 +135,7 @@ void e2d::EPhysicsManager::stopListeners(const EString & name) void e2d::EPhysicsManager::delListeners(const EString & name) { - EVector::iterator iter; + EVector::iterator iter; for (iter = s_vListeners.begin(); iter != s_vListeners.end();) { if ((*iter)->getName() == name) diff --git a/Easy2D/Node/EButton.cpp b/Easy2D/Node/EButton.cpp index f7402d4e..b48c4f28 100644 --- a/Easy2D/Node/EButton.cpp +++ b/Easy2D/Node/EButton.cpp @@ -109,7 +109,7 @@ void e2d::EButton::setDisable(bool disable) void e2d::EButton::setCallback(const BUTTON_CLICK_CALLBACK & callback) { - auto listener = new EMouseListener(std::bind(&EButton::_listenerCallback, this)); + auto listener = new EListenerMouse(std::bind(&EButton::_listenerCallback, this)); EMsgManager::bindListener(listener, this, true); m_Callback = callback; } diff --git a/Easy2D/Node/ENode.cpp b/Easy2D/Node/ENode.cpp index cf64bfb3..6e5b2b3f 100644 --- a/Easy2D/Node/ENode.cpp +++ b/Easy2D/Node/ENode.cpp @@ -379,14 +379,24 @@ void e2d::ENode::setPos(float x, float y) m_bTransformChildrenNeeded = true; } -void e2d::ENode::move(float x, float y) +void e2d::ENode::movePosX(float x) +{ + this->movePos(x, 0); +} + +void e2d::ENode::movePosY(float y) +{ + this->movePos(0, y); +} + +void e2d::ENode::movePos(float x, float y) { this->setPos(m_Pos.x + x, m_Pos.y + y); } -void e2d::ENode::move(const EVec & v) +void e2d::ENode::movePos(const EVec & v) { - this->move(v.x, v.y); + this->movePos(v.x, v.y); } void e2d::ENode::_setWidth(float width) diff --git a/Easy2D/Node/ESprite.cpp b/Easy2D/Node/ESprite.cpp index 09c31d21..ee2be277 100644 --- a/Easy2D/Node/ESprite.cpp +++ b/Easy2D/Node/ESprite.cpp @@ -33,13 +33,13 @@ e2d::ESprite::ESprite(const EString & imageFileName, float x, float y, float wid clip(x, y, width, height); } -e2d::ESprite::ESprite(const EString & resourceName, const EString & resourceType) +e2d::ESprite::ESprite(LPCTSTR resourceName, LPCTSTR resourceType) : ESprite() { loadFrom(resourceName, resourceType); } -e2d::ESprite::ESprite(const EString & resourceName, const EString & resourceType, float x, float y, float width, float height) +e2d::ESprite::ESprite(LPCTSTR resourceName, LPCTSTR resourceType, float x, float y, float width, float height) { loadFrom(resourceName, resourceType); clip(x, y, width, height); @@ -69,7 +69,7 @@ void e2d::ESprite::loadFrom(const EString & imageFileName) loadFrom(new ETexture(imageFileName)); } -void e2d::ESprite::loadFrom(const EString & resourceName, const EString & resourceType) +void e2d::ESprite::loadFrom(LPCTSTR resourceName, LPCTSTR resourceType) { loadFrom(new ETexture(resourceName, resourceType)); } diff --git a/Easy2D/Node/ESpriteFrame.cpp b/Easy2D/Node/ESpriteFrame.cpp index 522f7882..a8fb8dfb 100644 --- a/Easy2D/Node/ESpriteFrame.cpp +++ b/Easy2D/Node/ESpriteFrame.cpp @@ -21,7 +21,7 @@ e2d::ESpriteFrame::ESpriteFrame(const EString & imageFileName) _setTexture(new ETexture(imageFileName)); } -e2d::ESpriteFrame::ESpriteFrame(const EString & resourceName, const EString & resourceType) +e2d::ESpriteFrame::ESpriteFrame(LPCTSTR resourceName, LPCTSTR resourceType) : ESpriteFrame() { _setTexture(new ETexture(resourceName, resourceType)); @@ -41,7 +41,7 @@ e2d::ESpriteFrame::ESpriteFrame(const EString & imageFileName, float x, float y, _clipTexture(x, y, width, height); } -e2d::ESpriteFrame::ESpriteFrame(const EString & resourceName, const EString & resourceType, float x, float y, float width, float height) +e2d::ESpriteFrame::ESpriteFrame(LPCTSTR resourceName, LPCTSTR resourceType, float x, float y, float width, float height) : ESpriteFrame() { _setTexture(new ETexture(resourceName, resourceType)); diff --git a/Easy2D/Node/ETexture.cpp b/Easy2D/Node/ETexture.cpp index b4836bfb..89bf9a6c 100644 --- a/Easy2D/Node/ETexture.cpp +++ b/Easy2D/Node/ETexture.cpp @@ -35,7 +35,7 @@ e2d::ETexture::ETexture(const EString & fileName) this->loadFromFile(fileName); } -e2d::ETexture::ETexture(const EString & resourceName, const EString & resourceType) +e2d::ETexture::ETexture(LPCTSTR resourceName, LPCTSTR resourceType) { this->loadFromResource(resourceName, resourceType); } @@ -63,11 +63,11 @@ void e2d::ETexture::loadFromFile(const EString & fileName) m_pBitmap = s_mBitmapsFromFile.at(hash); } -void e2d::ETexture::loadFromResource(const EString & resourceName, const EString & resourceType) +void e2d::ETexture::loadFromResource(LPCTSTR resourceName, LPCTSTR resourceType) { - WARN_IF(resourceName.empty() || resourceType.empty(), "ETexture cannot load bitmap from NULL resource."); + WARN_IF(!resourceName || !resourceType, "ETexture cannot load bitmap from NULL resource."); - if (resourceName.empty() || resourceType.empty()) + if (!resourceName || !resourceType) return; if (!e2d::ETexture::preload(resourceName, resourceType)) @@ -77,7 +77,7 @@ void e2d::ETexture::loadFromResource(const EString & resourceName, const EString } ResKey key; - std::hash h; + std::hash h; key.resNameHash = h(resourceName); key.resTypeHash = h(resourceType); @@ -202,9 +202,9 @@ bool e2d::ETexture::preload(const EString & fileName) return SUCCEEDED(hr); } -bool e2d::ETexture::preload(const EString & resourceName, const EString & resourceType) +bool e2d::ETexture::preload(LPCTSTR resourceName, LPCTSTR resourceType) { - std::hash h; + std::hash h; ResKey key; key.resNameHash = h(resourceName); @@ -230,7 +230,7 @@ bool e2d::ETexture::preload(const EString & resourceName, const EString & resour DWORD imageFileSize = 0; // 定位资源 - imageResHandle = ::FindResourceW(HINST_THISCOMPONENT, resourceName.c_str(), resourceType.c_str()); + imageResHandle = ::FindResourceW(HINST_THISCOMPONENT, resourceName, resourceType); hr = imageResHandle ? S_OK : E_FAIL; if (SUCCEEDED(hr)) @@ -321,7 +321,7 @@ bool e2d::ETexture::preload(const EString & resourceName, const EString & resour if (SUCCEEDED(hr)) { - std::hash h; + std::hash h; ResKey key; key.resNameHash = h(resourceName); diff --git a/Easy2D/Tool/ETimer.cpp b/Easy2D/Tool/ETimer.cpp index a3a0353b..187b2509 100644 --- a/Easy2D/Tool/ETimer.cpp +++ b/Easy2D/Tool/ETimer.cpp @@ -40,7 +40,7 @@ bool e2d::ETimer::isRunning() const void e2d::ETimer::start() { m_bRunning = true; - m_tLast = GetNow(); + m_tLast = steady_clock::now(); } void e2d::ETimer::stop() diff --git a/Easy2D/Transition/ETransitionMove.cpp b/Easy2D/Transition/ETransitionMove.cpp index d2d88a4b..602b71b9 100644 --- a/Easy2D/Transition/ETransitionMove.cpp +++ b/Easy2D/Transition/ETransitionMove.cpp @@ -35,7 +35,7 @@ void e2d::ETransitionMove::_setTarget(EScene * prev, EScene * next, bool & trans } // 初始化场景属性 - next->getRoot()->move(-distPosX, -distPosY); + next->getRoot()->movePos(-distPosX, -distPosY); // 第一个场景移出 auto action1 = new EActionMoveBy(m_fMoveDuration, EVec(distPosX, distPosY)); diff --git a/Easy2D/eactions.h b/Easy2D/eactions.h index ed888cf7..6e300581 100644 --- a/Easy2D/eactions.h +++ b/Easy2D/eactions.h @@ -65,7 +65,7 @@ protected: virtual void _init(); // 执行动作 - virtual void _callOn() = 0; + virtual void _callOn(); // 获取动作结束状态 virtual bool _isEnding(); @@ -527,7 +527,8 @@ class EActionLoop : public: // 创建循环动作 EActionLoop( - EAction * action /* 执行循环的动作 */ + EAction * action, /* 执行循环的动作 */ + int times = -1 /* 循环次数 */ ); virtual ~EActionLoop(); @@ -546,7 +547,9 @@ protected: virtual void _reset() override; protected: - EAction * m_Action; + EAction * m_pAction; + int m_nTimes; + int m_nTotalTimes; }; diff --git a/Easy2D/ebase.h b/Easy2D/ebase.h index 8a8d1a13..1e6506b5 100644 --- a/Easy2D/ebase.h +++ b/Easy2D/ebase.h @@ -11,8 +11,8 @@ namespace e2d class EScene; class ENode; class EObjectManager; -class EMouseListener; -class EKeyboardListener; +class EListenerMouse; +class EListenerKeyboard; class EAction; class ETransition; @@ -109,6 +109,9 @@ public: // 获取窗口高度 static float getHeight(); + // 获取窗口大小 + static ESize getSize(); + // 获取当前场景 static EScene * getCurrentScene(); @@ -183,7 +186,7 @@ protected: EString m_sTitle; EString m_sAppName; UINT32 m_ClearColor; - LONGLONG nAnimationInterval; + LONGLONG m_nAnimationInterval; EScene * m_pCurrentScene; EScene * m_pNextScene; }; diff --git a/Easy2D/elisteners.h b/Easy2D/elisteners.h index b55fc70b..8cb7d5d1 100644 --- a/Easy2D/elisteners.h +++ b/Easy2D/elisteners.h @@ -65,23 +65,23 @@ protected: // 鼠标消息监听器 -class EMouseListener : +class EListenerMouse : public EListener { friend EMsgManager; public: - EMouseListener(); + EListenerMouse(); - EMouseListener( + EListenerMouse( const EString &name ); - EMouseListener( + EListenerMouse( const MOUSE_LISTENER_CALLBACK &callback ); - EMouseListener( + EListenerMouse( const EString &name, const MOUSE_LISTENER_CALLBACK &callback ); @@ -111,21 +111,21 @@ protected: // 鼠标按下消息监听器 -class EMousePressListener : - public EMouseListener +class EListenerMousePress : + public EListenerMouse { public: - EMousePressListener(); + EListenerMousePress(); - EMousePressListener( + EListenerMousePress( const EString &name ); - EMousePressListener( + EListenerMousePress( const MOUSE_PRESS_LISTENER_CALLBACK &callback ); - EMousePressListener( + EListenerMousePress( const EString &name, const MOUSE_PRESS_LISTENER_CALLBACK &callback ); @@ -145,21 +145,21 @@ protected: // 鼠标点击消息监听器 -class EMouseClickListener : - public EMouseListener +class EListenerMouseClick : + public EListenerMouse { public: - EMouseClickListener(); + EListenerMouseClick(); - EMouseClickListener( + EListenerMouseClick( const EString &name ); - EMouseClickListener( + EListenerMouseClick( const MOUSE_CLICK_LISTENER_CALLBACK &callback ); - EMouseClickListener( + EListenerMouseClick( const EString &name, const MOUSE_CLICK_LISTENER_CALLBACK &callback ); @@ -180,21 +180,21 @@ protected: // 鼠标点击消息监听器 -class EMouseDoubleClickListener : - public EMouseListener +class EListenerMouseDoubleClick : + public EListenerMouse { public: - EMouseDoubleClickListener(); + EListenerMouseDoubleClick(); - EMouseDoubleClickListener( + EListenerMouseDoubleClick( const EString &name ); - EMouseDoubleClickListener( + EListenerMouseDoubleClick( const MOUSE_DBLCLK_LISTENER_CALLBACK &callback ); - EMouseDoubleClickListener( + EListenerMouseDoubleClick( const EString &name, const MOUSE_DBLCLK_LISTENER_CALLBACK &callback ); @@ -215,21 +215,21 @@ protected: // 鼠标拖动消息监听器 -class EMouseDragListener : - public EMouseListener +class EListenerMouseDrag : + public EListenerMouse { public: - EMouseDragListener(); + EListenerMouseDrag(); - EMouseDragListener( + EListenerMouseDrag( const EString &name ); - EMouseDragListener( + EListenerMouseDrag( const MOUSE_DRAG_LISTENER_CALLBACK &callback ); - EMouseDragListener( + EListenerMouseDrag( const EString &name, const MOUSE_DRAG_LISTENER_CALLBACK &callback ); @@ -250,23 +250,23 @@ protected: // 按键消息监听器 -class EKeyboardListener : +class EListenerKeyboard : public EListener { friend EMsgManager; public: - EKeyboardListener(); + EListenerKeyboard(); - EKeyboardListener( + EListenerKeyboard( const EString &name ); - EKeyboardListener( + EListenerKeyboard( const KEY_LISTENER_CALLBACK &callback ); - EKeyboardListener( + EListenerKeyboard( const EString &name, const KEY_LISTENER_CALLBACK &callback ); @@ -296,23 +296,23 @@ protected: // 按键按下消息监听 -class EKeyboardPressListener : - public EKeyboardListener +class EListenerKeyboardPress : + public EListenerKeyboard { friend EMsgManager; public: - EKeyboardPressListener(); + EListenerKeyboardPress(); - EKeyboardPressListener( + EListenerKeyboardPress( const EString &name ); - EKeyboardPressListener( + EListenerKeyboardPress( const KEY_LISTENER_CALLBACK &callback ); - EKeyboardPressListener( + EListenerKeyboardPress( const EString &name, const KEY_LISTENER_CALLBACK &callback ); @@ -330,23 +330,23 @@ typedef std::function PHYSICS typedef std::function COLLISION_LISTENER_CALLBACK; // 物理世界消息监听器 -class EPhysicsListener : +class EListenerPhysics : public EListener { friend EPhysicsManager; public: - EPhysicsListener(); + EListenerPhysics(); - EPhysicsListener( + EListenerPhysics( const EString &name ); - EPhysicsListener( + EListenerPhysics( const PHYSICS_LISTENER_CALLBACK &callback ); - EPhysicsListener( + EListenerPhysics( const EString &name, const PHYSICS_LISTENER_CALLBACK &callback ); @@ -375,23 +375,23 @@ protected: }; -class EContactListener : - public EPhysicsListener +class EListenerPhysicsContact : + public EListenerPhysics { friend EMsgManager; public: - EContactListener(); + EListenerPhysicsContact(); - EContactListener( + EListenerPhysicsContact( const EString &name ); - EContactListener( + EListenerPhysicsContact( const COLLISION_LISTENER_CALLBACK &callback ); - EContactListener( + EListenerPhysicsContact( const EString &name, const COLLISION_LISTENER_CALLBACK &callback ); diff --git a/Easy2D/emanagers.h b/Easy2D/emanagers.h index 5d2462cf..bcab4adf 100644 --- a/Easy2D/emanagers.h +++ b/Easy2D/emanagers.h @@ -11,10 +11,10 @@ class EScene; class ENode; class ETimer; class EAction; -class EMouseListener; -class EKeyboardListener; +class EListenerMouse; +class EListenerKeyboard; class EGeometry; -class EPhysicsListener; +class EListenerPhysics; // 对象管理器 class EObjectManager @@ -46,14 +46,14 @@ class EMsgManager public: // 绑定鼠标消息监听器到场景 static void bindListener( - EMouseListener * listener, + EListenerMouse * listener, EScene * pParentScene, bool always = false /* 是否在游戏暂停时仍然监听 */ ); // 绑定鼠标消息监听器到节点 static void bindListener( - EMouseListener * listener, + EListenerMouse * listener, ENode * pParentNode, bool always = false /* 是否在游戏暂停时仍然监听 */ ); @@ -101,14 +101,14 @@ public: // 绑定按键消息监听器到场景 static void bindListener( - EKeyboardListener * listener, + EListenerKeyboard * listener, EScene * pParentScene, bool always = false /* 是否在游戏暂停时仍然监听 */ ); // 绑定按键消息监听器到节点 static void bindListener( - EKeyboardListener * listener, + EListenerKeyboard * listener, ENode * pParentNode, bool always = false /* 是否在游戏暂停时仍然监听 */ ); @@ -326,13 +326,13 @@ class EPhysicsManager public: // 将监听器与场景绑定 static void bindListener( - EPhysicsListener * listener, + EListenerPhysics * listener, EScene * pParentScene ); // 将监听器与节点绑定 static void bindListener( - EPhysicsListener * listener, + EListenerPhysics * listener, ENode * pParentNode ); diff --git a/Easy2D/enodes.h b/Easy2D/enodes.h index b6f993c0..2c3855b4 100644 --- a/Easy2D/enodes.h +++ b/Easy2D/enodes.h @@ -141,13 +141,23 @@ public: ); // 移动节点 - virtual void move( + virtual void movePosX( + float x + ); + + // 移动节点 + virtual void movePosY( + float y + ); + + // 移动节点 + virtual void movePos( float x, float y ); // 移动节点 - virtual void move( + virtual void movePos( const EVec & v ); @@ -396,8 +406,8 @@ public: // 读取程序资源 ETexture( - const EString & resourceName, - const EString & resourceType + LPCTSTR resourceName, + LPCTSTR resourceType ); virtual ~ETexture(); @@ -409,8 +419,8 @@ public: // 读取程序资源 void loadFromResource( - const EString & resourceName, - const EString & resourceType + LPCTSTR resourceName, + LPCTSTR resourceType ); // 获取源图片宽度 @@ -429,8 +439,8 @@ public: // 预加载资源 static bool preload( - const EString & resourceName, - const EString & resourceType + LPCTSTR resourceName, + LPCTSTR resourceType ); // 清空缓存 @@ -465,8 +475,8 @@ public: // 创建空的精灵帧 ESpriteFrame( - const EString & resourceName, - const EString & resourceType + LPCTSTR resourceName, + LPCTSTR resourceType ); // 创建空的精灵帧 @@ -489,8 +499,8 @@ public: // 创建空的精灵帧 ESpriteFrame( - const EString & resourceName, - const EString & resourceType, + LPCTSTR resourceName, + LPCTSTR resourceType, float x, float y, float width, @@ -564,14 +574,14 @@ public: // 从资源图片创建精灵 ESprite( - const EString & resourceName, - const EString & resourceType + LPCTSTR resourceName, + LPCTSTR resourceType ); // 从资源图片创建精灵并裁剪 ESprite( - const EString & resourceName, - const EString & resourceType, + LPCTSTR resourceName, + LPCTSTR resourceType, float x, float y, float width, @@ -592,8 +602,8 @@ public: // 从资源加载纹理 void loadFrom( - const EString & resourceName, - const EString & resourceType + LPCTSTR resourceName, + LPCTSTR resourceType ); // 加载纹理并裁剪