diff --git a/Easy2D/Action/Action.cpp b/Easy2D/Action/Action.cpp index d2c008d3..d344d030 100644 --- a/Easy2D/Action/Action.cpp +++ b/Easy2D/Action/Action.cpp @@ -8,6 +8,8 @@ Action::Action() : { // 默认动作 15ms 运行一次 setInterval(15); + // 保留动作 + this->retain(); } Action::~Action() diff --git a/Easy2D/Action/ActionCallback.cpp b/Easy2D/Action/ActionCallback.cpp index d3bb6c0e..ddd45803 100644 --- a/Easy2D/Action/ActionCallback.cpp +++ b/Easy2D/Action/ActionCallback.cpp @@ -9,7 +9,7 @@ ActionCallback::~ActionCallback() { } -ActionCallback * ActionCallback::copy() +ActionCallback * ActionCallback::copy() const { return new ActionCallback(m_Callback); } diff --git a/Easy2D/Action/ActionDelay.cpp b/Easy2D/Action/ActionDelay.cpp index 6c546eb8..219af36b 100644 --- a/Easy2D/Action/ActionDelay.cpp +++ b/Easy2D/Action/ActionDelay.cpp @@ -9,9 +9,9 @@ ActionDelay::~ActionDelay() { } -ActionDelay * easy2d::ActionDelay::copy() +ActionDelay * ActionDelay::copy() const { - return new ActionDelay(*this); + return new ActionDelay(m_nMilliSeconds / 1000.0f); } void ActionDelay::_init() diff --git a/Easy2D/Action/ActionFrames.cpp b/Easy2D/Action/ActionFrames.cpp index 225189ea..aac762a0 100644 --- a/Easy2D/Action/ActionFrames.cpp +++ b/Easy2D/Action/ActionFrames.cpp @@ -7,6 +7,12 @@ ActionFrames::ActionFrames() : setInterval(500); } +ActionFrames::ActionFrames(UINT frameDelay) : + m_nFrameIndex(0) +{ + setInterval(frameDelay); +} + ActionFrames::~ActionFrames() { for (auto frame : m_vFrames) @@ -33,6 +39,7 @@ bool ActionFrames::_exec(LARGE_INTEGER nNow) m_nLast.QuadPart = nNow.QuadPart - (nNow.QuadPart % m_nAnimationInterval.QuadPart); m_pParent->setImage(m_vFrames[m_nFrameIndex]); m_nFrameIndex++; + // 判断动作是否结束 if (m_nFrameIndex == m_vFrames.size()) { return true; @@ -55,9 +62,9 @@ void ActionFrames::addFrame(Image * frame) } } -ActionFrames * ActionFrames::copy() +ActionFrames * ActionFrames::copy() const { - auto a = new ActionFrames(); + auto a = new ActionFrames(this->m_nMilliSeconds); for (auto f : m_vFrames) { a->addFrame(f); @@ -67,8 +74,7 @@ ActionFrames * ActionFrames::copy() ActionFrames * ActionFrames::reverse() const { - auto a = new ActionFrames(); - a->m_vFrames = this->m_vFrames; + auto a = this->copy(); a->m_vFrames.reserve(m_vFrames.size()); return a; } diff --git a/Easy2D/Action/ActionMoveBy.cpp b/Easy2D/Action/ActionMoveBy.cpp index 7859ca47..62845117 100644 --- a/Easy2D/Action/ActionMoveBy.cpp +++ b/Easy2D/Action/ActionMoveBy.cpp @@ -29,7 +29,7 @@ bool ActionMoveBy::_exec(LARGE_INTEGER nNow) m_pParent->setPos(int(m_BeginPos.x + m_MoveVector.x * scale), int(m_BeginPos.y + m_MoveVector.y * scale)); // 判断动作是否结束 - if (m_nDuration >= m_nTotalDuration) + if (_isEnd()) { return true; } @@ -42,11 +42,9 @@ void ActionMoveBy::_reset() Animation::_reset(); } -ActionMoveBy * ActionMoveBy::copy() +ActionMoveBy * ActionMoveBy::copy() const { - auto a = new ActionMoveBy(*this); - a->_reset(); - return a; + return new ActionMoveBy(m_nMilliSeconds / 1000.0f, m_MoveVector); } ActionMoveBy * ActionMoveBy::reverse() const diff --git a/Easy2D/Action/ActionMoveTo.cpp b/Easy2D/Action/ActionMoveTo.cpp index cc9830fe..0f9c021e 100644 --- a/Easy2D/Action/ActionMoveTo.cpp +++ b/Easy2D/Action/ActionMoveTo.cpp @@ -10,11 +10,9 @@ ActionMoveTo::~ActionMoveTo() { } -ActionMoveTo * ActionMoveTo::copy() +ActionMoveTo * ActionMoveTo::copy() const { - auto a = new ActionMoveTo(*this); - a->_reset(); - return a; + return new ActionMoveTo(m_nMilliSeconds / 1000.0f, m_EndPos); } void ActionMoveTo::_init() diff --git a/Easy2D/Action/ActionNeverStop.cpp b/Easy2D/Action/ActionNeverStop.cpp index ffa82eeb..72c57bf3 100644 --- a/Easy2D/Action/ActionNeverStop.cpp +++ b/Easy2D/Action/ActionNeverStop.cpp @@ -11,7 +11,7 @@ ActionNeverStop::~ActionNeverStop() SAFE_RELEASE(m_Action); } -ActionNeverStop * ActionNeverStop::copy() +ActionNeverStop * ActionNeverStop::copy() const { return new ActionNeverStop(m_Action->copy()); } diff --git a/Easy2D/Action/ActionOpacityBy.cpp b/Easy2D/Action/ActionOpacityBy.cpp index f1838340..cfaea704 100644 --- a/Easy2D/Action/ActionOpacityBy.cpp +++ b/Easy2D/Action/ActionOpacityBy.cpp @@ -28,7 +28,7 @@ bool ActionOpacityBy::_exec(LARGE_INTEGER nNow) // 移动 Sprite m_pParent->setOpacity(m_nBeginVal + m_nVariation * scale); // 判断动作是否结束 - if (m_nDuration >= m_nTotalDuration) + if (_isEnd()) { return true; } @@ -41,11 +41,9 @@ void ActionOpacityBy::_reset() Animation::_reset(); } -ActionOpacityBy * ActionOpacityBy::copy() +ActionOpacityBy * ActionOpacityBy::copy() const { - auto a = new ActionOpacityBy(*this); - a->_reset(); - return a; + return new ActionOpacityBy(m_nMilliSeconds / 1000.0f, m_nVariation); } ActionOpacityBy * ActionOpacityBy::reverse() const diff --git a/Easy2D/Action/ActionOpacityTo.cpp b/Easy2D/Action/ActionOpacityTo.cpp index 87feb328..3c413005 100644 --- a/Easy2D/Action/ActionOpacityTo.cpp +++ b/Easy2D/Action/ActionOpacityTo.cpp @@ -10,11 +10,9 @@ ActionOpacityTo::~ActionOpacityTo() { } -ActionOpacityTo * ActionOpacityTo::copy() +ActionOpacityTo * ActionOpacityTo::copy() const { - auto a = new ActionOpacityTo(*this); - a->_reset(); - return a; + return new ActionOpacityTo(m_nMilliSeconds / 1000.0f, m_nEndVal); } void ActionOpacityTo::_init() diff --git a/Easy2D/Action/ActionScaleBy.cpp b/Easy2D/Action/ActionScaleBy.cpp index 0ef21217..689b1d7b 100644 --- a/Easy2D/Action/ActionScaleBy.cpp +++ b/Easy2D/Action/ActionScaleBy.cpp @@ -30,7 +30,7 @@ bool ActionScaleBy::_exec(LARGE_INTEGER nNow) // 移动 Sprite m_pParent->setScale(m_nBeginScaleX + m_nVariationX * scale, m_nBeginScaleX + m_nVariationX * scale); // 判断动作是否结束 - if (m_nDuration >= m_nTotalDuration) + if (_isEnd()) { return true; } @@ -43,11 +43,9 @@ void ActionScaleBy::_reset() Animation::_reset(); } -ActionScaleBy * ActionScaleBy::copy() +ActionScaleBy * ActionScaleBy::copy() const { - auto a = new ActionScaleBy(*this); - a->_reset(); - return a; + return new ActionScaleBy(m_nMilliSeconds / 1000.0f, m_nVariationX, m_nVariationY); } ActionScaleBy * ActionScaleBy::reverse() const diff --git a/Easy2D/Action/ActionScaleTo.cpp b/Easy2D/Action/ActionScaleTo.cpp index b4324e37..031d7ec3 100644 --- a/Easy2D/Action/ActionScaleTo.cpp +++ b/Easy2D/Action/ActionScaleTo.cpp @@ -11,11 +11,9 @@ ActionScaleTo::~ActionScaleTo() { } -ActionScaleTo * ActionScaleTo::copy() +ActionScaleTo * ActionScaleTo::copy() const { - auto a = new ActionScaleTo(*this); - a->_reset(); - return a; + return new ActionScaleTo(m_nMilliSeconds / 1000.0f, m_nEndScaleX, m_nEndScaleY); } void ActionScaleTo::_init() diff --git a/Easy2D/Action/ActionSequence.cpp b/Easy2D/Action/ActionSequence.cpp index a0fc8773..8ed1ae43 100644 --- a/Easy2D/Action/ActionSequence.cpp +++ b/Easy2D/Action/ActionSequence.cpp @@ -1,6 +1,11 @@ #include "..\easy2d.h" #include +ActionSequence::ActionSequence() : + m_nActionIndex(0) +{ +} + ActionSequence::ActionSequence(int number, Action * action1, ...) : m_nActionIndex(0) { @@ -9,9 +14,7 @@ ActionSequence::ActionSequence(int number, Action * action1, ...) : while (number > 0) { - Action* arg = va_arg(params, Action*); - arg->retain(); - m_vActions.push_back(arg); + this->addAction(va_arg(params, Action*)); number--; } @@ -64,26 +67,37 @@ void ActionSequence::_reset() m_nActionIndex = 0; } -ActionSequence * ActionSequence::copy() +void ActionSequence::addAction(Action * action) { - auto a = new ActionSequence(*this); - a->_reset(); + m_vActions.push_back(action); + action->retain(); +} + +ActionSequence * ActionSequence::copy() const +{ + auto a = new ActionSequence(); + for (auto action : m_vActions) + { + a->addAction(action->copy()); + } return a; } -ActionSequence * ActionSequence::reverse() const +ActionSequence * ActionSequence::reverse(bool actionReverse) const { - // 复制一个相同的动作 - auto a = new ActionSequence(*this); - a->_reset(); - a->m_bRunning = true; - a->m_bStop = false; - // 将动作顺序逆序排列 - a->m_vActions.reserve(m_vActions.size()); - // 将所有动作逆向运行 + auto a = new ActionSequence(); for (auto action : a->m_vActions) { - action->reverse(); + if (actionReverse) + { + a->addAction(action->reverse()); + } + else + { + a->addAction(action->copy()); + } } + // 将动作顺序逆序排列 + a->m_vActions.reserve(m_vActions.size()); return a; } \ No newline at end of file diff --git a/Easy2D/Action/ActionTwo.cpp b/Easy2D/Action/ActionTwo.cpp index 82b45c6a..3003c113 100644 --- a/Easy2D/Action/ActionTwo.cpp +++ b/Easy2D/Action/ActionTwo.cpp @@ -14,16 +14,21 @@ ActionTwo::~ActionTwo() SAFE_RELEASE(m_SecondAction); } -ActionTwo * ActionTwo::copy() +ActionTwo * ActionTwo::copy() const { - auto a = new ActionTwo(*this); - a->_reset(); - return a; + return new ActionTwo(m_FirstAction->copy(), m_SecondAction->copy()); } -ActionTwo * ActionTwo::reverse() const +ActionTwo * ActionTwo::reverse(bool actionReverse) const { - return new ActionTwo(m_SecondAction->copy(), m_FirstAction->copy()); + if (actionReverse) + { + return new ActionTwo(m_SecondAction->reverse(), m_FirstAction->reverse()); + } + else + { + return new ActionTwo(m_SecondAction->copy(), m_FirstAction->copy()); + } } void ActionTwo::_init() diff --git a/Easy2D/Action/Animation.cpp b/Easy2D/Action/Animation.cpp index c5901a1c..cea441e0 100644 --- a/Easy2D/Action/Animation.cpp +++ b/Easy2D/Action/Animation.cpp @@ -10,6 +10,11 @@ Animation::~Animation() { } +bool Animation::_isEnd() const +{ + return m_nDuration >= m_nTotalDuration; +} + void Animation::_init() { // 记录当前时间 diff --git a/Easy2D/Tool/ActionManager.cpp b/Easy2D/Tool/ActionManager.cpp index bbcd1440..344f0160 100644 --- a/Easy2D/Tool/ActionManager.cpp +++ b/Easy2D/Tool/ActionManager.cpp @@ -1,4 +1,5 @@ #include "..\easy2d.h" +#include static std::vector s_vActions; @@ -28,9 +29,14 @@ void ActionManager::addAction(Action * action) { if (action) { - action->_init(); +#ifdef _DEBUG + for (auto a : s_vActions) + { + assert(a != action); + } +#endif s_vActions.push_back(action); - action->retain(); + action->_init(); } } diff --git a/Easy2D/easy2d.h b/Easy2D/easy2d.h index 051d29c3..707848bc 100644 --- a/Easy2D/easy2d.h +++ b/Easy2D/easy2d.h @@ -1044,7 +1044,7 @@ public: void pause(); void stop(); void setInterval(UINT ms); - virtual Action * copy() = 0; + virtual Action * copy() const = 0; virtual Action * reverse() const; protected: @@ -1073,6 +1073,7 @@ protected: UINT m_nTotalDuration; protected: + bool _isEnd() const; virtual void _init() override; virtual bool _exec(LARGE_INTEGER nNow) override; virtual void _reset() override; @@ -1085,7 +1086,7 @@ public: ActionMoveBy(float duration, CVector vec); virtual ~ActionMoveBy(); - virtual ActionMoveBy * copy() override; + virtual ActionMoveBy * copy() const override; virtual ActionMoveBy * reverse() const override; protected: @@ -1105,7 +1106,7 @@ public: ActionMoveTo(float duration, CPoint pos); virtual ~ActionMoveTo(); - virtual ActionMoveTo * copy() override; + virtual ActionMoveTo * copy() const override; protected: CPoint m_EndPos; @@ -1122,7 +1123,7 @@ public: ActionScaleBy(float duration, float scaleX, float scaleY); virtual ~ActionScaleBy(); - virtual ActionScaleBy * copy() override; + virtual ActionScaleBy * copy() const override; virtual ActionScaleBy * reverse() const override; protected: @@ -1144,7 +1145,7 @@ public: ActionScaleTo(float duration, float scaleX, float scaleY); virtual ~ActionScaleTo(); - virtual ActionScaleTo * copy() override; + virtual ActionScaleTo * copy() const override; protected: float m_nEndScaleX; @@ -1162,7 +1163,7 @@ public: ActionOpacityBy(float duration, float opacity); virtual ~ActionOpacityBy(); - virtual ActionOpacityBy * copy() override; + virtual ActionOpacityBy * copy() const override; virtual ActionOpacityBy * reverse() const override; protected: @@ -1182,7 +1183,7 @@ public: ActionOpacityTo(float duration, float opacity); virtual ~ActionOpacityTo(); - virtual ActionOpacityTo * copy() override; + virtual ActionOpacityTo * copy() const override; protected: float m_nEndVal; @@ -1213,8 +1214,8 @@ public: ActionTwo(Action * actionFirst, Action * actionSecond); virtual ~ActionTwo(); - virtual ActionTwo * copy() override; - virtual ActionTwo * reverse() const override; + virtual ActionTwo * copy() const override; + virtual ActionTwo * reverse(bool actionReverse = true) const; protected: Action * m_FirstAction; @@ -1230,11 +1231,13 @@ class ActionSequence : public Action { public: + ActionSequence(); ActionSequence(int number, Action * action1, ...); virtual ~ActionSequence(); - virtual ActionSequence * copy() override; - virtual ActionSequence * reverse() const override; + void addAction(Action * action); + virtual ActionSequence * copy() const override; + virtual ActionSequence * reverse(bool actionReverse = true) const; protected: UINT m_nActionIndex; @@ -1253,7 +1256,7 @@ public: ActionDelay(float duration); virtual ~ActionDelay(); - virtual ActionDelay * copy() override; + virtual ActionDelay * copy() const override; protected: virtual void _init() override; @@ -1268,7 +1271,7 @@ public: ActionNeverStop(Action * action); virtual ~ActionNeverStop(); - virtual ActionNeverStop * copy() override; + virtual ActionNeverStop * copy() const override; protected: Action * m_Action; @@ -1284,10 +1287,11 @@ class ActionFrames : { public: ActionFrames(); + ActionFrames(UINT frameDelay); ~ActionFrames(); void addFrame(Image * frame); - virtual ActionFrames * copy() override; + virtual ActionFrames * copy() const override; virtual ActionFrames * reverse() const override; protected: @@ -1307,7 +1311,7 @@ public: ActionCallback(const std::function& callback); ~ActionCallback(); - virtual ActionCallback * copy() override; + virtual ActionCallback * copy() const override; protected: std::function m_Callback;