设为首页 加入收藏

TOP

剖析cocos2d-x之Action实现
2014-11-24 07:40:23 来源: 作者: 【 】 浏览:0
Tags:剖析 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表中

看看代码:


  CCAction * CCNode::runAction(CCAction* action)
  {
   CCAssert( action != NULL, "Argument must be non-nil");
   m_pActionManager->addAction(action, this, !m_bIsRunning);
   return action;
  }


看看,内部是否是调用CCActionManager的addAction

接着我们再看看addAction的实现


  void CCActionManager::addAction(CCAction *pAction, CCNode *pTarget, bool paused)
  {
   CCAssert(pAction != NULL, "");
   CCAssert(pTarget != NULL, "");
  
   tHashElement *pElement = NULL;
   // we should convert it to CCObject*, because we save it as CCObject*
   CCObject *tmp = pTarget;
   HASH_FIND_INT(m_pTargets, &tmp, pElement);
   if (! pElement)
   {
   pElement = (tHashElement*)calloc(sizeof(*pElement), 1);
   pElement->paused = paused;
   pTarget->retain();
   pElement->target = pTarget;
   HASH_ADD_INT(m_pTargets, target, pElement);
   }
  
  
   actionAllocWithHashElement(pElement);
  
   CCAssert(! ccArrayContainsObject(pElement->actions, pAction), "");
   ccArrayAppendObject(pElement->actions, pAction);
  
   pAction->startWithTarget(pTarget);
  }


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Android禁止横屏竖屏切换 下一篇Android中使用JavaMail发送Email..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·Java 并发工具类:提 (2025-12-25 20:25:44)
·Java面试技巧:如何 (2025-12-25 20:25:41)
·Java并发编程中的线 (2025-12-25 20:25:38)
·C 语言 - cppreferen (2025-12-25 19:50:27)
·《C 语言入门教程》 (2025-12-25 19:50:23)