修复了动作初始化的时机

This commit is contained in:
Nomango 2017-10-08 13:26:42 +08:00
parent 51b6280a56
commit 9605391964
10 changed files with 32 additions and 9 deletions

View File

@ -5,6 +5,7 @@ Action::Action() :
m_bRunning(true), m_bRunning(true),
m_bWaiting(false), m_bWaiting(false),
m_bEnding(false), m_bEnding(false),
m_bInit(false),
m_pTargetSprite(nullptr), m_pTargetSprite(nullptr),
m_pParentScene(nullptr) m_pParentScene(nullptr)
{ {
@ -76,7 +77,13 @@ Sprite * Action::getTarget()
return m_pTargetSprite; return m_pTargetSprite;
} }
void Action::_init()
{
m_bInit = true;
}
void Action::_reset() void Action::_reset()
{ {
m_bInit = false;
m_bEnding = false; m_bEnding = false;
} }

View File

@ -16,6 +16,7 @@ ActionCallback * ActionCallback::copy() const
void ActionCallback::_init() void ActionCallback::_init()
{ {
Action::_init();
} }
void ActionCallback::_exec(LARGE_INTEGER nNow) void ActionCallback::_exec(LARGE_INTEGER nNow)

View File

@ -16,6 +16,7 @@ ActionDelay * ActionDelay::copy() const
void ActionDelay::_init() void ActionDelay::_init()
{ {
Action::_init();
// 记录当前时间 // 记录当前时间
QueryPerformanceCounter(&m_nLast); QueryPerformanceCounter(&m_nLast);
} }

View File

@ -23,6 +23,7 @@ ActionFrames::~ActionFrames()
void ActionFrames::_init() void ActionFrames::_init()
{ {
Action::_init();
// 记录当前时间 // 记录当前时间
QueryPerformanceCounter(&m_nLast); QueryPerformanceCounter(&m_nLast);
} }

View File

@ -18,6 +18,7 @@ ActionNeverStop * ActionNeverStop::copy() const
void ActionNeverStop::_init() void ActionNeverStop::_init()
{ {
Action::_init();
m_Action->m_pTargetSprite = m_pTargetSprite; m_Action->m_pTargetSprite = m_pTargetSprite;
m_Action->_init(); m_Action->_init();
} }

View File

@ -31,10 +31,13 @@ ActionSequence::~ActionSequence()
void ActionSequence::_init() void ActionSequence::_init()
{ {
Action::_init();
// 将所有动作与目标绑定
for (auto action : m_vActions) for (auto action : m_vActions)
{ {
action->m_pTargetSprite = m_pTargetSprite; action->m_pTargetSprite = m_pTargetSprite;
} }
// 初始化第一个动作
m_vActions[0]->_init(); m_vActions[0]->_init();
} }
@ -63,7 +66,6 @@ void ActionSequence::_reset()
{ {
action->_reset(); action->_reset();
} }
m_vActions[0]->_init();
m_nActionIndex = 0; m_nActionIndex = 0;
} }

View File

@ -33,6 +33,7 @@ ActionTwo * ActionTwo::reverse(bool actionReverse) const
void ActionTwo::_init() void ActionTwo::_init()
{ {
Action::_init();
m_FirstAction->m_pTargetSprite = m_pTargetSprite; m_FirstAction->m_pTargetSprite = m_pTargetSprite;
m_SecondAction->m_pTargetSprite = m_pTargetSprite; m_SecondAction->m_pTargetSprite = m_pTargetSprite;
@ -66,6 +67,4 @@ void ActionTwo::_reset()
m_FirstAction->_reset(); m_FirstAction->_reset();
m_SecondAction->_reset(); m_SecondAction->_reset();
m_FirstAction->_init();
} }

View File

@ -17,6 +17,7 @@ bool Animation::_isEnd() const
void Animation::_init() void Animation::_init()
{ {
Action::_init();
// 记录当前时间 // 记录当前时间
QueryPerformanceCounter(&m_nLast); QueryPerformanceCounter(&m_nLast);
} }

View File

@ -8,20 +8,30 @@ void ActionManager::__exec()
// 获取当前时间 // 获取当前时间
static LARGE_INTEGER nNow; static LARGE_INTEGER nNow;
QueryPerformanceCounter(&nNow); QueryPerformanceCounter(&nNow);
// 临时指针
Action * action;
// 循环遍历所有正在运行的动作 // 循环遍历所有正在运行的动作
for (size_t i = 0; i < s_vActions.size(); i++) for (size_t i = 0; i < s_vActions.size(); i++)
{ {
if (s_vActions[i]->isRunning()) action = s_vActions[i];
// 获取动作运行状态
if (action->isRunning())
{ {
if (s_vActions[i]->isEnding()) if (action->isEnding())
{ {
// 动作已经结束 // 动作已经结束
s_vActions[i]->release(); action->release();
s_vActions.erase(s_vActions.begin() + i); s_vActions.erase(s_vActions.begin() + i);
} }
else else
{ {
s_vActions[i]->_exec(nNow); // 初始化动作
if (!action->m_bInit)
{
action->_init();
}
// 执行动作
action->_exec(nNow);
} }
} }
} }
@ -38,7 +48,6 @@ void ActionManager::addAction(Action * action)
} }
#endif #endif
action->m_pParentScene = App::getLoadingScene(); action->m_pParentScene = App::getLoadingScene();
action->_init();
s_vActions.push_back(action); s_vActions.push_back(action);
} }
} }

View File

@ -1108,6 +1108,7 @@ protected:
bool m_bRunning; bool m_bRunning;
bool m_bWaiting; bool m_bWaiting;
bool m_bEnding; bool m_bEnding;
bool m_bInit;
Sprite * m_pTargetSprite; Sprite * m_pTargetSprite;
Scene * m_pParentScene; Scene * m_pParentScene;
UINT m_nMilliSeconds; UINT m_nMilliSeconds;
@ -1115,7 +1116,7 @@ protected:
LARGE_INTEGER m_nAnimationInterval; LARGE_INTEGER m_nAnimationInterval;
protected: protected:
virtual void _init() = 0; virtual void _init();
virtual void _exec(LARGE_INTEGER nNow) = 0; virtual void _exec(LARGE_INTEGER nNow) = 0;
virtual void _reset(); virtual void _reset();
}; };