• 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);

    }



           好了,随便给显示几个例子吧。




    本节DEMO下载


    转载请注明出处:http://gl.paea.cn/contents/fdb2fb923944b2e6.html

  • 相关阅读:
    JDK -GET,POST
    (三十四)什么是自动化测试模型之模块化驱动测试实例
    Linux 运维命令及知识
    python_检测一些特定的服务端口有没有被占用
    程序员常用网站
    网络安全与CTF在线学习资源网站
    MySQL_语句
    python脚本实现自动安装nginx
    超赞的Linux软件
    Python运维中常用的_脚本
  • 原文地址:https://www.cnblogs.com/Anzhongliu/p/6091984.html
Copyright © 2020-2023  润新知