cocos2d-x实战项目【飞机大战】-- 简单状态机:用于控制动画播放

每一次切换之前先停止其他的动画,不然会同时播放多个动画,造成闪烁效果;
但是每次移动时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);   //切换状态:直飞
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值