zoukankan      html  css  js  c++  java
  • Cocos2dx 小技巧(十二) 一种可行的系列动画播放方式

    今早发生了一件事让我感觉特气愤!去年的这个时候,我和小伙伴们一起在操场上拍毕业照,之后有个当地报纸的记者来我们学校取材,看到我们后打算给我们拍几张创意张扬点的毕业照。之后呢,照片出来了,拍的效果大伙都非常惬意,最后这张照片还被作为湄洲日报和校报的版面。这是我大学认为最骄傲的几件事之中的一个。但是,就在今天,我发现这张照片被某市的男科医院拿去当杂志的插图,文章标题还是治疗男人xxx(不准笑,我非常严肃的)。尼玛的,我看到后二话不说直接打电话到那医院大骂一通,好在他们的认错态度还算诚恳,所以我也没过分追究。本来这件事也就结束了,谁知道当地一个破论坛为了炒作又把这事给发了出来,我又尼玛了!打电话过去还挂我电话!假设我是黑客看我不把你的论坛给黑了!

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


  • 相关阅读:
    中国的人生路上是紧跟领导就会有回报
    重游三峡广场有感
    假如你没有我
    关于中小型软件企业技术管理的建议(转)
    街客
    游歌乐山有感
    高成就者的反常思维
    漫谈创业和管理-程序员5大思维障碍 (转)
    QQ情缘
    javascript library
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/4182167.html
Copyright © 2011-2022 走看看