每一次切换之前先停止其他的动画,不然会同时播放多个动画,造成闪烁效果;
但是每次移动时stopAllActions会被调用多次,每帧调用一次,造成动画被定住的效果;
引入“简单状态机”,让每种动画在同一个状态下只播放一次。
int m_nState; //简单状态机
void changeState(int nState); //用函数来切换状态
enum
{
E_STATE_NONE,
E_STATE_STRAIGHT,
E_STATE_LEFT,
E_STATE_RIGHT
};
void CPlayer::changeState(int nState)
{
if (m_nState == nState) //当前的状态已经是即将切换的状态
{
return;
}
//否则,把传入的状态存起来
m_nState = nState;
//每一次切换之前先停止其他的动画,不然会同时播放多个动画,造成闪烁效果
m_pPic->stopAllActions(); //不能用this
m_pPic->setFlippedX(false); //把相同的提出来
//根据传入状态的不同,执行不同的动画
//把不同的值用一个变量替换
Animate* pAnimate = nullptr;
if (m_nState == E_STATE_STRAIGHT)
{
pAnimate = m_pStraight;
}
else if (m_nState == E_STATE_LEFT)
{
pAnimate = m_pLeft;
}
else if (m_nState == E_STATE_RIGHT)
{
pAnimate = m_pLeft;
m_pPic->setFlippedX(true); //不同的进行修改
}
RepeatForever* pRepeat = RepeatForever::create(pAnimate);
m_pPic->runAction(pRepeat);
}
//状态机的调用
this->changeState(E_STATE_STRAIGHT); //切换状态:直飞