欢迎加入 Cocos2d-x 交流群: 193411763
转载时请注明原文出处 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。