您的位置:首页 > 移动开发 > Cocos引擎

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

2014-12-13 19:34 423 查看
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, ccp(50, 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这种无限的动作。

CCMoveTo* move_1 = CCMoveTo::create(2,ccp(10,20));

CCMoveBy* move_2 = CCMoveBy::create(2,ccp(10,20));

CCMoveTo* move_3 = CCMoveBy::create(2,ccp(10,20));

CCSequence* seq = CCSequence::create(move_1,move_2,move_3,NULL);

sprite->runAction(seq);

复制代码

CCSpawn:同时执行一系列动作,执行的时间以子动作中最长事件为准。

CCSpawn* action = CCSpawn::create(

CCJumpBy::create(2 ,ccp(300,0) ,50 ,4),

CCRotateBy::create(2,720), NULL);

sprite->runAction(action);

复制代码

CCRepeat:有限次重复一个动作。

CCMoveBy* action = CCMoveBy::create(2,ccp(10,10));

CCRepeat* repeat = CCRepeat::create(action,3);

sprite->runAction(repeat);

复制代码

CCRepeatForerver:无限次重复一个动作。

CCRotateBy* rotate = CCRotateBy::create(1.0,360);

CCRepeatForever* action2 = CCRepeatForever::create(rotate);

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*, 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);


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: