Cocos2d-x教程(7)-动作

欢迎加入 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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值