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 "..\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;

View File

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

View File

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

View File

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

View File

@ -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;
}

View File

@ -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);

View File

@ -16,8 +16,3 @@ void e2d::EActionMoveTo::_init()
EActionMoveBy::_init();
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);
}
void e2d::EActionOpacityBy::_reset()
{
EActionGradual::_reset();
}
e2d::EActionOpacityBy * e2d::EActionOpacityBy::clone() const
{
return new EActionOpacityBy(m_fDuration, m_nVariation);

View File

@ -17,8 +17,3 @@ void e2d::EActionOpacityTo::_init()
EActionOpacityBy::_init();
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);
}
void e2d::EActionRotateBy::_reset()
{
EActionGradual::_reset();
}
e2d::EActionRotateBy * e2d::EActionRotateBy::clone() const
{
return new EActionRotateBy(m_fDuration, m_nVariation);

View File

@ -17,8 +17,3 @@ void e2d::EActionRotateTo::_init()
EActionRotateBy::_init();
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);
}
void e2d::EActionScaleBy::_reset()
{
EActionGradual::_reset();
}
e2d::EActionScaleBy * e2d::EActionScaleBy::clone() const
{
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_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)
{
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;
}

View File

@ -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()

View File

@ -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()

View File

@ -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<ESprite*>(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<ESprite*>(node);
}
void e2d::EAnimation::addKeyframe(EImage * frame)
{
if (frame)

View File

@ -4,15 +4,15 @@
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();
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
{

View File

@ -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)

View File

@ -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<EImage*> m_vFrames;
};
@ -634,9 +594,6 @@ protected:
// 执行动作
virtual void _update() override;
// 重置动作
virtual void _reset() override;
protected:
std::function<void()> m_Callback;
};

View File

@ -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();
};