加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-14 19:46:16 所属栏目:百科 来源:网络整理
导读:http://www.cnblogs.com/changchao/category/486605.html 1. cocos2dx中,CCAction的类的结构图 2.动作的基类是CCAction,通过继承它可以实现很多不同的动作,主要分为三大类:CCFiniteTimeAction(有限次动作执行类)、CCSpeed(节点执行速度类)、CCFollow(节

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读