首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 操作系统 >

剖解cocos2d-x之Action实现

2013-04-09 
剖析cocos2d-x之Action实现稍微了解cocos2d-x的朋友应该都知道cocos2d-x里面的动作都是通过CCAction的各种

剖析cocos2d-x之Action实现

稍微了解cocos2d-x的朋友应该都知道cocos2d-x里面的动作都是通过CCAction的各种派生类来实现的。

比如我要将一个Sprite在1秒内从(0,0)移动到(400,400)

pSprite->setPosition(ccp(0,0));

CCMoveTo* moveTo = CCMoveTo::create(1.0f,,ccp(400,400));

pSprite->runAction(moveTo);

那么,让我们来看看Action在cocos2d-x到底是如何实现的。

首先必须要了解的几个类

1.CCAction和CCActionInterval

CCAction是所有动作的基类,从代码里可以看出它本身并不执行动作

void CCAction::update(float time)

{

    CC_UNUSED_PARAM(time);

    CCLOG("[Action update]. override me");

}

他的作用只是提供一部分接口,如stop,update等等,其本身的实际作用并不是太大

CCActionInterval反而相对重要些,这个是大部分常用动作的基类,如常用的CCMoveTo,CCRotateBy等都是继承自CCActionInterval,CCActionInterval还有很重要的一点就是他实现了step方法,这个方法是大部分其派生类更新动作的基础(后文会有讨论)

2.CCActionManager

从名字可以看出,这个类负责管理着所有的动作,

前面代码里的pSprite->runAction(moveTo);其实就是将moveTo这个Action和pSprite这个Node加入到了CCActionManager内部维护的m_pTargets的这个hash表中

看看代码:

  void CCMoveTo::update(float time)  {      if (m_pTarget)      {          m_pTarget->setPosition(ccp(m_startPosition.x + m_delta.x * time,              m_startPosition.y + m_delta.y * time));      }  }

看到了吧,他在这里就会根据他目前的elapse设置他所负责的Node的位置了。

大家有兴趣也可以看看其他动作,如Rotate,Jump之类,看看他们是如何来设置位置的。

OK,到此结束

由于本人才疏学浅,以上内容如有错误,欢迎大家多多斧正


热点排行