fixed bugs about actions.

This commit is contained in:
Nomango 2018-02-06 15:34:47 +08:00
parent 98963f082e
commit 7d36ea26fd
21 changed files with 105 additions and 187 deletions

View File

@ -1,4 +1,5 @@
#include "..\eactions.h" #include "..\eactions.h"
#include "..\emanagers.h"
e2d::EAction::EAction() e2d::EAction::EAction()
: m_bRunning(false) : m_bRunning(false)
@ -12,6 +13,7 @@ e2d::EAction::EAction()
e2d::EAction::~EAction() e2d::EAction::~EAction()
{ {
EActionManager::__destroyAction(this);
} }
bool e2d::EAction::isRunning() bool e2d::EAction::isRunning()
@ -24,9 +26,10 @@ bool e2d::EAction::_isEnding()
return m_bEnding; 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() void e2d::EAction::resume()
@ -45,11 +48,6 @@ void e2d::EAction::stop()
m_bEnding = true; m_bEnding = true;
} }
void e2d::EAction::_setTarget(ENode * node)
{
m_pTarget = node;
}
e2d::EAction * e2d::EAction::reverse() const e2d::EAction * e2d::EAction::reverse() const
{ {
ASSERT(false, "EAction cannot be reversed!"); 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_bInit = false;
m_bEnding = false; m_bEnding = false;

View File

@ -20,8 +20,3 @@ void e2d::EActionCallback::_update()
m_Callback(); m_Callback();
this->stop(); this->stop();
} }
void e2d::EActionCallback::_reset()
{
EAction::_reset();
}

View File

@ -24,8 +24,3 @@ void e2d::EActionDelay::_update()
this->stop(); this->stop();
} }
} }
void e2d::EActionDelay::_reset()
{
EAction::_reset();
}

View File

@ -29,8 +29,3 @@ void e2d::EActionGradual::_update()
this->stop(); this->stop();
} }
} }
void e2d::EActionGradual::_reset()
{
EAction::_reset();
}

View File

@ -22,7 +22,7 @@ e2d::EActionLoop * e2d::EActionLoop::clone() const
void e2d::EActionLoop::_init() void e2d::EActionLoop::_init()
{ {
EAction::_init(); EAction::_init();
m_pAction->_setTarget(m_pTarget); m_pAction->m_pTarget = m_pTarget;
m_pAction->_init(); m_pAction->_init();
} }
@ -42,16 +42,16 @@ void e2d::EActionLoop::_update()
{ {
m_nTimes++; m_nTimes++;
EAction::_reset(); EAction::reset();
m_pAction->_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; m_nTimes = 0;
} }

View File

@ -33,11 +33,6 @@ void e2d::EActionMoveBy::_update()
); );
} }
void e2d::EActionMoveBy::_reset()
{
EActionGradual::_reset();
}
e2d::EActionMoveBy * e2d::EActionMoveBy::clone() const e2d::EActionMoveBy * e2d::EActionMoveBy::clone() const
{ {
return new EActionMoveBy(m_fDuration, m_MoveVec); return new EActionMoveBy(m_fDuration, m_MoveVec);

View File

@ -16,8 +16,3 @@ void e2d::EActionMoveTo::_init()
EActionMoveBy::_init(); EActionMoveBy::_init();
m_MoveVec = m_EndPos - m_BeginPos; m_MoveVec = m_EndPos - m_BeginPos;
} }
void e2d::EActionMoveTo::_reset()
{
EActionMoveBy::_reset();
}

View File

@ -29,11 +29,6 @@ void e2d::EActionOpacityBy::_update()
m_pTarget->setOpacity(m_nBeginVal + m_nVariation * m_fRateOfProgress); m_pTarget->setOpacity(m_nBeginVal + m_nVariation * m_fRateOfProgress);
} }
void e2d::EActionOpacityBy::_reset()
{
EActionGradual::_reset();
}
e2d::EActionOpacityBy * e2d::EActionOpacityBy::clone() const e2d::EActionOpacityBy * e2d::EActionOpacityBy::clone() const
{ {
return new EActionOpacityBy(m_fDuration, m_nVariation); return new EActionOpacityBy(m_fDuration, m_nVariation);

View File

@ -17,8 +17,3 @@ void e2d::EActionOpacityTo::_init()
EActionOpacityBy::_init(); EActionOpacityBy::_init();
m_nVariation = m_nEndVal - m_nBeginVal; m_nVariation = m_nEndVal - m_nBeginVal;
} }
void e2d::EActionOpacityTo::_reset()
{
EActionOpacityBy::_reset();
}

