现在的位置: 首页 > 综合 > 正文

Cocos2d-x教程第(7)讲-动作

2013年07月11日 ⁄ 综合 ⁄ 共 4438字 ⁄ 字号 评论关闭

       转载时请注明原文出处 http://blog.csdn.net/u012945598

       Cocos2d-x中的动作基类是CCAction,CCAction的绝大多数实现类都派生自CCFiniteTimeAction,由CCFiniteTimeAction派生出的两个主要类分别是瞬时动作(CCActionInstant)和持续性动作(CCActionInterval),这两类动作是可以配合使用的,在后面我们将会讲解。

7.1  瞬时动作

        瞬时动作就是指能立刻完成那个的动作,比如设定位置,设定缩放,这些动作在下一帧会立刻执行并完成动作。下面介绍一下常用的瞬时动作。

         1.CCPlace

         该动作用于将节点放置到某个指定位置,作用于修改节点的Position属性相同(Sprite->setPosition(ccp(100,100))),

         CCFiniteTimeAction * placeAction = CCPlace::create(ccp(100,100));

         Sprite->runAction(placeAction);

         2.CCFlipX ,CCFlipY

         这两个动作分别用于将精灵沿X和Y轴反向显示,其作用与setFlipX,setFlipY的属性相同,将他们包装成动作类也是为了便于与其他动作进行组合。

         CCFiniteTimeAction * flipXAction =CCFlipX::create(true);

         Sprite->runAction(flipXAction);

         3.CCShow和CCHide

         这两个动作分别用于显示和隐藏节点,其作用与节点的setVisible属性的作用相同。

         CCFiniteTimeAction * hideAction=CCHide::create();

         Sprite->runAction(hideAction);

