《游戏开发平台Cocos2D-x中的动作特效与动画课件.pptx》由会员分享,可在线阅读,更多相关《游戏开发平台Cocos2D-x中的动作特效与动画课件.pptx(43页珍藏版)》请在三一办公上搜索。
1、游戏开发平台Cocos2D-xocos2d-X中的动作特效与动画,2019/3/8,xxxxxxxxxx,1,2019/3/8,xxxxxxxxxx,2,Cocos2D-x的基础类,包括节点类CCNode、导演类CCDirector、场景类CCScene、布景层、CCLayer和精灵类CCSprite等。这些类都是构成游戏画面的基本元素。但是游戏不仅是由静态画面构成的,更多时候,游戏是动态效果的呈现,所以动作、特效和动画是游戏区别于应用的特点,又是决定游戏质量的关键一环。因此,决定一个二维游戏引擎的好坏的重要因素是引擎对动作、特效和动画的支持程度。,动作类,2019/3/8,xxxxxxxxx
2、x,3,Cocos2D-x的动作类CCAction并不是一个在屏幕中显示的对象,动作必须要依托于CCNode类及它的子类的实例才能发挥作用。C0C0S2D-x的动作包括位置移动、跳跃,甚至是对象颜色的渐变。,CCAction类继承于对象类CCObject,有三个子类:有限时间动作、跟随、移动速度,其中有限时间动作分为瞬时动作(CCActionlnstant)和延时动作(CCActionlnterval)。,CCAction 的主要函数,2019/3/8,xxxxxxxxxx,4,2019/3/8,xxxxxxxxxx,5,CCAction的子类CCFiniteTimeAction分为瞬时动作(
3、CCActionlnstant)和延时动作bCCActionlnterval),移动动作,2019/3/8,xxxxxxxxxx,6,Void ActionMove:onEnter()ActionsDemo:onEnter();centerSprites(3);CCSizes=CCDirector:sharedDirector()-getWinSize();CCActionlnterval*actionTo=CCMoveTo:create(2,CCPointMake(s.width-40,s.height-40);CCActionlnterval*actionBy=CCMoveBy:creat
4、e(2,CCPointMake(80,80);CCActionlnterval*actionByBack=actionBy-reverse;);_tamara-runAction(actionTo);_grossini-runAction(CCSequence:create(actionBy,actionByBack,NULL);_kathia-runAction(CCMoveTo:create(1,CCPointMake(40,40);,以上分别定义了CCMoveTo和CCMoveBy的实例。之前已经说过CCMoveBy是MoveTo的子类,CCMoveTo是移动到目标位置,而CCMoveB
5、.是次目前位置的基础上移之到目标位置。创建函数create的第一个参数是时间,第二个参数是位置对象。动作调用reverse函数会返回另外一个动作,使这个动作倒置,而精灵类实例在调用runAction函数时也会有不同,m_grossini精灵使用的就是动作序列CCSequence。CCSequence动作序列的定义由多个动作构成,create函数中以NULL参数作结尾,效果是作为参数传入的动作会颐序执行。,缩放动作,2019/3/8,xxxxxxxxxx,7,Void ActionScale:onEnter()ActionsDemo:onEnter();centerSprites(3);CCAc
6、tionlnterval*actionTo=CCScaleTo:create(2.Of,0.5f);CCActionlnterval*actionBy=CCScaleBy:create(2.Of/l.Of,lO.Of);CCActionlnterval*actionBy2=CCScaleBy:create(2.Of,5.Of,l.Of;m_grossini-runAction(actionTo);m_tamara-runAction(CCSequence:create(actionBy,actionBy-reverse(),NULL);m_kathia-runAction(CCSequence
7、:create(actionBy2,actionBy2-reverse(),NULL);,以上分别定义了CCScaleTo和CCScaleBy的实例。之前已经说过CCScaleBy是CCScaleTo的子类,CCScaleTo是缩放到相应比例,CCScaleBy是在目前基础上变化相应的缩放比例。create函数可以使用两个参数或者三个参数。两个参数的第一个参数是时间间隔,第二个参数是缩放比例。三个参数的第一个参数是时间间隔,第二个参数是x轴缩放比例,第三个参数是y轴缩放比例。,扭曲动作,2019/3/8,xxxxxxxxxx,8,Void ActionSkew:onEnter()Actions
8、Demo:onEnter();centerSprites(3);CCActionlnterval*actionTo=CCSkewTo:create(2,37.2f,-37.2f);CCActionlnterval*actionToBack=CCSkewTo:create(2,0,0);CCActionlnterval*actionBy=CCSkewBy:create(2,O.Of,-90.Of);CCActionlnterval*actionBy2=CCSkewBy:create(2,45.Of,45.0f);CCActionlnterval*actionByBack=actionBy-rev
9、erse();m_tamara-runAction(CCSequence:create(actionTo,actionToBack,NULL);M_grossini-runAction(CCSequence:create(actionBy,actionByBack,NULL);m_kathia-runAction(CCSequence:create(actionBy2,actionBy2-reverse(),NULL);,以上分别定义了CCSkewTo和CCSkewBy是实例。之前已经说过CCSkewBy是CCSkewTo的子类。二者关系和之前类似,以By结尾的参数是相对于目前值的过程量,以T
10、o结尾的参数是绝对的参数,不管现有状态如何,直接设置为参数的这个值。三个参数的第一个参数是时间间隔,第二个参数是x轴扭曲参数,第三个参数是y轴扭曲参数。,旋转动作,2019/3/8,xxxxxxxxxx,9,voidActionRotate:onEnter()ActionsDemo:onEnter();centerSprites(3);CCActionlnterval*actionTo=CCRotateTo:create(2,45);CCActionlnterval*actionTo2=CCRotateTo:create(2,-45);CCActionlnterval*actionToO=CC
11、RotateTo:create(2,0);m_tamara-runAction(CCSequence:create(actionTo,actionToO,NULL);CCActionlnterval*actionBy=CCRotateBy:create(2,360);CCActionlnterval*actionByBack=actionBy-reverse();M_grossini-runAction(CCSequence:create(actionBy,actionByBack,NULL);m_kathia-runAction(CCSequence:create(actionTo2,act
12、ionToO-copy()-autorelease(),NULL);,以上分别定义了CCRotateTo和CCRotateBy的实例。之前已经说过CCRotateBy是CCRotateTo的子类,二者关系和之前类似。两个参数的第一个参数是时间间隔,第二个参数是旋转角度,这里的角度表示采用角度制。,跳转动作,2019/3/8,xxxxxxxxxx,10,voidActionJump:onEnter()ActionsDemo:onEnter();centerSprites(3);CCActionlnterval*actionTo=CCJumpTo:create(2,CCPointMake(300,
13、300),50,4);CCActionlnterval*actionBy=CCJumpBy:create(2,CCPointMake(300,0),50,4);CCActionlnterval*actionUp=CCJumpBy:create(2,CCPointMake(0,0),80,4);CCActionlnterval*actionByBack=actionBy-reverse();m_tamara-runAction(actionTo);m_grossini-runAction(CCSequence:create(actionBy,actionByBack,NULL);m_kathia
14、-runAction(CCRepeatForever:create(actionUp);,以上分别定义了CCJumpTo和CCJumpBy的实例。之前已经说过CCJumpTo是CCJumpBy的子类,二者关系和之前类似。四个参数的第一个参数是时间间隔,第二个参数CCJumpTo的是目标位置的绝对坐标,CCJumpBy的是相对于目前位置的相对坐标,第三个参数为跳跃高度,第四个参数是跳跃的次数。,贝塞尔曲线动作,2019/3/8,xxxxxxxxxx,11,voidActionBezier:onEnter()ActionsDemo:onEnter();CCSizes=CCDirector:shar
15、edDirector()-getWinSize();centerSprites(3);ccBezierConfigbezier;bezier.controlPoint_l=CCPointMake(0,s.height/2);bezier.controlPoint_2=CCPointMake(300,-s.height/2);bezier.endPosition=CCPointMake(300,100);CCActionlnterval*bezierForward=CCBezierBy:create(3,bezier);CCActionlnterval*bezierBack=bezierForw
16、ard-reverse();CCAction*rep=CCRepeatForever:create(CCActionlnterval*)CCSequence:create(bezierForward,bezierBack,NULL);m_tamara-setPosition(CCPointMake(80,160);ccBezierConfigbezier2;bezier2.controlPoint_1=CCPointMake(100,s.height/2);bezier2.controlPoint_2=CCPointMake(200,-s.height/2);bezier2.endPositi
17、on=CCPointMake(240,160);CCActionlnterval*bezierTol=CCBezierTo:create(2,bezier2);m_kathia-setPosition(CCPointMake(400,160);CCActionlnterval*bezierTo2=CCBezierTo:create2,bezier2);m_grossini-runAction(rep);m_tamara-runAction(bezierTo1);m_kathia-runAction(bezierTo2);,2019/3/8,xxxxxxxxxx,12,ccBezierConfi
18、g的三个参数需要配置,前两个是控制点,最后一个是终点。其中终点在CCBezierTo和CCBezierBy两个类中的运行结果不同,依然是CCBezierTo的终点是绝对位置,而CCBezierBy是相对于目前位置的相对位置。控制点的设置分别控制在路径上的高峰和低谷的位置。如果走的路径与图中方向一致,苎两个控制点的纵坐标设置为一正一负。控制点纵坐标的正负决定是向下走还是向上绝对值决定移动的幅度。而横坐标是横坐标方向的移动,该值对于CCBezierBy是相对于目前位置的相对位置,于CCBezierTo的终点是绝对位置。如果需要图中曲线旋转90度的路径,就把两个控制点的横坐标分别设置为一正一负即可,
19、然后交换x轴和y轴的要求,CCBezierTo和CCBezierBy都是贝塞尔曲线动作。create函数没有什么区别,都是两个参数,第一个参数依然是动作时间,第二个参数是贝塞尔曲线的配置系数。.贝塞尔曲线是应用于二维图形应用程序的数学曲线,每一个顶点都有两个控制点,用于控制该顶点两侧曲线的弧度,淡入淡出动作,2019/3/8,xxxxxxxxxx,13,Void ActionFade:onEnter()ActionsDemo:onEnter();centerSprites(2);m_tamara-setOpacity(0);CCActionlnterval*actionl=CCFadeln:a
20、ctionWithDuration(l.Of);CCActionlnterval*actionlBack=actionl-reverse();CCActionlnterval*action2=CCFadeOut:actionWithDuration(l.Of);CCActionlnterval*action2Back=action2-reverse();m_tamara-runAction(CCSequence:actions(actionl,actionlBack,NULL);m_kathia-runAction(CCSequence:actions(action2,action2Back/
21、NULL);std:StringActionFade:subtitle()returnFadeln/FadeOut;,这里需要说明的是,淡入首先要将不透明度设置为0。,闪烁动作,2019/3/8,xxxxxxxxxx,14,voidActionBlink:onEnter()ActionsDemo:onEnter();centerSprites(2);CCActionlnterval*actionl=CCBlink:actionWithDuration(2,10);CCActionlnterval*action2=CCBlink:actionWithDuration(2,5);m_tamara-
22、runAction(actionl);m_kathia-runAction(action2);,色值渐变动作,2019/3/8,xxxxxxxxxx,15,voidActionTint:onEnter()ActionsDemo:onEnter();centerSprites(2);CCActionlnterval*actionl=CCTintTo:actionWithDuration(2,255,0,255);CCActionlnterval*action2=CCTintBy:actionWithDuration(2,-127,-255,-127);CCActionlnterval*actio
23、n2Back=action2-reverse();m_tamara-runAction(actionl);m_kathia-runAction(CCSequence:actions(action2,action2Back/NULL),以上分别定义了CCTintTo和CCTintBy的实例,第一个参数是动作时间,后三个参数分别是颜色的R、G、B值。CCTintTo是直接设置色值,CCTintBy是在目前值上加上相应的值。,摄像机动作类,2019/3/8,xxxxxxxxxx,16,第3章介绍了摄像机类CCCamera,动作中也有一个摄像机动作类CCOrbitCamera,它是摄像机环绕屏幕中心旋
24、转所形成的动作。,voidActionOrbit:onEnter()ActionsDemo:onEnter();centerSprites(3);CCActionlnterval*orbit3=CCOrbitCamera:create(2,1,0,0,180,90,0);CCFiniteTimeAction*action3=CCSequence:create(orbit3,orbit3-reverse(),NULL);m_kathia-runAction(CCRepeatForever:create(CCActionlnterval*)actionl);m_tamara-runAction(C
25、CRepeatForever:create(CCActionlnterval*)action2);m_grossini-runAction(CCRepeatForever:create(CCActionlnterval*)action3);CCActionlnterval*move=CCMoveBy:create(3,CCPointMake(100,-100);CCActionlnterval*move_back=move-reverse();CCFiniteTimeAction*seq=CCSequence:create(move,move_back,NULL);CCAction*rfe=C
26、CRepeatForever:create(CCActionlnterval*)seq);m_kathia-runAction(rfe);m_tamara-runAction(CCAction*)(rfe-copy()-autorelease();m_grossini-runAction(CCAction*)(rfe-copy()-autorelease();,摄像机动作类,2019/3/8,xxxxxxxxxx,17,旋转的坐标描述采用了球坐标。球坐标采用球面半径、与X轴夹角、与Z轴夹角这几个值来描述坐标点。摄像机动作类CCOrbitCamera的创建函数create有7个参数,第一个参数是
27、动作时间,第二、三个参数是起始的坐标值中的半径和过程中的坐标值中的半径,第四、五个参数是起始的坐标值中的与z轴夹角和过程中的坐标值中的与z轴夹角,第六、七个参数是起始的坐标值中的与x轴夹角和过程中的坐标值中的与x轴夹角。,注意在使用摄像机旋转时,如果正在旋转的这个节点后面还有其他节点的话,可能会出现旋转的节点只有一部分显示出来的这种情况。这时只需要关闭OpenGL的深度检测,获得导演类并调用setDepthTest设置为false即可,如下面的代码所示:CCDirector:sharedDirector()-setDepthTest(false)。,基本样条动作,2019/3/8,xxxxxx
28、xxxx,18,在游戏中,有时会希望使用一些非常规轨迹能描述的运动轨迹,希望只是“告诉”游戏对象几个离散的点,游戏对象就可以根据这些离散的点模拟出相应的路径。当然,有相应的公式模拟出这条曲线,那就是基本样条。Cocos2D-x中有沿基本样条路径移动动作类CCCardinalSplineTo和其子类实现这样的功能,其中CCCardinalSplineTo和CCCardinalSplineBy的关系与之前以“To”和“By”结尾的类类似,CCCatmullRomTo和CCCatmullRomBy也是这样的。它们都是采用基本样条的公式;不同的是,CCCatmullRomTo和CCCatmullRom
29、By的拉力系数是0.5,而之前的CCCardinalSplineTo和CCCardinalSplineBy的拉力系数是可以自定义的。,画基本样条路径,2019/3/8,xxxxxxxxxx,19,Void ActionCardinalSpline:onEnter()ActionsDemo:onEnter();this-centerSprites(2);CCSizes=CCDirector:sharedDirector()-getWinSize();CCPointArray*array=CCPointArray:create(20);array-addControlPoint(ccp(0,0);
30、array-addControlPoint(ccp(s.width/2-30,0);array-addControlPoint(ccp(s.width/2-30,s.height-80);array-addControlPoint(ccp(0,s.height-80);array-addControlPoint(ccp(0,0);CCCardinalSplineBy*action=CCCardinalSplineBy:create(3,array,0);CCActionlnterval*reverse=action-reverse();CCFiniteTimeAction*seq=CCSequ
31、ence:create(action,reverse,NULL);M_tamara-setPosition(ccp(50,50);M_tamara-runAction(seq);CCCardinalSplineBy*action2=CCCardinalSplineBy:create(3,array,1);CCActionlnterval*reverse2=action2-reverse();CCFiniteTimeAction*seq2=CCSequence:create(action2,reverse2,NULL);m_kathia-setPosition(ccp(s.width/2,50)
32、;m_kathia-runAction(seq2);M_pArray=array;array-retain();,首先定义一个点数组,把路径的点放入点数组中。创建基本样条动作时,3个参数分别是动作时间、点数组、拉力系数。CCCardinalSplineTo和CCCardinalSplineBy的区别是,由于第一个是绝对的,第二个是相对的,第二个定义点数组的时候,第一个点最好设置为(0,0),否则起始点会被忽略掉。可以重写布景层的draw函数来把路径画出来。,画Catmull-Rom样条路径,2019/3/8,xxxxxxxxxx,20,voidActionCatmullRom:onEnter(
33、)ActionsDemo:onEnter();this-centerSprites(2);CCSizes=CCDirector:sharedDirector()-getWinSize();m_tamara-setPosition(ccp(50,50);CCPointArray*array=CCPointArray:create(20);array-addControlPoint(ccp(0,0);array-addControlPoint(ccp(80,80);array-addControlPoint(ccp(s.width-80,80);array-addControlPoint(ccp(
34、s.width-80,s.height-80);array-addControlPoint(ccp(80,s.height-80);array-addControlPoint(ccp(80,80);array-addControlPoint(ccp(s.width/2,s.height/2);CCCatmullRomBy*action=CCCatmullRomBy:create(3,array);CCFiniteTimeAction*reverse=action-reverse();CCFiniteTimeAction*seq=CCSequence:create(action,reverse,
35、NULL);m_tamara-runAction(seq);CCPointArray*array2=CCPointArray:create(20);array2-addControlPoint(ccp(s.width/2,30);array2-addControlPoint(ccp(s.width-80,30);array2-addControlPoint(ccp(s.width-80,s.height-80);array2-addControlPoint(ccp(s.width/2,s.height-80);array2-addControlPoint(ccp(s.width/2,30);C
36、CCatmullRomTo*action2=CCCatmullRomTo:create(3,array2);CCFiniteTimeAction*reverse2=action2-reverse();CCFiniteTimeAction*seq2=CCSequence:create(action2,reverse2,NULL);m_kathia-runAction(seq2);m_pArrayl=array;m_pArrayl-retain();m_pArray2=array2;m_pArray2-retain();,CCCatmullRomTo和CCCatmullRomBy的用法和之前的那组
37、类的用法一样,只是不需要第三个拉力系数参数。它们的区别和之前的也是一样的,也可以重写布景层的draw函数来把路径画出来。,缓冲动作,2019/3/8,xxxxxxxxxx,21,在实现运动中,常常需要实现一些加速度或者减速度的效果。Cocos2D-x引擎为我们提供了相应的实现接口,这样就不用再用原来的公式计算方法来实现加减速度的效果。Ease系列的方法改变了运动的速度,但是并没有改变总体时间。如果整个动作持续5s,那么整个时间仍然会持续5s。这些动作可以分成三类。Inactions:action(开始的时候加速)Outactions:action(结束的时候加速)InOutactions:ac
38、tion(开始和结束的时候加速)CCActionEase有很多子类,根据不同的缓冲公式来模拟加减速过程。缓冲动作的具体内容如下。,1)指数缓冲:分别为EaseExponentialln、EaseExponentialOut、EaseExponentiallnOut。2)赛因缓冲:分别为EaseSineIn、EaseSineOut、EaseSineInOut。3)跳跃缓冲:分别为EaseBounceln、EaseBounceOut、EaseBouncelnOut。4)弹性缓冲:分别为EaseElasticIn、EaseElasticOut、EaseElasticInOut。5)回震缓冲:分别为E
39、aseBackln、EaseBackOut、EaseBacklnOut。以上介绍的5种缓冲,加上基本的缓冲动作,一共6种缓冲动作,其定义如代码清单4-15所示。,缓冲动作,2019/3/8,xxxxxxxxxx,22,/基本缓冲动作CCEaseln:create(CCActionlnterval*)(move-copy()-autorelease(),2.5f);CCEaseOut:create(CCActionlnterval*)(move-copy()-autorelease(),2.5f);CCEaselnOut:create(CCActionlnterval*)(move-copy()
40、-autorelease(),0.65f);/指数缓冲动作CCEaseExponentialln:create(CCActionlnterval*)(move-copy()-autorelease();CCEaseExponentialOut:create(CCActionlnterval*)(move-copy()-autorelease();CCEaseExponentiallnOut:create(CCActionlnterval*)(move-copy()-autorelease();/赛因缓冲动作CCEaseSineln:create(CCActionlnterval*)(move-
41、copy()-autorelease();CCEaseSineOut:create(CCActionlnterval*)(move-copy()-autorelease();CCEaseSinelnOut:create(CCActionlnterval*)(move-copy()-autorelease();,缓冲动作,2019/3/8,xxxxxxxxxx,23,/跳跃缓冲动作CCEaseBounceln:create(CCActionlnterval*)(move-copy()-autorelease();CCEaseBounceOut:create(CCActionlnterval*)(
42、move-copy()-autorelease();CCEaseBouncelnOut:create(CCActionlnterval*)(move-copy()-autorelease();/弹性缓冲动作CCEaseElasticIn:create(CCActionlnterval*)(move-copy()-autorelease();CCEaseElasticOut:create(CCActionlnterval*)(move-copy()-autorelease();CCEaseElasticInOut:create(CCActionlnterval*)(move-copy()-aut
43、orelease(),0.3f);/缓冲动作CCEaseBackln:create(CCActionlnterval*)(move-copy()-autorelease();CCEaseBackOut:create(CCActionlnterval*)(move-copy()-autorelease();CCEaseBacklnOut:create(CCActionlnterval*)(move-copy()-autorelease();,第一个参数是要缓冲的动作,其中基本缓冲动作需要第二个参数是速率,弹性缓冲动作需要第二个参数是震动的周期,默认值为0.3。,组合动作,2019/3/8,xxx
44、xxxxxxx,24,在游戏中,游戏对象有时不是执行一个动作,有时是多个动作的动作序列,有时是同时执行几个动作序列。这时候就需要使用组合动作的方式将多个动作或按序列组织,或合成在一起。,1.CCSequence定义一个动作序列,可以使用动作的CCArray数组;也可以把所有的动作作为参数传入create函数中,最后结尾参数使用NULL(空值)即可;还可以把两个有限时间动作按顺序传人create函数中。,CCFiniteTimeAction*seq2=CCSequence:create(action2#reverse2,NULL);m_kathia-runAction(seq2);,2.CCSp
45、awnCCSpawn动作是使被合成的动作同时进行。它的定义方法和动作序列一致,CCAction*action=CCSpawn:create(CCJumpBy:create(2,CCPointMake(300,0),50,4),CCRotateBy:create(2,720),NULL);m_grossini-runAction(action);,组合动作,2019/3/8,xxxxxxxxxx,25,3.CCRepeat和CCRepeatForever除了以上两个可以实现多个动作的类外,还有可以使一个动作重复播放的类,那就是CCRepeat和CCRepeatForever。二者都可以使动作重复
46、进行,不同之处就是CCRepeat可以在第二个参数中定义重复次数,而CCRepeatForever是一直重复的。,CCActionInterval*rep2=CCRepeat:create(CCFiniteTimeAction*)(seq-copy()-autorelease(),10);m_kathia-runAction(rep2);,CCAction*rep2=CCRepeatForever:create(CCActionlnterval*)(seq-copy()-autorelease();m_kathia-runAction(rep2);,跟随动作,2019/3/8,xxxxxxxx
47、xx,26,跟随动作CCFollow是一个节点跟随另外一个节点的动作。,voidActionFollow:onEnter()ActionsDemo:onEnter();centerSprites(1);CCSizes=CCDirector:sharedDirector()-getWinSize();m_grossini-setPosition(CCPointMake(-200,s.height/2);CCActionlnterval*move=CCMoveBy:create(2,CCPointMake(s.width*3,0);CCActionlnterval*move_back=move-r
48、everse();CCFiniteTimeAction*seq=CCSequence:create(move,move_back,null);CCAction*rep=CCRepeatForever:create(CCActionlnterval*)seq);m_grossini-runAction(rep);this-runAction(CCFollow:create(m_grossinifCCRectMake(0,0,s.width*2-100,s.height);,可调整动作速度,2019/3/8,xxxxxxxxxx,27,可调整速度动作CCSpeed不是一个独立的动作,可以把它理解为
49、是对目前动作的一个“包装”,经过这个“包装”以后,就可以实现“慢动作”和“快进”的效果。使用CCSpeed来处理很方便,Void SpeedTest:onEnter()EaseSpriteDemo:onEnter();CCSizes=CCDirector:sharedDirector()-getWinSize();CCActionlnterval*junpl=CCJunpBy:create(4#CCPointMake(-s.width+80,0),100,4);CCActionlnterval*jump2=jumpl-reverse();CCActionlnterval*rotl=CCRota
50、teBy:create(4,360*2);CCActionlnterval*rot2=rotl-reverse();CCFiniteTimeAction*seq3_l=CCSequence:create(jump2,jumpl,NULL);CCFiniteTimeAction*seq3_2=CCSequence:create(rotl,rot2,NULL);CCFiniteTimeAction*spawn=CCSpawn:create(seq3_1,seq3_2,NULL);CCSpeed*action=CCSpeed:create(CCRepeatForever:create(CCActio