View File

@ -30,11 +30,6 @@ void e2d::EActionRotateBy::_update()
m_pTarget->setRotation(m_nBeginVal + m_nVariation * m_fRateOfProgress); m_pTarget->setRotation(m_nBeginVal + m_nVariation * m_fRateOfProgress);
} }
void e2d::EActionRotateBy::_reset()
{
EActionGradual::_reset();
}
e2d::EActionRotateBy * e2d::EActionRotateBy::clone() const e2d::EActionRotateBy * e2d::EActionRotateBy::clone() const
{ {
return new EActionRotateBy(m_fDuration, m_nVariation); return new EActionRotateBy(m_fDuration, m_nVariation);

View File

@ -17,8 +17,3 @@ void e2d::EActionRotateTo::_init()
EActionRotateBy::_init(); EActionRotateBy::_init();
m_nVariation = m_nEndVal - m_nBeginVal; m_nVariation = m_nEndVal - m_nBeginVal;
} }
void e2d::EActionRotateTo::_reset()
{
EActionRotateBy::_reset();
}

View File

@ -41,11 +41,6 @@ void e2d::EActionScaleBy::_update()
m_nBeginScaleX + m_nVariationX * m_fRateOfProgress); m_nBeginScaleX + m_nVariationX * m_fRateOfProgress);
} }
void e2d::EActionScaleBy::_reset()
{
EActionGradual::_reset();
}
e2d::EActionScaleBy * e2d::EActionScaleBy::clone() const e2d::EActionScaleBy * e2d::EActionScaleBy::clone() const
{ {
return new EActionScaleBy(m_fDuration, m_nVariationX, m_nVariationY); return new EActionScaleBy(m_fDuration, m_nVariationX, m_nVariationY);

View File

@ -25,8 +25,3 @@ void e2d::EActionScaleTo::_init()
m_nVariationX = m_nEndScaleX - m_nBeginScaleX; m_nVariationX = m_nEndScaleX - m_nBeginScaleX;
m_nVariationY = m_nEndScaleY - m_nBeginScaleY; m_nVariationY = m_nEndScaleY - m_nBeginScaleY;
} }
void e2d::EActionScaleTo::_reset()
{
EActionScaleBy::_reset();
}

View File

@ -35,7 +35,7 @@ void e2d::EActionSequence::_init()
{ {
for (auto action : m_vActions) 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) for (auto action : m_vActions)
{ {
action->_reset(); action->reset();
} }
m_nActionIndex = 0; m_nActionIndex = 0;
} }

View File

@ -35,8 +35,8 @@ e2d::EActionTwo * e2d::EActionTwo::reverse(bool actionReverse) const
void e2d::EActionTwo::_init() void e2d::EActionTwo::_init()
{ {
EAction::_init(); EAction::_init();
m_pFirstAction->_setTarget(m_pTarget); m_pFirstAction->m_pTarget = m_pTarget;
m_pSecondAction->_setTarget(m_pTarget); m_pSecondAction->m_pTarget = m_pTarget;
m_pFirstAction->_init(); 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_pFirstAction->reset();
m_pSecondAction->_reset(); m_pSecondAction->reset();
} }
void e2d::EActionTwo::_resetTime() void e2d::EActionTwo::_resetTime()

View File

