cocos2dx-Action动作
声 明
本教程仅用于初学cocos2dx同学使用,内容由本人(孤狼)学习过程中笔记编写,本教程使用cocos2dx版本为2.1.4。本教程内容可以自由转载,但必须同时附带本声明,或注明出处。 gl.paea.cn版权所有。
|
大家好,欢迎回到“和屌丝一起学coco2dx”系列教程,上节我们说到“CCScrollView视图”做了一个可以拖动的背景,不知道你做出来没有,这节开始,我们就不说控件了,因为,你已经把基本控件学完了 ,你蛮厉害的嘛。嘿嘿,好了,从这节开始,我们就要学操作代码部分了,这块相对控件那块来说稍微难一点,枯燥一点,但是我相信这不是打到你的理由,你一定会继续努力学会它的是吧。好,那我们开始今天的学习-Action动作。
【一】:它是什么
顾名思义,Action动作就是我们用来控制各个元素的命令,我们通过这些命令来控制各个控件向上,向下,插入...艹邪恶了,好了知道是什么了就行了。
【二】:函数
1.常用动作操作函数
[1]:runAction("action对象");
//执行一个action动作对象
[2]:CCDirector::sharedDirector()->getActionManger()->pauseTarget("对象");
//暂停一个对象的动作
[3]:CCDirector::sharedDirector()->getActionManager()->pauseAllRunningActions();
//暂停所有对象的动作
[4]:pauseSchedulerAndActions();
//暂停所有对象的动作及其更新函数
[5]:CCDirector::sharedDirector()->getActionManager()->resumeTarget("对象");
//继续一个对象的动作
[6]:CCDirector::sharedDirector()->getActionManager()->resumeTargets("CCSet对象");
//继续所有对象的动作
[7]:resumeSchedulerAndActions();
//继续所有对象的动作及其更新函数
[8]:stopAction("action对象");
//停止对象的动作
[9]:stopActionByTag("tag值");
//停止目标对象的动作
[10]:stopAllActions();
//停止所有对象的动作
[11]:CCDirector::sharedDirector()->getActionManager()->removeAction("action对象");
//删除动作对象
[12]:CCDirector::sharedDirector()->getActionManager()->removeActionByTag("tag值");
//删除动作对象
[13]:CCDirector::sharedDirector()->getActionManager()->removeAllActions();
//删除所有动作对象
[14]:CCDirector::sharedDirector()->getActionManager()->removeAllActionsFromTarget("tag值");
//删除所有相同tag值得动作对象
2.常用动作函数
怎么记呢?这里孤狼我给大家总结了个规律:
所有的调用都是create 有给予(To)就有伴随(By) 带把儿(By)的都有双向动作。(使用reverse()可以获取反向动作) 有进(In)就有出(Out),我们更喜欢进进出出(InOut)。 这里还要注意的一点是:By方法的变量都是相对当前量的,不是绝对的哦。 |
[1]:CCMoveTo::create("时间","坐标");
//几秒后移动到坐标点
[2]:CCMoveBy::create("时间","坐标");
//几秒后移动到坐标点
[3]:CCScaleTo::create("时间","缩放比例");
//几秒后缩放到指定大小(1:原大小;大于1:放大;小于1:缩小)
[4]:CCScaleBy::create("时间","缩放比例");
//几秒后缩放到指定大小(1:原大小;大于1:放大;小于1:缩小)
[5]:CCRotateTo::create("时间","角度");
//几秒后旋转多少度[0,360]
[6]:CCRotateBy::create("时间","角度");
//几秒后旋转多少度[0,360]
[7]:CCSkewTo::create("时间","x轴角度","y轴角度");
//几秒后倾斜指定角度
[8]:CCSkewBy::create("时间","x轴角度","y轴角度");
//几秒后倾斜指定角度
[9]:CCJumpTo::create("时间","目标位置","高度","到目标所需次数");
//几秒后经过几次跳到指定位置
[10]:CCJumpBy::create("时间","目标位置","高度","到目标所需次数");
//几秒后经过几次跳到指定位置
[11]:CCBezierTo::create("时间","ccBezierConfig构造体");
//几秒内按指定贝塞尔曲线运动
[12]:CCBezierBy::create("时间","ccBezierConfig构造体");
//几秒内按指定贝塞尔曲线运动
[13]:CCTintTo::create("时间","红","绿","蓝");
//几秒后变为指定颜色
[14]:CCTintBy::create("时间","红","绿","蓝");
//几秒后变为指定颜色
[15]:CCCardinalSplineTo::create("时间","控制点坐标数组","拟合度");
//几秒内按曲线运动(拟合度0最柔和)
[16]:CCCardinalSplineBy::create("时间","控制点坐标数组","拟合度");
//几秒内按曲线运动(拟合度0最柔和)
[17]:CCCatmullRomTo::create("时间","控制点坐标数组");
//几秒内完成一个样条插值轨迹(直线)
[18]:CCCatmullRomBy::create("时间","控制点坐标数组");
//几秒内完成一个样条插值轨迹(直线)
[19]:CCFadeIn::create("时间");
//渐显
[20]:CCFadeOut::create("时间");
//渐消
[21]:CCEaseBounceIn::create("action对象");
//让目标动作具有反弹效果,从起点反弹
[22]:CCEaseBounceOut::create("action对象");
//让目标动作具有反弹效果,从终点反弹
[23]:CCEaseBounceInOut::create("action对象");
//让目标动作具有反弹效果,起点终点都反弹
[24]:CCEaseBackIn::create("action对象");
//让目标动作具有回力效果,起点作为回力点
[25]:CCEaseBackOut::create("action对象");
//让目标动作具有回力效果,终点作为回力点
[26]:CCEaseBackInOut::create("action对象");
//让目标动作具有回力效果,起点终点都作为回力点
[27]:CCEaseElasticIn::create("action对象");
//让目标动作具有弹力效果,起点具有弹性
[28]:CCEaseElasticOut::create("action对象");
//让目标动作具有弹力效果,终点具有弹性
[29]:CCEaseElasticInOut::create("action对象");
//让目标动作具有弹力效果,起点终点都具有弹性
[30]:CCEaseExponentialIn::create("action对象");
//让目标动作缓慢开始
[31]:CCEaseExponentialOut::create("action对象");
//让目标动作缓慢结束
[32]:CCEaseExponentialInOut::create("action对象");
//让目标动作缓慢开始并缓慢结束
[33]:CCEaseSineIn::create("action对象");
//让目标动作由慢到快
[34]:CCEaseSineOut::create("action对象");
//让目标动作由快到慢
[35]:CCEaseSineInOut::create("action对象");
//让目标动作由慢到快再到慢
[36]:CCEaseRateAction::create("action对象","速度");
//为目标动作设置速度
[37]:CCSpeed::create("action对象","倍数");
//为目标动作速度翻倍
[38]:CCSpawn::create("action对象1","action对象2".....);
//多个不同类动作同时执行(NUll结尾)
[39]:CCSequence::create("action对象1","action对象2"......);
//多个目标动作顺序执行(NUll结尾)
[40]:CCBlink::create("时间","次数");
//几秒内闪烁几次
[41]:CCRepeat::create("action对象","次数");
//重复目标动作
[42]:CCRepeatForever::create("action对象");
//永久重复目标动作
[43]:CCDelayTime::create("时间");
//延迟几秒执行(在顺序执行CCSequence中延迟哦)
[44]:CCFollow::create("跟随对象","跟随范围");
//镜头跟着目标走,超过范围就结束。
[45]:CCOrbitCamera::create("时间","起始半径","半径差","起始z角","旋转z角","起始x角","旋转x角");
//几秒内球面运动
[46]:CCCallFunc::create("对象","回调函数");
//创建一个回调动作(不带参数)
[47]:CCCallFuncN::create("对象","回调函数");
//创建一个回调动作(传调用者为参数)
[48]:CCCallFuncND::create("对象","回调函数","任意参数");
//创建一个回调动作(带2个参数)
【三】:示例
1.我们来创建一个项目Actiondemo
2.加载一些图片用来做例子
3.疯狂编码:
Actiondemo.h
1.我们写3个回调函数
void funback1();
void funback2(CCNode * node);
void funback3(CCNode * node,void * a);
Actiondemo.cpp
1.加载两张图片进来作为精灵。
2.每个方法都用一下
CCSize mysize=CCDirector::sharedDirector()->getWinSize();
//首先我们创建两个Sprite对象,我们来操控它
CCSprite * sp1 = CCSprite::create("fp.png");
CCSprite * sp2 = CCSprite::create("p.png");
sp1->setPosition(ccp(100,mysize.height/2));
sp2->setPosition(ccp(mysize.width-100,mysize.height/2-100));
this->addChild(sp1);
this->addChild(sp2);
//创建一个CCMoveTo操作(给绝对地址)
CCActionInterval * a1=CCMoveTo::create(5.0f,ccp(mysize.width-100,mysize.height/2));
sp1->runAction(a1);
//创建一个CCMoveBy操作(给相对地址)
CCActionInterval * a2=CCMoveBy::create(5.0f,ccp(-300,0));
sp2->runAction(a2);
//sp2->runAction(a2->reverse()); 这个会向相反的方向跑哦
//创建一个CCScaleTo操作
CCActionInterval * a3=CCScaleTo::create(5.0f,2);
sp1->runAction(a3);
//创建一个CCMoveBy操作
CCActionInterval * a4=CCScaleBy::create(5.0f,0.5);
sp2->runAction(a4);
//创建一个CCRotateTo操作
CCActionInterval * a5=CCRotateTo::create(5.0f,180);
sp1->runAction(a5);
//创建一个CCRotateBy操作
CCActionInterval * a6=CCRotateBy::create(5.0f,180);
sp2->runAction(a6);
//创建一个CCSkewTo操作
CCActionInterval * a7=CCSkewTo::create(5.0f,180,180);
sp1->runAction(a7);
//创建一个CCSkewBy操作
CCActionInterval * a8=CCSkewBy::create(5.0f,180,180);
sp2->runAction(a8);
//创建一个CCJumpTo操作
CCActionInterval * a9=CCJumpTo::create(5.0f,ccp(200,300),180,3);
sp1->runAction(a9);
//创建一个CCJumpBy操作
CCActionInterval * a10=CCJumpBy::create(5.0f,ccp(200,300),180,3);
sp2->runAction(a10);
//创建CCBezier
ccBezierConfig bezierconfig;
bezierconfig.controlPoint_1=CCPointMake(200,100);
bezierconfig.controlPoint_2=CCPointMake(300,200);
bezierconfig.endPosition=CCPointMake(340,250);
//创建一个CCBezierTo操作
CCActionInterval * a11=CCBezierTo::create(5.0f,bezierconfig);
sp1->runAction(a11);
//创建一个CCBezierBy操作
CCActionInterval * a12=CCBezierBy::create(5.0f,bezierconfig);
sp2->runAction(a12);
//创建一个CCTintTo操作
CCActionInterval * a13=CCTintTo::create(5.0f,255,100,255);
sp1->runAction(a13);
//创建一个CCTintBy操作
CCActionInterval * a14=CCTintBy::create(5.0f,150,0,150);
sp2->runAction(a14);
//创建point数组
CCPointArray * pa=CCPointArray::create(5);
pa->addControlPoint(ccp(100,10));
pa->addControlPoint(ccp(200,250));
pa->addControlPoint(ccp(110,180));
pa->addControlPoint(ccp(300,100));
pa->addControlPoint(ccp(200,280));
//创建一个CCCardinalSplineTo操作
CCActionInterval * a15=CCCardinalSplineTo::create(5.0f,pa,0);
sp1->runAction(a15);
//创建一个CCCardinalSplineBy操作
CCActionInterval * a16=CCCardinalSplineBy::create(5.0f,pa,0);
sp2->runAction(a16);
//创建point数组
CCPointArray * pa2=CCPointArray::create(5);
pa2->addControlPoint(ccp(100,10));
pa2->addControlPoint(ccp(200,250));
pa2->addControlPoint(ccp(110,180));
pa2->addControlPoint(ccp(300,100));
pa2->addControlPoint(ccp(200,280));
//创建一个CCCatmullRomTo操作
CCActionInterval * a17=CCCatmullRomTo::create(5.0f,pa2);
sp1->runAction(a17);
//创建一个CCCatmullRomBy操作
CCActionInterval * a18=CCCatmullRomBy::create(5.0f,pa2);
sp2->runAction(a18);
//创建一个CCFadeIn操作
CCActionInterval * a19=CCFadeIn::create(5.0f);
sp1->runAction(a19);
//创建一个CCFadeOut操作
CCActionInterval * a20=CCFadeOut::create(5.0f);
sp2->runAction(a20);
这里不要和上面的几个sp对象混了,记得把上面的注释掉。
如果懒得动就去的我博客http://gl.paea.cn直接下载DEMO
//创建4个CCMoveTo操作,1个CCScaleTo操作和三个精灵plan1,plan2,plan3
CCSprite * plan1=CCSprite::create("fp.png");
CCSprite * plan2=CCSprite::create("fp.png");
CCSprite * plan3=CCSprite::create("fp.png");
plan1->setPosition(ccp(100,mysize.height/2+100));
plan2->setPosition(ccp(100,mysize.height/2));
plan3->setPosition(ccp(100,mysize.height/2-100));
this->addChild(plan1,1,500);
this->addChild(plan2,1,501);
this->addChild(plan3,1,502);
CCActionInterval * ac1=CCMoveTo::create(5.0f,ccp(mysize.width-100,mysize.height/2+100));
CCActionInterval * ac2=CCMoveTo::create(5.0f,ccp(mysize.width,mysize.height/2));
CCActionInterval * ac3=CCMoveTo::create(5.0f,ccp(mysize.width-100,mysize.height/2-100));
CCActionInterval * ac4=CCMoveTo::create(5.0f,ccp(mysize.width*2,mysize.height/2));
CCActionInterval * ac5=CCScaleTo::create(5.0f,1.5f);
//创建一个CCEaseBounceIn操作
CCActionInterval * a21=CCEaseBounceIn::create(ac1);
plan1->runAction(a21);
//创建一个CCEaseBounceOut操作
CCActionInterval * a22=CCEaseBounceOut::create(ac2);
plan2->runAction(a22);
//创建一个CCEaseBounceInOut操作
CCActionInterval * a23=CCEaseBounceInOut::create(ac3);
plan3->runAction(a23);
//创建一个CCEaseBounceIn操作
CCActionInterval * a24=CCEaseBounceIn::create(ac1);
plan1->runAction(a24);
//创建一个CCEaseBounceOut操作
CCActionInterval * a25=CCEaseBounceOut::create(ac2);
plan2->runAction(a25);
//创建一个CCEaseBounceInOut操作
CCActionInterval * a26=CCEaseBounceInOut::create(ac3);
plan3->runAction(a26);
//创建一个CCEaseBackIn操作
CCActionInterval * a24=CCEaseBackIn::create(ac1);
plan1->runAction(a24);
//创建一个CCEaseBackOut操作
CCActionInterval * a25=CCEaseBackOut::create(ac2);
plan2->runAction(a25);
//创建一个CCEaseBackInOut操作
CCActionInterval * a26=CCEaseBackInOut::create(ac3);
plan3->runAction(a26);
//创建一个CCEaseElasticIn操作
CCActionInterval * a27=CCEaseElasticIn::create(ac1);
plan1->runAction(a27);
//创建一个CCEaseElasticOut操作
CCActionInterval * a28=CCEaseElasticOut::create(ac2);
plan2->runAction(a28);
//创建一个CCEaseElasticInOut操作
CCActionInterval * a29=CCEaseElasticInOut::create(ac3);
plan3->runAction(a29);
//创建一个CCEaseExponentialIn操作
CCActionInterval * a30=CCEaseExponentialIn::create(ac1);
plan1->runAction(a30);
//创建一个CCEaseExponentialOut操作
CCActionInterval * a31=CCEaseExponentialOut::create(ac2);
plan2->runAction(a31);
//创建一个CCEaseExponentialInOut操作
CCActionInterval * a32=CCEaseExponentialInOut::create(ac3);
plan3->runAction(a32);
//创建一个CCEaseSineIn操作
CCActionInterval * a33=CCEaseSineIn::create(ac1);
plan1->runAction(a33);
//创建一个CCEaseSineOut操作
CCActionInterval * a34=CCEaseSineOut::create(ac2);
plan2->runAction(a34);
//创建一个CCEaseSineInOut操作
CCActionInterval * a35=CCEaseSineInOut::create(ac3);
plan3->runAction(a35);
//创建一个CCEaseRateAction操作
CCActionInterval * a36=CCEaseRateAction::create(ac1,0.5);
plan1->runAction(a36);
//创建一个CCSpeed操作
CCSpeed * a37=CCSpeed::create(ac2,30);
plan2->runAction(a37);
//创建一个CCSpawn操作
CCFiniteTimeAction * a38=CCSpawn::create(ac3,ac5,NULL);
plan3->runAction(a38);
//创建一个CCSequence操作
CCFiniteTimeAction * a39=CCSequence::create(ac1,ac2,ac5,NULL);
plan3->runAction(a39);
创建一个CCBlink操作
CCActionInterval * a40=CCBlink::create(1,2);
plan3->runAction(a40);
//创建一个CCRepeat操作
CCFiniteTimeAction * a41=CCRepeat::create(a40,2);
plan3->runAction(a41);
//创建一个CCRepeatForever操作
CCFiniteTimeAction * a42=CCRepeatForever::create(a40);
plan3->runAction(a42);
//创建一个CCDelayTime操作,在顺序执行中延迟哦
CCActionInterval * a43=CCDelayTime::create(2);
CCFiniteTimeAction * a433=CCSequence::create(ac1,a43,ac5,NULL);
plan3->runAction(a433);
//创建一个CCFollow操作
//CCRectMake(x,y,宽,高)
//创建背景参照物
CCSprite * czsp=CCSprite::create("HelloWorld.png");
czsp->setPosition(ccp(mysize.width/2,mysize.height/2));
this->addChild(czsp,-1);
plan2->runAction(ac4);
CCFollow * a44=CCFollow::create(plan2,CCRectMake(0,0,960,320));
this->runAction(a44);
//创建一个CCOrbitCamera操作
CCActionInterval * a45=CCOrbitCamera::create(5,100,50,0,180,0,90);
plan3->runAction(a45);
//创建一个CCCallFunc操作
//还要实现回调里的操作,看下面的回调函数funback1
CCCallFunc * back1=CCCallFunc::create(this,callfunc_selector(Actiondemo::funback1));
CCFiniteTimeAction * cq1=CCSequence::create(ac1,back1,NULL);
plan1->runAction(cq1);
//创建一个CCCallFuncN操作
CCCallFuncN * back2=CCCallFuncN::create(this,callfuncN_selector(Actiondemo::funback2));
CCFiniteTimeAction * cq2=CCSequence::create(ac1,back2,NULL);
plan1->runAction(cq2);
//创建一个CCCallFuncND操作
CCCallFuncND * back3=CCCallFuncND::create(this,callfuncND_selector(Actiondemo::funback3),(void *)10);
CCFiniteTimeAction * cq3=CCSequence::create(ac1,back3,NULL);
plan1->runAction(cq3);
3.先实现3个回调函数
这里说一下CCNode。 任何一个能被绘制或者包含能被绘制的东西都是一个CCNode。 最常用的CCNode有:CCScene,CCLayer,CCSprite,CCMenu. 一个CCNode的主要特性包括: 1.他们能够容纳别的CCNode节点,比如能addChild, getChildByTag, removeChild 。 2.他们能定期的调度回调函数,比如能schedule,unschedule等。 3.他们能执行动作,比如runAciton,stopAction等。 一些节点能给自己或他们的子几点提供一些额外额功能。 所以这里我们回调函数funback2中node就等于plan1,可以直接调用 |
如果用不好就去的我博客http://gl.paea.cn直接下载DEMO
void Actiondemo::funback1(){
CCSprite * sp=(CCSprite *)this->getChildByTag(500);
CCActionInterval * rote=CCRotateTo::create(5.0f,180);
sp->runAction(rote);
}
void Actiondemo::funback2(CCNode * node){
CCActionInterval * rote=CCRotateTo::create(5.0f,180);
node->runAction(rote);
}
void Actiondemo::funback3(CCNode * node,void * a){
int num=(int)a; //这里要引用下指针
CCActionInterval * rote=CCRotateTo::create(num,180);
node->runAction(rote);
}
好了,随便给显示几个例子吧。