diff --git a/core/Action/Action.cpp b/core/Action/Action.cpp index 43e1b0e1..a3de133e 100644 --- a/core/Action/Action.cpp +++ b/core/Action/Action.cpp @@ -1,4 +1,5 @@ #include "..\eactions.h" +#include "..\emanagers.h" e2d::EAction::EAction() : m_bRunning(false) @@ -12,6 +13,7 @@ e2d::EAction::EAction() e2d::EAction::~EAction() { + EActionManager::__destroyAction(this); } bool e2d::EAction::isRunning() @@ -24,9 +26,10 @@ bool e2d::EAction::_isEnding() return m_bEnding; } -void e2d::EAction::start() +void e2d::EAction::startWith(ENode* pTarget) { - this->resume(); + m_bRunning = true; + m_pTarget = pTarget; } void e2d::EAction::resume() @@ -45,11 +48,6 @@ void e2d::EAction::stop() m_bEnding = true; } -void e2d::EAction::_setTarget(ENode * node) -{ - m_pTarget = node; -} - e2d::EAction * e2d::EAction::reverse() const { ASSERT(false, "EAction cannot be reversed!"); @@ -76,7 +74,7 @@ void e2d::EAction::_update() } } -void e2d::EAction::_reset() +void e2d::EAction::reset() { m_bInit = false; m_bEnding = false; diff --git a/core/Action/ActionCallback.cpp b/core/Action/ActionCallback.cpp index 910c1f49..f13ae857 100644 --- a/core/Action/ActionCallback.cpp +++ b/core/Action/ActionCallback.cpp @@ -20,8 +20,3 @@ void e2d::EActionCallback::_update() m_Callback(); this->stop(); } - -void e2d::EActionCallback::_reset() -{ - EAction::_reset(); -} diff --git a/core/Action/ActionDelay.cpp b/core/Action/ActionDelay.cpp index 4d627473..cbd05fd0 100644 --- a/core/Action/ActionDelay.cpp +++ b/core/Action/ActionDelay.cpp @@ -24,8 +24,3 @@ void e2d::EActionDelay::_update() this->stop(); } } - -void e2d::EActionDelay::_reset() -{ - EAction::_reset(); -} diff --git a/core/Action/ActionGradual.cpp b/core/Action/ActionGradual.cpp index c1fbe469..23b88ff1 100644 --- a/core/Action/ActionGradual.cpp +++ b/core/Action/ActionGradual.cpp @@ -29,8 +29,3 @@ void e2d::EActionGradual::_update() this->stop(); } } - -void e2d::EActionGradual::_reset() -{ - EAction::_reset(); -} diff --git a/core/Action/ActionLoop.cpp b/core/Action/ActionLoop.cpp index 00862ffb..a447e991 100644 --- a/core/Action/ActionLoop.cpp +++ b/core/Action/ActionLoop.cpp @@ -22,7 +22,7 @@ e2d::EActionLoop * e2d::EActionLoop::clone() const void e2d::EActionLoop::_init() { EAction::_init(); - m_pAction->_setTarget(m_pTarget); + m_pAction->m_pTarget = m_pTarget; m_pAction->_init(); } @@ -42,16 +42,16 @@ void e2d::EActionLoop::_update() { m_nTimes++; - EAction::_reset(); - m_pAction->_reset(); + EAction::reset(); + m_pAction->reset(); } } -void e2d::EActionLoop::_reset() +void e2d::EActionLoop::reset() { - EAction::_reset(); + EAction::reset(); - m_pAction->_reset(); + m_pAction->reset(); m_nTimes = 0; } diff --git a/core/Action/ActionMoveBy.cpp b/core/Action/ActionMoveBy.cpp index e6813c83..52007493 100644 --- a/core/Action/ActionMoveBy.cpp +++ b/core/Action/ActionMoveBy.cpp @@ -33,11 +33,6 @@ void e2d::EActionMoveBy::_update() ); } -void e2d::EActionMoveBy::_reset() -{ - EActionGradual::_reset(); -} - e2d::EActionMoveBy * e2d::EActionMoveBy::clone() const { return new EActionMoveBy(m_fDuration, m_MoveVec); diff --git a/core/Action/ActionMoveTo.cpp b/core/Action/ActionMoveTo.cpp index b4728f9b..d29074f8 100644 --- a/core/Action/ActionMoveTo.cpp +++ b/core/Action/ActionMoveTo.cpp @@ -16,8 +16,3 @@ void e2d::EActionMoveTo::_init() EActionMoveBy::_init(); m_MoveVec = m_EndPos - m_BeginPos; } - -void e2d::EActionMoveTo::_reset() -{ - EActionMoveBy::_reset(); -} diff --git a/core/Action/ActionOpacityBy.cpp b/core/Action/ActionOpacityBy.cpp index a8023b54..d1973a53 100644 --- a/core/Action/ActionOpacityBy.cpp +++ b/core/Action/ActionOpacityBy.cpp @@ -29,11 +29,6 @@ void e2d::EActionOpacityBy::_update() m_pTarget->setOpacity(m_nBeginVal + m_nVariation * m_fRateOfProgress); } -void e2d::EActionOpacityBy::_reset() -{ - EActionGradual::_reset(); -} - e2d::EActionOpacityBy * e2d::EActionOpacityBy::clone() const { return new EActionOpacityBy(m_fDuration, m_nVariation); diff --git a/core/Action/ActionOpacityTo.cpp b/core/Action/ActionOpacityTo.cpp index 97b79acd..3eeae969 100644 --- a/core/Action/ActionOpacityTo.cpp +++ b/core/Action/ActionOpacityTo.cpp @@ -17,8 +17,3 @@ void e2d::EActionOpacityTo::_init() EActionOpacityBy::_init(); m_nVariation = m_nEndVal - m_nBeginVal; } - -void e2d::EActionOpacityTo::_reset() -{ - EActionOpacityBy::_reset(); -} diff --git a/core/Action/ActionRotateBy.cpp b/core/Action/ActionRotateBy.cpp index d6346cc1..5d700a39 100644 --- a/core/Action/ActionRotateBy.cpp +++ b/core/Action/ActionRotateBy.cpp @@ -30,11 +30,6 @@ void e2d::EActionRotateBy::_update() m_pTarget->setRotation(m_nBeginVal + m_nVariation * m_fRateOfProgress); } -void e2d::EActionRotateBy::_reset() -{ - EActionGradual::_reset(); -} - e2d::EActionRotateBy * e2d::EActionRotateBy::clone() const { return new EActionRotateBy(m_fDuration, m_nVariation); diff --git a/core/Action/ActionRotateTo.cpp b/core/Action/ActionRotateTo.cpp index 92059a83..1405a4bd 100644 --- a/core/Action/ActionRotateTo.cpp +++ b/core/Action/ActionRotateTo.cpp @@ -17,8 +17,3 @@ void e2d::EActionRotateTo::_init() EActionRotateBy::_init(); m_nVariation = m_nEndVal - m_nBeginVal; } - -void e2d::EActionRotateTo::_reset() -{ - EActionRotateBy::_reset(); -} diff --git a/core/Action/ActionScaleBy.cpp b/core/Action/ActionScaleBy.cpp index 1fe86644..525c4217 100644 --- a/core/Action/ActionScaleBy.cpp +++ b/core/Action/ActionScaleBy.cpp @@ -41,11 +41,6 @@ void e2d::EActionScaleBy::_update() m_nBeginScaleX + m_nVariationX * m_fRateOfProgress); } -void e2d::EActionScaleBy::_reset() -{ - EActionGradual::_reset(); -} - e2d::EActionScaleBy * e2d::EActionScaleBy::clone() const { return new EActionScaleBy(m_fDuration, m_nVariationX, m_nVariationY); diff --git a/core/Action/ActionScaleTo.cpp b/core/Action/ActionScaleTo.cpp index cb1decd1..50cef18b 100644 --- a/core/Action/ActionScaleTo.cpp +++ b/core/Action/ActionScaleTo.cpp @@ -25,8 +25,3 @@ void e2d::EActionScaleTo::_init() m_nVariationX = m_nEndScaleX - m_nBeginScaleX; m_nVariationY = m_nEndScaleY - m_nBeginScaleY; } - -void e2d::EActionScaleTo::_reset() -{ - EActionScaleBy::_reset(); -} diff --git a/core/Action/ActionSequence.cpp b/core/Action/ActionSequence.cpp index ae9fd260..ba2d7c7f 100644 --- a/core/Action/ActionSequence.cpp +++ b/core/Action/ActionSequence.cpp @@ -35,7 +35,7 @@ void e2d::EActionSequence::_init() { for (auto action : m_vActions) { - action->_setTarget(m_pTarget); + action->m_pTarget = m_pTarget; } } // 初始化第一个动作 @@ -63,12 +63,12 @@ void e2d::EActionSequence::_update() } } -void e2d::EActionSequence::_reset() +void e2d::EActionSequence::reset() { - EAction::_reset(); + EAction::reset(); for (auto action : m_vActions) { - action->_reset(); + action->reset(); } m_nActionIndex = 0; } diff --git a/core/Action/ActionTwo.cpp b/core/Action/ActionTwo.cpp index b2d5f204..be7db8c0 100644 --- a/core/Action/ActionTwo.cpp +++ b/core/Action/ActionTwo.cpp @@ -35,8 +35,8 @@ e2d::EActionTwo * e2d::EActionTwo::reverse(bool actionReverse) const void e2d::EActionTwo::_init() { EAction::_init(); - m_pFirstAction->_setTarget(m_pTarget); - m_pSecondAction->_setTarget(m_pTarget); + m_pFirstAction->m_pTarget = m_pTarget; + m_pSecondAction->m_pTarget = m_pTarget; m_pFirstAction->_init(); } @@ -64,12 +64,12 @@ void e2d::EActionTwo::_update() } } -void e2d::EActionTwo::_reset() +void e2d::EActionTwo::reset() { - EAction::_reset(); + EAction::reset(); - m_pFirstAction->_reset(); - m_pSecondAction->_reset(); + m_pFirstAction->reset(); + m_pSecondAction->reset(); } void e2d::EActionTwo::_resetTime() diff --git a/core/Action/ActionTwoAtSameTime.cpp b/core/Action/ActionTwoAtSameTime.cpp index ddfa08c5..f8a96619 100644 --- a/core/Action/ActionTwoAtSameTime.cpp +++ b/core/Action/ActionTwoAtSameTime.cpp @@ -35,8 +35,8 @@ e2d::EActionTwoAtSameTime * e2d::EActionTwoAtSameTime::reverse(bool actionRevers void e2d::EActionTwoAtSameTime::_init() { EAction::_init(); - m_pFirstAction->_setTarget(m_pTarget); - m_pSecondAction->_setTarget(m_pTarget); + m_pFirstAction->m_pTarget = m_pTarget; + m_pSecondAction->m_pTarget = m_pTarget; m_pFirstAction->_init(); m_pSecondAction->_init(); @@ -63,12 +63,12 @@ void e2d::EActionTwoAtSameTime::_update() } } -void e2d::EActionTwoAtSameTime::_reset() +void e2d::EActionTwoAtSameTime::reset() { - EAction::_reset(); + EAction::reset(); - m_pFirstAction->_reset(); - m_pSecondAction->_reset(); + m_pFirstAction->reset(); + m_pSecondAction->reset(); } void e2d::EActionTwoAtSameTime::_resetTime() diff --git a/core/Action/Animation.cpp b/core/Action/Animation.cpp index 05aa6d9a..8c2a0327 100644 --- a/core/Action/Animation.cpp +++ b/core/Action/Animation.cpp @@ -2,14 +2,12 @@ e2d::EAnimation::EAnimation() : m_nFrameIndex(0) - , m_pTarget(nullptr) { } e2d::EAnimation::EAnimation(float invertal) : m_nFrameIndex(0) , m_fInterval(invertal) - , m_pTarget(nullptr) { } @@ -47,7 +45,7 @@ void e2d::EAnimation::_update() // 重新记录时间 m_fLast += m_fInterval; // 加载关键帧 - m_pTarget->loadFrom(m_vFrames[m_nFrameIndex]); + static_cast(m_pTarget)->loadFrom(m_vFrames[m_nFrameIndex]); m_nFrameIndex++; // 判断动作是否结束 if (m_nFrameIndex == m_vFrames.size()) @@ -58,17 +56,12 @@ void e2d::EAnimation::_update() } } -void e2d::EAnimation::_reset() +void e2d::EAnimation::reset() { - EAction::_reset(); + EAction::reset(); m_nFrameIndex = 0; } -void e2d::EAnimation::_setTarget(ENode * node) -{ - m_pTarget = static_cast(node); -} - void e2d::EAnimation::addKeyframe(EImage * frame) { if (frame) diff --git a/core/Manager/ActionManager.cpp b/core/Manager/ActionManager.cpp index 7e2cbbda..42b9bbc6 100644 --- a/core/Manager/ActionManager.cpp +++ b/core/Manager/ActionManager.cpp @@ -4,15 +4,15 @@ static std::vector s_vActions; -void e2d::EActionManager::addAction(EAction * action) +void e2d::EActionManager::addAction(EAction * pAction, ENode * pTargetNode) { - WARN_IF(action == nullptr, "EAction NULL pointer exception!"); + WARN_IF(pAction == nullptr, "EAction NULL pointer exception!"); - if (action) + if (pAction) { - action->start(); - action->retain(); - s_vActions.push_back(action); + pAction->startWith(pTargetNode); + pAction->retain(); + s_vActions.push_back(pAction); } } @@ -24,7 +24,7 @@ void e2d::EActionManager::resumeAllActionsBindedWith(ENode * pTargetNode) { if (action->getTarget() == pTargetNode) { - action->start(); + action->resume(); } } for (auto child : pTargetNode->getChildren()) @@ -90,6 +90,18 @@ void e2d::EActionManager::__clearAllActionsBindedWith(ENode * pTargetNode) } } +void e2d::EActionManager::__destroyAction(EAction * pAction) +{ + for (size_t i = 0; i < s_vActions.size(); i++) + { + if (pAction == s_vActions[i]) + { + s_vActions.erase(s_vActions.begin() + i); + return; + } + } +} + void e2d::EActionManager::resumeAllActions() { for (auto child : ESceneManager::getCurrentScene()->getRoot()->getChildren()) @@ -128,18 +140,17 @@ void e2d::EActionManager::__update() return; // 循环遍历所有正在运行的动作 - for (size_t i = 0; i < s_vActions.size(); i++) + for (auto &action : s_vActions) { - auto &action = s_vActions[i]; // 获取动作运行状态 - if (action->isRunning() || - (action->getTarget() && action->getTarget()->getParentScene() == ESceneManager::getCurrentScene())) + if (action->isRunning() && + action->getTarget() && + action->getTarget()->getParentScene() == ESceneManager::getCurrentScene()) { if (action->_isEnding()) { // 动作已经结束 - SafeRelease(&action); - s_vActions.erase(s_vActions.begin() + i); + action->release(); } else { diff --git a/core/Node/Node.cpp b/core/Node/Node.cpp index 1adc5372..8b49c04c 100644 --- a/core/Node/Node.cpp +++ b/core/Node/Node.cpp @@ -721,16 +721,23 @@ void e2d::ENode::clearAllChildren() void e2d::ENode::runAction(EAction * action) { - WARN_IF( - action->getTarget() != nullptr, - "The action is already running, The clone of the action will be created automatically!" - ); - if (action->getTarget()) + if (this != action->getTarget()) { - action = action->clone(); + WARN_IF( + nullptr != action->getTarget(), + "The action has already got a target, The clone of the action will be created automatically!" + ); + + if (nullptr != action->getTarget()) + { + action = action->clone(); + } + EActionManager::addAction(action, this); + } + else + { + action->reset(); } - action->_setTarget(this); - EActionManager::addAction(action); } void e2d::ENode::resumeAction(EAction * action) diff --git a/core/eactions.h b/core/eactions.h index 5622bc9c..06d98a8b 100644 --- a/core/eactions.h +++ b/core/eactions.h @@ -4,7 +4,7 @@ namespace e2d { -class ENode; + class EActionManager; class EActionTwo; class EActionLoop; @@ -15,7 +15,6 @@ class ETransitionFade; class EAction : public EObject { - friend ENode; friend EActionManager; friend EActionTwo; friend EActionLoop; @@ -30,8 +29,10 @@ public: // 获取动作运行状态 virtual bool isRunning(); - // 继续动作 - virtual void start(); + // 开始动作 + virtual void startWith( + ENode* pTarget /* 执行该动作的目标 */ + ); // 继续动作 virtual void resume(); @@ -48,7 +49,10 @@ public: // 获取一个新的逆向动作 virtual EAction * reverse() const; - // 获取执行该动作的目标 + // 重置动作 + virtual void reset(); + + // 获取该动作的执行目标 virtual ENode * getTarget(); protected: @@ -61,17 +65,9 @@ protected: // 获取动作结束状态 virtual bool _isEnding(); - // 重置动作 - virtual void _reset(); - // 重置动画时间 virtual void _resetTime(); - // 设置动作执行目标 - virtual void _setTarget( - ENode * node - ); - protected: bool m_bRunning; bool m_bEnding; @@ -98,9 +94,6 @@ protected: // 更新动画 virtual void _update() override; - // 重置动画 - virtual void _reset() override; - protected: float m_fDuration; float m_fRateOfProgress; @@ -130,11 +123,8 @@ protected: // 执行动画 virtual void _update() override; - // 重置动画 - virtual void _reset() override; - protected: - EPoint m_BeginPos; + EPoint m_BeginPos; EVector2 m_MoveVec; }; @@ -156,9 +146,6 @@ protected: // 初始化动画 virtual void _init() override; - // 重置动画 - virtual void _reset() override; - protected: EPoint m_EndPos; }; @@ -194,9 +181,6 @@ protected: // 执行动画 virtual void _update() override; - // 重置动画 - virtual void _reset() override; - protected: float m_nBeginScaleX; float m_nBeginScaleY; @@ -229,9 +213,6 @@ protected: // 初始化动画 virtual void _init() override; - // 重置动画 - virtual void _reset() override; - protected: float m_nEndScaleX; float m_nEndScaleY; @@ -261,9 +242,6 @@ protected: // 执行动画 virtual void _update() override; - // 重置动画 - virtual void _reset() override; - protected: float m_nBeginVal; float m_nVariation; @@ -287,9 +265,6 @@ protected: // 初始化动画 virtual void _init() override; - // 重置动画 - virtual void _reset() override; - protected: float m_nEndVal; }; @@ -340,9 +315,6 @@ protected: // 执行动画 virtual void _update() override; - // 重置动画 - virtual void _reset() override; - protected: float m_nBeginVal; float m_nVariation; @@ -366,9 +338,6 @@ protected: // 初始化动画 virtual void _init() override; - // 重置动画 - virtual void _reset() override; - protected: float m_nEndVal; }; @@ -394,6 +363,9 @@ public: bool actionReverse = true /* 子动作是否执行逆动作 */ ) const; + // 重置动作 + virtual void reset() override; + protected: // 初始化动作 virtual void _init() override; @@ -401,9 +373,6 @@ protected: // 执行动作 virtual void _update() override; - // 重置动作 - virtual void _reset() override; - // 重置动画时间 virtual void _resetTime() override; @@ -442,6 +411,9 @@ public: bool actionReverse = true /* 子动作是否执行逆动作 */ ) const; + // 重置动作 + virtual void reset() override; + protected: // 初始化动作 virtual void _init() override; @@ -449,9 +421,6 @@ protected: // 执行动作 virtual void _update() override; - // 重置动作 - virtual void _reset() override; - // 重置动画时间 virtual void _resetTime() override; @@ -480,9 +449,6 @@ protected: // 执行动作 virtual void _update() override; - // 重置动作 - virtual void _reset() override; - protected: float m_fDelayTime; }; @@ -508,6 +474,9 @@ public: bool actionReverse = true /* 子动作是否执行逆动作 */ ) const; + // 重置动作 + virtual void reset() override; + protected: // 初始化动作 virtual void _init() override; @@ -515,9 +484,6 @@ protected: // 执行动作 virtual void _update() override; - // 重置动作 - virtual void _reset() override; - // 重置动画时间 virtual void _resetTime() override; @@ -542,6 +508,9 @@ public: // 获取该动作的拷贝对象 virtual EActionLoop * clone() const override; + // 重置动作 + virtual void reset() override; + protected: // 初始化动作 virtual void _init() override; @@ -549,9 +518,6 @@ protected: // 执行动作 virtual void _update() override; - // 重置动作 - virtual void _reset() override; - // 重置动画时间 virtual void _resetTime() override; @@ -592,6 +558,9 @@ public: // 获取该动画的逆动画 virtual EAnimation * reverse() const override; + // 重置动作 + virtual void reset() override; + protected: // 初始化动作 virtual void _init() override; @@ -599,18 +568,9 @@ protected: // 执行动作 virtual void _update() override; - // 重置动作 - virtual void _reset() override; - - // 设置动作执行目标 - virtual void _setTarget( - ENode * node - ) override; - protected: - float m_fInterval; - UINT m_nFrameIndex; - ESprite* m_pTarget; + float m_fInterval; + UINT m_nFrameIndex; std::vector m_vFrames; }; @@ -634,9 +594,6 @@ protected: // 执行动作 virtual void _update() override; - // 重置动作 - virtual void _reset() override; - protected: std::function m_Callback; }; diff --git a/core/emanagers.h b/core/emanagers.h index 14e193f5..ea68844d 100644 --- a/core/emanagers.h +++ b/core/emanagers.h @@ -156,11 +156,13 @@ class EActionManager { friend EGame; friend ENode; + friend EAction; public: // 添加动作 static void addAction( - EAction * action + EAction * pAction, + ENode * pTargetNode ); // 继续绑定在节点上的所有动作 @@ -196,6 +198,11 @@ private: ENode * pTargetNode ); + // 删除指定的动作 + static void __destroyAction( + EAction * pAction + ); + // 重置所有动作状态 static void __resetAllActions(); };