7.2    持续性动作

          持续性动作指的是在一段时间内逐渐完成的动作,一般情况下同一种持续性动作都会存在两种不同的变种动作,分别具有To和By的后缀,To为绝对变化,By为相对变化,下面我们来看几个例子

           1.CCMoveTo和CCMoveBy

            两种动作都用于使节点做直线运动,我们分别创建两个动作

            CCMoveTo::create(2.0f,ccp(100,100));

            CCMoveBy::create(2.0f,ccp(100,100));

            CCMoveTo中,第一个参数2.0f代表在两秒钟之内完成动作,第二个参数表示使节点移动到x,y坐标分别为100,100的位置,而在CCMoveBy中则表示在2秒内节点向x方向移动100像素,向y方向移动100像素,表示相对位移。

           2.CCJumpTo和CCJumpBy

           两种动作表示使节点以一定的轨迹跳跃到指定的位置,例如 创建一个跳跃动作:两秒内,原地跳跃,高度250像素,跳跃一次

          CCJumpBy * jump= CCJumpBy::create(2.0f , ccp(0,0) , 250 , 1);

          CCJumpTo的初始化方法:  CCJumpTo::create(ccTime duration, CCPoint pos , float height , int jumps);

          3.贝塞尔曲线运动  CCBezierTo和CCBezierBy

          贝塞尔曲线运动也就是抛物线,对于数学不太好的人来说相对难以理解,大家可以上网搜索一下贝塞尔曲线的相关知识。下面是创建贝塞尔曲线运动的方法:

          //创建贝塞尔曲线的配置

          ccBezierConfig bezier;     

          bezier.controlPoint_1=ccp(100,0);                                         //波谷偏向值

          bezier.controlPoint_2=ccp(200,250);                                    //波峰偏向值

          bezier.endPosition=ccp(300,50);                                           //动作终点

          CCBezierTo * bezierTo=CCBezierTo::create(4.0f,bezier);//创建CCBezierTo的动作对象

          sprite->runAction(bezierTo);                                                   //精灵执行动作

          其中动作的起始位置就是精灵所在的位置。

         4.CCScaleTo和CCScaleBy 

         两种动作的作用是产生缩放的效果,使节点的缩放系数随时间线性变化

         CCScaleTo * scale=CCScaleTo::create(2.8f,0.4f,1.0f);//三个参数分别代表动作持续时间,X方向拉伸倍数,Y方向拉伸倍数

         CCScaleBy * scale=CCScaleBy::create(2.8f,0.4f,1.0f);//CCScaleBy与To的区别在于By是,By是在原来的倍数基础上拉伸,比如原来是1.0倍,则拉伸后X方向是0.4倍,如果原来是2.0倍,则现在X方向是0.8倍。

         在卡牌游戏中的卡牌翻转效果就可以用CCScale动作来实现。

         5.CCRotateTo和CCRotateBy

         两种动作产生旋转的效果,第一个参数是时间,第二个参数为旋转角,正方向为顺时针方向

         CCRotateTo * Rot1=CCRotateTo::create(2.0f , 90);   

         其中CCRotateBy也是在原来的旋转角度基础上再旋转。

         6.CCFadeIn和CCFadeOut

        产生淡入淡出的效果,前者为淡入,后者为淡出。只有实现了CCRGBAProtocol接口的节点才可以执行这类动作,这是因为与透明度或颜色相关的属性都继承自CCRGBAProtocol接口。不过许多常见的节点已经实现了该接口,如CCSprite ,CCLayerColor等,所以一般我们不用当心这个问题

         CCFadeIn::create(ccTime duration) ;

         CCFadeOut::create(ccTime duration);

         7.CCFadeTo

         设置一段时间内的透明度变化

         CCFadeTo::create(ccTime duration,Glubyte opacity);

         Glubyte是8位无符号整数,可以取0-255内的任意整数,该动作只能应用在精灵上,子节点不会受父节点影响。

         8.CCBlink

         该动作可使节点闪烁,其参数为持续时间和闪烁次数

          CCBlink::create(ccTime duration,unsigned int uBlicks);

 7.3   复合动作           

          1.重复(CCRepeat/CCRepeatForever)

           CCRepeat可以指定重复的次数,而CCRepeatForever是让一个动作无限重复。

           CCRepeat * repeatAction =CCRepeat::create(moveAction,3); //指定一个moveAction动作重复三次

           CCRepeatForever * repeatForeverAction =CCRepeatForever::create(moveAction);//让moveAction动作永远重复

           Sprite->runAction(repeatForeverAction);//精灵执行动作 

          2.并列(CCSpawn)

          有时候我们希望一个精灵一边旋转,一个向前走,同时也会跳,这些动作同时执行,我们可以用CCSpawn来实现

          CCAction * action =CCSpawn::create(rotateAction,moveAction,jumpAction,NULL);

          CCSpawn也是一个动作,只不过这个动作中可以包含若干个动作,并且这些动作是同时执行的。由于CCSpawn的create函数的参数是可变的,所以最后一个参数用NULL表示结束。大家可以观察到创建动作的时候笔者使用的是CCAction,这是因为CCAction是所有动作类的父类,能直接用父类的地方就直接使用父类,这是一种不错的编程思想,当然如果不理解也可以直接使用CCSpawn创建。

          3.序列(CCSequence)

          CCSequence的使用其实与CCSpawn类似,它们的区别在于 CCSequence中包含的动作是一个一个执行的,而CCSpawn中的动作是一起执行的

          CCAction * action =CCSequence::create(rotateAction,moveAction,jumpAction,NULL);

          在这段代码中,会首先执行rotateAction动作,待动作执行完后再执行moveAction,moveAction执行完后再执行jumpAction。需要注意的是部分动作并不被复合动作支持,例如CCRepeatForever动作。

7.4   动作监听结束  CCCallFunc

         CCCallFunc是一个看不见的动作,它的作用就是回调某个类中的方法。

         例如我们在HelloWorld中声明一个backHome的方法

         void backHome();

         然后实现这个方法

         void HelloWorld::backHome{

         CCLog("backHome");

}

       下面我们创建一个动作moveToHome,并将这个动作与callFunc组合

        CCMoveTo * moveToHome =CCMoveTo::create(5.0f,ccp(200,200));

        CCCallFunc * callFunc=CCCallFunc::create(this, callfunc_selector(HelloWorld::backHome));

        CCSequence * action=CCSequence::create(moveToHome,callFunc,NULL);

        spirte->runAction(action); 

        此时精灵执行完移动的动作之后,会调用backHome方法,在控制台输出backHome。

  

抱歉!评论已关闭.