cocos2dx --- Action介绍 (一、二) (动作顺序、动作组合效果)

前端之家收集整理的这篇文章主要介绍了cocos2dx --- Action介绍 (一、二) (动作顺序、动作组合效果)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

http://www.cnblogs.com/changchao/category/486605.html

1. cocos2dx中,CCAction的类的结构图



2.动作的基类是CCAction,通过继承它可以实现很多不同的动作,主要分为三大类:CCFiniteTimeAction(有限次动作执行类)、CCSpeed(节点执行速度类)、CCFollow(节点跟随另一个节点移动)。在实际中,主要用到的是CCFiniteTimeAction类。
3.CCFiniteTimeAction分为CCActionInstant(瞬时动作)和CCActionInterval(延迟动作)。其中CCActionInstant动作没有执行过程,动作瞬时完成,而CCActionInterval动作执行需要一定的时间(或者一个过程)。在实际中,为了制作出炫丽的动画效果,使用得多的是CCActionInterval延时动作。
4.在上面的类结构图中,CCActionInterval的子类很多,简单介绍其中常用的,也可以通过cocos2d-x中自带的TestCpp例子来学习。(1) CCMoveTo / CCMoveBy 移动两者的主要差别在于CCMoveTo是移动到指定坐标,CCMoveBy是相对坐标。例如CCMoveTo(2.0f,ccp(50,50))是在2s时间内移动到点x = 50、y = 50处,而CCMoveBy(2.0f,50))表示2s时间内向x方向移动50个单位,向y方向移动50个单位;(2) CCScaleTo / CCScaleBy 缩放;(3) CCRotateTo / CCRotateBy 旋转;(4) CCSkewTo / CCSkewBy 扭曲;(5) CCJumpTo / CCJumpBy 跳跃;(6) CCBezierTo / CCBezierBy 贝塞尔曲线;(7) CCBink 闪烁;(8) CCFadeIn / CCFadeOut 淡入淡出;(9) CCTintTo / CCTintBy 染色,等
5.下面就个人体会,重点分析以下几个动作:CCSequence,CCSpawn,CCRepeat,CCRepeatForever,CCActionCamera
  CCSequence:是用来按顺序执行一系列的动作。需要注意是,在执行的动作系列中不能出现CCRepeat这种无限的动作。
  1. CCMoveTo* move_1 = CCMoveTo::create(2,ccp(10,20));
  2. CCMoveBy* move_2 = CCMoveBy::create(2,serif; font-size:12px; line-height:1.8em; background-color:rgb(255,255,255); color:rgb(51,153)"> CCMoveTo* move_3 = CCMoveBy::create(2,serif; font-size:12px; line-height:1.8em"> CCSequence* seq = CCSequence::create(move_1,move_2,move_3,NULL);
  3. sprite->runAction(seq);
复制代码

CCSpawn:同时执行一系列动作,执行的时间以子动作中最长事件为准。
  1. CCSpawn* action = CCSpawn::create(
  2. CCJumpBy::create(2,ccp(300,0),50,4),
  3. CCRotateBy::create(2,720),serif; font-size:12px; line-height:1.8em"> sprite->runAction(action);
CCRepeat:有限次重复一个动作。
  1. CCMoveBy* action = CCMoveBy::create(2,10));
  2. CCRepeat* repeat = CCRepeat::create(action,3);
  3. sprite->runAction(repeat);
CCRepeatForerver:无限次重复一个动作。
  1. CCRotateBy* rotate = CCRotateBy::create(1.0,360);
  2. CCRepeatForever* action2 = CCRepeatForever::create(rotate);
  3. sprit->runAction(action2);
复制代码

有时需要指定在某一个时刻有谁执行某个动作,此时就有必要使用CCActionInstant继承树中一类特殊的类,即CCCallFunc家族。

  CCCallFunc家族主要有四个类:     

1 CCCallFunc *CCCallFunc::actionWithTarget(SelectorProtocol* pSelectorTarget,SEL_CallFunc selector); 2 CCCallFuncN *CCCallFuncN::actionWithTarget(SelectorProtocol* pSelectorTarget,SEL_CallFuncN selector); 3 CCCallFuncND *CCCallFuncND::actionWithTarget(SelectorProtocol* pSelectorTarget,SEL_CallFuncND selector,void* d); 4 CCCallFuncO *CCCallFuncO::actionWithTarget(SelectorProtocol* pSelectorTarget,SEL_CallFuncO selector,CCObject* pObject) 

  这四个类对应了四个不同的函数接口;

1 typedef void (SelectorProtocol::*SEL_CallFunc)(); 2 typedef void (SelectorProtocol::*SEL_CallFuncN)(CCNode*); 3 typedef void (SelectorProtocol::*SEL_CallFuncND)(CCNode*,255); font-size:12px!important; line-height:1.5!important">void*); 4 typedef void (SelectorProtocol::*SEL_CallFuncO)(CCObject*);

  在使用此四类时,需要按需求使用上述4种回调函数的定义形式,并且对自定义的回调函数需用利用cocos2dx的宏一转换为函数指针类型,对应的宏定义:

1 #define callfunc_selector(_SELECTOR) (SEL_CallFunc)(&_SELECTOR) 
2 #define callfuncN_selector(_SELECTOR) (SEL_CallFuncN)(&_SELECTOR) 
3 #define callfuncND_selector(_SELECTOR) (SEL_CallFuncND)(&_SELECTOR) 
4 #define callfuncO_selector(_SELECTOR) (SEL_CallFuncO)(&_SELECTOR) 

  使用举例:

1 CCCurveMove* curveMove = CCCurveMove::create(fromtime,ccp(size.width - iRandPos_f,-size.height*0.5),sign*size.width*0.4,0.006); 2 CCCallFuncN *actDone = CCCallFuncN::actionWithTarget(this,callfuncN_selector(LeavesLayer::resetLeafPos)); 3 CCFiniteTimeAction *putdown = CCSequence::actions(curveMove,actDone,NULL); 4 sprite->runAction(putdown);

猜你在找的Cocos2d-x相关文章