@ -35,8 +35,8 @@ e2d::EActionTwoAtSameTime * e2d::EActionTwoAtSameTime::reverse(bool actionRevers
void e2d::EActionTwoAtSameTime::_init() void e2d::EActionTwoAtSameTime::_init()
{ {
EAction::_init(); EAction::_init();
m_pFirstAction->_setTarget(m_pTarget); m_pFirstAction->m_pTarget = m_pTarget;
m_pSecondAction->_setTarget(m_pTarget); m_pSecondAction->m_pTarget = m_pTarget;
m_pFirstAction->_init(); m_pFirstAction->_init();
m_pSecondAction->_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_pFirstAction->reset();
m_pSecondAction->_reset(); m_pSecondAction->reset();
} }
void e2d::EActionTwoAtSameTime::_resetTime() void e2d::EActionTwoAtSameTime::_resetTime()

View File

@ -2,14 +2,12 @@
e2d::EAnimation::EAnimation() e2d::EAnimation::EAnimation()
: m_nFrameIndex(0) : m_nFrameIndex(0)
, m_pTarget(nullptr)
{ {
} }
e2d::EAnimation::EAnimation(float invertal) e2d::EAnimation::EAnimation(float invertal)
: m_nFrameIndex(0) : m_nFrameIndex(0)
, m_fInterval(invertal) , m_fInterval(invertal)
, m_pTarget(nullptr)
{ {
} }
@ -47,7 +45,7 @@ void e2d::EAnimation::_update()
// 重新记录时间 // 重新记录时间
m_fLast += m_fInterval; m_fLast += m_fInterval;
// 加载关键帧 // 加载关键帧
m_pTarget->loadFrom(m_vFrames[m_nFrameIndex]); static_cast<ESprite*>(m_pTarget)->loadFrom(m_vFrames[m_nFrameIndex]);
m_nFrameIndex++; m_nFrameIndex++;
// 判断动作是否结束 // 判断动作是否结束
if (m_nFrameIndex == m_vFrames.size()) 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; m_nFrameIndex = 0;
} }
void e2d::EAnimation::_setTarget(ENode * node)
{
m_pTarget = static_cast<ESprite*>(node);
}
void e2d::EAnimation::addKeyframe(EImage * frame) void e2d::EAnimation::addKeyframe(EImage * frame)
{ {
if (frame) if (frame)

View File

@ -4,15 +4,15 @@
static std::vector<e2d::EAction*> s_vActions; static std::vector<e2d::EAction*> 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(); pAction->startWith(pTargetNode);
action->retain(); pAction->retain();
s_vActions.push_back(action); s_vActions.push_back(pAction);
} }
} }
@ -24,7 +24,7 @@ void e2d::EActionManager::resumeAllActionsBindedWith(ENode * pTargetNode)
{ {
if (action->getTarget() == pTargetNode) if (action->getTarget() == pTargetNode)
{ {
action->start(); action->resume();
} }
} }
for (auto child : pTargetNode->getChildren()) 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() void e2d::EActionManager::resumeAllActions()
{ {
for (auto child : ESceneManager::getCurrentScene()->getRoot()->getChildren()) for (auto child : ESceneManager::getCurrentScene()->getRoot()->getChildren())
@ -128,18 +140,17 @@ void e2d::EActionManager::__update()
return; return;
// 循环遍历所有正在运行的动作 // 循环遍历所有正在运行的动作
for (size_t i = 0; i < s_vActions.size(); i++) for (auto &action : s_vActions)
{ {
auto &action = s_vActions[i];
// 获取动作运行状态 // 获取动作运行状态
if (action->isRunning() || if (action->isRunning() &&
(action->getTarget() && action->getTarget()->getParentScene() == ESceneManager::getCurrentScene())) action->getTarget() &&
action->getTarget()->getParentScene() == ESceneManager::getCurrentScene())
{ {
if (action->_isEnding()) if (action->_isEnding())
{ {
// 动作已经结束 // 动作已经结束
SafeRelease(&action); action->release();
s_vActions.erase(s_vActions.begin() + i);
} }
else else
{ {

View File

@ -721,16 +721,23 @@ void e2d::ENode::clearAllChildren()
void e2d::ENode::runAction(EAction * action) void e2d::ENode::runAction(EAction * action)
{ {
WARN_IF( if (this != action->getTarget())
action->getTarget() != nullptr,
"The action is already running, The clone of the action will be created automatically!"
);
if (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) void e2d::ENode::resumeAction(EAction * action)

View File

@ -4,7 +4,7 @@
namespace e2d namespace e2d
{ {
class ENode;
class EActionManager; class EActionManager;
class EActionTwo; class EActionTwo;
class EActionLoop; class EActionLoop;
@ -15,7 +15,6 @@ class ETransitionFade;
class EAction : class EAction :
public EObject public EObject
{ {
friend ENode;
friend EActionManager; friend EActionManager;
friend EActionTwo; friend EActionTwo;
friend EActionLoop; friend EActionLoop;
@ -30,8 +29,10 @@ public:
// 获取动作运行状态 // 获取动作运行状态
virtual bool isRunning(); virtual bool isRunning();
// 继续动作 // 开始动作
virtual void start(); virtual void startWith(
ENode* pTarget /* 执行该动作的目标 */
);
// 继续动作 // 继续动作
virtual void resume(); virtual void resume();
@ -48,7 +49,10 @@ public:
// 获取一个新的逆向动作 // 获取一个新的逆向动作
virtual EAction * reverse() const; virtual EAction * reverse() const;
// 获取执行该动作的目标 // 重置动作
virtual void reset();
// 获取该动作的执行目标
virtual ENode * getTarget(); virtual ENode * getTarget();
protected: protected:
@ -61,17 +65,9 @@ protected:
// 获取动作结束状态 // 获取动作结束状态
virtual bool _isEnding(); virtual bool _isEnding();
// 重置动作
virtual void _reset();
// 重置动画时间 // 重置动画时间
virtual void _resetTime(); virtual void _resetTime();
// 设置动作执行目标
virtual void _setTarget(
ENode * node
);
protected: protected:
bool m_bRunning; bool m_bRunning;
bool m_bEnding; bool m_bEnding;
@ -98,9 +94,6 @@ protected:
// 更新动画 // 更新动画
virtual void _update() override; virtual void _update() override;
// 重置动画
virtual void _reset() override;
protected: protected:
float m_fDuration; float m_fDuration;
float m_fRateOfProgress; float m_fRateOfProgress;
@ -130,11 +123,8 @@ protected:
// 执行动画 // 执行动画
virtual void _update() override; virtual void _update() override;
// 重置动画
virtual void _reset() override;
protected: protected:
EPoint m_BeginPos; EPoint m_BeginPos;
EVector2 m_MoveVec; EVector2 m_MoveVec;
}; };
@ -156,9 +146,6 @@ protected:
// 初始化动画 // 初始化动画
virtual void _init() override; virtual void _init() override;
// 重置动画
virtual void _reset() override;
protected: protected:
EPoint m_EndPos; EPoint m_EndPos;
}; };
@ -194,9 +181,6 @@ protected:
// 执行动画 // 执行动画
virtual void _update() override; virtual void _update() override;
// 重置动画
virtual void _reset() override;
protected: protected:
float m_nBeginScaleX; float m_nBeginScaleX;
float m_nBeginScaleY; float m_nBeginScaleY;
@ -229,9 +213,6 @@ protected:
// 初始化动画 // 初始化动画
virtual void _init() override; virtual void _init() override;
// 重置动画
virtual void _reset() override;
protected: protected:
float m_nEndScaleX; float m_nEndScaleX;
float m_nEndScaleY; float m_nEndScaleY;
@ -261,9 +242,6 @@ protected:
// 执行动画 // 执行动画
virtual void _update() override; virtual void _update() override;
// 重置动画
virtual void _reset() override;
protected: protected:
float m_nBeginVal; float m_nBeginVal;
float m_nVariation; float m_nVariation;
@ -287,9 +265,6 @@ protected:
// 初始化动画 // 初始化动画
virtual void _init() override; virtual void _init() override;
// 重置动画
virtual void _reset() override;
protected: protected:
float m_nEndVal; float m_nEndVal;
}; };
@ -340,9 +315,6 @@ protected:
// 执行动画 // 执行动画
virtual void _update() override; virtual void _update() override;
// 重置动画
virtual void _reset() override;
protected: protected:
float m_nBeginVal; float m_nBeginVal;
float m_nVariation; float m_nVariation;
@ -366,9 +338,6 @@ protected:
// 初始化动画 // 初始化动画
virtual void _init() override; virtual void _init() override;
// 重置动画
virtual void _reset() override;
protected: protected:
float m_nEndVal; float m_nEndVal;
}; };
@ -394,6 +363,9 @@ public:
bool actionReverse = true /* 子动作是否执行逆动作 */ bool actionReverse = true /* 子动作是否执行逆动作 */
) const; ) const;
// 重置动作
virtual void reset() override;
protected: protected:
// 初始化动作 // 初始化动作
virtual void _init() override; virtual void _init() override;
@ -401,9 +373,6 @@ protected:
// 执行动作 // 执行动作
virtual void _update() override; virtual void _update() override;
// 重置动作
virtual void _reset() override;
// 重置动画时间 // 重置动画时间
virtual void _resetTime() override; virtual void _resetTime() override;
@ -442,6 +411,9 @@ public:
bool actionReverse = true /* 子动作是否执行逆动作 */ bool actionReverse = true /* 子动作是否执行逆动作 */
) const; ) const;
// 重置动作
virtual void reset() override;
protected: protected:
// 初始化动作 // 初始化动作
virtual void _init() override; virtual void _init() override;
@ -449,9 +421,6 @@ protected:
// 执行动作 // 执行动作
virtual void _update() override; virtual void _update() override;
// 重置动作
virtual void _reset() override;
// 重置动画时间 // 重置动画时间
virtual void _resetTime() override; virtual void _resetTime() override;
@ -480,9 +449,6 @@ protected:
// 执行动作 // 执行动作
virtual void _update() override; virtual void _update() override;
// 重置动作
virtual void _reset() override;
protected: protected:
float m_fDelayTime; float m_fDelayTime;
}; };
@ -508,6 +474,9 @@ public:
bool actionReverse = true /* 子动作是否执行逆动作 */ bool actionReverse = true /* 子动作是否执行逆动作 */
) const; ) const;
// 重置动作
virtual void reset() override;
protected: protected:
// 初始化动作 // 初始化动作
virtual void _init() override; virtual void _init() override;
@ -515,9 +484,6 @@ protected:
// 执行动作 // 执行动作
virtual void _update() override; virtual void _update() override;
// 重置动作
virtual void _reset() override;
// 重置动画时间 // 重置动画时间
virtual void _resetTime() override; virtual void _resetTime() override;
@ -542,6 +508,9 @@ public:
// 获取该动作的拷贝对象 // 获取该动作的拷贝对象
virtual EActionLoop * clone() const override; virtual EActionLoop * clone() const override;
// 重置动作
virtual void reset() override;
protected: protected:
// 初始化动作 // 初始化动作
virtual void _init() override; virtual void _init() override;
@ -549,9 +518,6 @@ protected:
// 执行动作 // 执行动作
virtual void _update() override; virtual void _update() override;
// 重置动作
virtual void _reset() override;
// 重置动画时间 // 重置动画时间
virtual void _resetTime() override; virtual void _resetTime() override;
@ -592,6 +558,9 @@ public:
// 获取该动画的逆动画 // 获取该动画的逆动画
virtual EAnimation * reverse() const override; virtual EAnimation * reverse() const override;
// 重置动作
virtual void reset() override;
protected: protected:
// 初始化动作 // 初始化动作
virtual void _init() override; virtual void _init() override;
@ -599,18 +568,9 @@ protected:
// 执行动作 // 执行动作
virtual void _update() override; virtual void _update() override;
// 重置动作
virtual void _reset() override;
// 设置动作执行目标
virtual void _setTarget(
ENode * node
) override;
protected: protected:
float m_fInterval; float m_fInterval;
UINT m_nFrameIndex; UINT m_nFrameIndex;
ESprite* m_pTarget;
std::vector<EImage*> m_vFrames; std::vector<EImage*> m_vFrames;
}; };
@ -634,9 +594,6 @@ protected:
// 执行动作 // 执行动作
virtual void _update() override; virtual void _update() override;
// 重置动作
virtual void _reset() override;
protected: protected:
std::function<void()> m_Callback; std::function<void()> m_Callback;
}; };

View File

@ -156,11 +156,13 @@ class EActionManager
{ {
friend EGame; friend EGame;
friend ENode; friend ENode;
friend EAction;
public: public:
// 添加动作 // 添加动作
static void addAction( static void addAction(
EAction * action EAction * pAction,
ENode * pTargetNode
); );
// 继续绑定在节点上的所有动作 // 继续绑定在节点上的所有动作
@ -196,6 +198,11 @@ private:
ENode * pTargetNode ENode * pTargetNode
); );
// 删除指定的动作
static void __destroyAction(
EAction * pAction
);
// 重置所有动作状态 // 重置所有动作状态
static void __resetAllActions(); static void __resetAllActions();
}; };