美文网首页
Cocos2dx 小技巧(十二) 一种可行的系列动画播放方式

Cocos2dx 小技巧(十二) 一种可行的系列动画播放方式

作者: Mr_whale | 来源:发表于2017-10-22 20:43 被阅读0次

    喝口水,缓下气。
    这篇介绍的就真的是纯技巧性的东西了,没有啥知识点。先几句自问自答,又名:抛砖引玉。


    秋日埃菲尔

    **1、如果要让你个精灵先移动到某个坐标,然后再旋转,该如何实现呢?
    答:当然是使用Sequence了,疗效过,效果好!
    2、如果想让一个对象的动画播放完后,另外一个对象接下去播放
    答:这个的实现方法就比较多了,用TargetedAction 或者 Callfunc 等,都是可以的;
    3、如果想让多个对象安卓不同的时间段播放,那么该怎么做呢? 答:那就用多个Callfunc或者TargetedAction。如果你是这么回答的话,那我也只能呵呵了,有人会说用ActionManage,这个我没怎么去用过,这样也就不方便多说啥。下面介绍另外一种可行的方案。那就是用Array与Dictionary的组合。首先将执行的动作tag和动作的执行对象tag放入Dictionary中,再将Dictionary放入Array中,最后在Array中来个for语句循环播放动画
    **

    示例如下:

    继续我们的主角:boy,girl,girl_3。
    程序流程是:当boy 移动到girl旁边时调戏了girl一下,girl又气又恼,原地跳动了一下;之后boy又去找girl_3(真是花心啊),
    同样的招数用在girl_3上,girl_3不仅不在意,反而很高兴的原地转了一圈。

    1、先自定义一个函数来创建出我们所需要的三个动作,通过传入的整型参数来获取相应的动作

    Sequence* HelloWorld::getAction(int action_tag)
    {
        if(1 == action_tag)//移动
        {
            return Sequence::create(MoveTo::create(1.0f,Point(300,200)),
                                    CallFunc::create(CC_CALLBACK_0(runMyAction,this)),//调用runMyAction播放下一个动画
                                    NULL);
        }
        else if(2 == action_tag)//跳跃
        {
            return Sequence::create(JumpBy::create(1.0f,Point(350,200),20,2),
                                    CallFunc::create(CC_CALLBACK_0(runMyAction,this)),
                                    NULL);
        }
        else if(3 == action_tag)//旋转
        {
            return Sequence::create(RotateBy::create(1.0f,360),
                                    CallFunc::create(CC_CALLBACK_0(runMyAction,this)),
                                    NULL);
        }
        else
        {
            CCLOG("the action_tag is out of range");
            return NULL;
        }
    }
    

    2、创建对象,初始化array与Dictionary

    bool HelloWorld::init()
    {
        auto boy = Sprite::create("boy.png");
        boy->setPosition(Point(100,100));
        this->addChild(boy,1);
     
        auto girl = Sprite::create("girl_1.png");
        girl->setPosition(Point(100,100));
        this->addChild(girl,1);
     
        auto girl_3 = Sprite::create("girl_3.png");
        girl_3->setPosition(Point(100,100));
        this->addChild(girl_3,1);
      
        //下面初始化Array与Dictionary,之后将对象与动作放进入
        auto action_array = Array::create();
        action_array->retain();
     
        auto dic1 = Dictionary::create();
        auto dic2 = Dictionary::create();
        auto dic3 = Dictionary::create();
         
        dic1->setObject(boy,"sp");
        dic1->setObject(Integer::create(1),"action");//之行的动作tag为1,
        action_array->addObject(dic1);
     
        dic2->setObject(girl,"sp");
        dic2->setObject(Integer::create(2),"action");
        action_array->addObject(dic2);
     
     
        dic3->setObject(girl_3,"sp");
        dic3->setObject(Integer::create(1),"action");
        action_array->addObject(dic3);
     
        action_idx = 0;//初始化为0,播放动画时使用
     
        //播放动画
        this->runMyAction();//runMyAction是自定义函数,用来播放数组中的动画   
     
           return true;
    }
    

    3、播放动画的函数

    void HelloWorld::runMyAction()
    {
        action_idx++;//动作下标+1
     
        if(action_idx > action_array->count())
            return;//最后一个动画已播放完,结束播放动画
     
        auto dic = static_cast<dictionary*>(action_array->getObjectAtIndex(action_idx));//通过action_idx从array取出相应的字典
        auto sp = static_cast<sprite*>(dic->objectForKey("sp"));//取出要播放动画的对象
        auto act_tag = static_cast<integer*>(dic->objectForKey("action"));//取出要播放的动画tag
     
        auto act = getAction(act_tag->getValue());//通过动作的tag从getAction函数中取出相应的动作出来
     
        sp->runAction(act);
    }
    

    恩,就是这样子,其实我也没运行过,这里只是给小伙伴们展示一种可行的播放动画方式。如果你有其他的办法也可以拿出来交流交流。
    这篇写的挺乱的,可能与今天较为急躁的心情有关。挺早就想写这篇博文了,只是一直抽不出时间,所以今晚再怎样也要写好。近来也确实比较忙。呼呼

    尊重原创,转载请注明来源:http://blog.csdn.net/star530/article/details/25007815

    相关文章

      网友评论

          本文标题:Cocos2dx 小技巧(十二) 一种可行的系列动画播放方式

          本文链接:https://www.haomeiwen.com/subject/lpynuxtx.html