我先描写叙述一下这个问题:

拿之前做的卡牌游戏来说。假设一方场上有3张牌,那么肯定要以一种顺序来播放攻击动画。我是以从左到右的方式。

我的解决方案是向每张牌都传递一个延时參数,然后在runAction的时候使用DelyTime,可是这样的方法太麻烦。

如今说说更好的方法吧:

基本思路是vector与callfunc相结合。

一:

先在类里定义数据和函数

std::vector<std::vector<int>> v_action;//储存精灵TAG和动画TAG的容器

void push_action(int sprite_tag,int action_tag);//加入动作序列
void run_action(int sprite_tag,int action_tag);//播放动作
void next_action();//下一个动作 Sequence* run(int action_tag);//依据TAG返回动作 bool isRunAction;//是否正在播放动作

二:

在init初始化參数

	//还没有播放动作
isRunAction=false; Size visibleSize = Director::getInstance()->getVisibleSize();
Vec2 origin = Director::getInstance()->getVisibleOrigin();
//演员一
auto actor1 = Sprite::create("CloseNormal.png");
actor1->setTag(11);
actor1->setPosition(250,visibleSize.height/2);
this->addChild(actor1,2);
//演员二
auto actor2 = Sprite::create("CloseNormal.png");
actor2->setTag(22);
actor2->setPosition(300,visibleSize.height/2);
this->addChild(actor2,2);
//演员一跳跃
auto play1 = MenuItemImage::create(
"CloseNormal.png",
"CloseSelected.png",
CC_CALLBACK_1(HelloWorld::menuCallback, this));
play1->setTag(1);
play1->setPosition(250,visibleSize.height/5);
//演员二跳跃
auto play2 = MenuItemImage::create(
"CloseNormal.png",
"CloseSelected.png",
CC_CALLBACK_1(HelloWorld::menuCallback, this));
play2->setTag(2);
play2->setPosition(300,visibleSize.height/5); auto closeItem = MenuItemImage::create(
"CloseNormal.png",
"CloseSelected.png",
CC_CALLBACK_1(HelloWorld::menuCloseCallback, this)); closeItem->setPosition(Vec2(origin.x + visibleSize.width - closeItem->getContentSize().width/2 ,
origin.y + closeItem->getContentSize().height/2)); // create menu, it's an autorelease object
auto menu = Menu::create(play1,play2,closeItem, NULL);
menu->setPosition(Vec2::ZERO);
this->addChild(menu, 1);

以上创建了两个精灵和两个button(还有一个忽略),点击play1那么演员1跳一下,点击play2演员2跳一下。为了实现两个演员不同一时候起跳和记录我们操作的顺序,我们须要在menuCallback里这样写:

void HelloWorld::menuCallback(Ref* pSender)
{
auto menuItem = (MenuItemImage*)pSender;
Sprite* actor;
switch (menuItem->getTag())
{
case 1:
push_action(11,1);
break;
case 2:
push_action(22,1);
break;
default:
break;
}
}

这里使用了push_action函数,作用是播放动作或者将操作存入容器:

void HelloWorld::push_action(int sprite_tag,int action_tag)
{
if(isRunAction==false)//假设没有在播放动作,那么直接播放此动作
{
isRunAction=true;
run_action(sprite_tag,action_tag);
}
else//假设正在播放,那么将此动作存入容器
{
std::vector<int> v_sprite;
v_sprite.push_back(sprite_tag);
v_sprite.push_back(action_tag); v_action.push_back(v_sprite); }
}

凝视已经比較具体了~

我们先看看run_action函数里面有什么吧:

void HelloWorld::run_action(int sprite_tag,int action_tag)
{
auto actor = (Sprite*)getChildByTag(sprite_tag);
auto squence = Sequence::create(run(action_tag),
CallFunc::create(this,callfunc_selector(HelloWorld::next_action)),
NULL);
actor->runAction(squence);
}

函数的作用是依据传入的两个tag播放动作,然后调用next_action:

void HelloWorld::next_action()
{
if(v_action.empty())
{
isRunAction=false;
}
else
{
std::vector<int > a;
a=v_action.at(0);
int sprite_tag=a.at(0);
int action_tag=a.at(1);
std::vector<std::vector<int>>::iterator it = v_action.begin();
v_action.erase(it);
run_action(sprite_tag,action_tag);
}
}

假设容器里没有数据则说明接下来没有动作能够播放了,则把isRunAction赋为false,下次就能够直接播放动作。

假设容器里有数据。我们先把这项数据取出然后删除它。然后再调用run_action。

最后我们看看run里面有什么吧:

Sequence* HelloWorld::run(int action_tag)
{
switch (action_tag)
{
case 1:
return Sequence::create(MoveBy::create(0.2,Vec2(0,100)),
MoveBy::create(0.2,Vec2(0,-100)),
NULL);
default:
break;
}
}

非常easy,就是一个动作。当然我们能够依据须要添加。(注意返回參数是Sequence,所以想播放其它动画就改函数吧)

如今看看效果:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXEzNjk4NDY2NDI=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

完毕!

cocos2dx 几个精灵依照顺序播放动画解决方法的更多相关文章

  1. 格式工厂转化成mp4 avc格式 暴风影音不能播放的解决方法

    格式工厂转化成mp4 avc格式 暴风影音不能播放的解决方法  先转成其他mp4 确保能播放 然后再转成avc

  2. zepto的返回顶部scrollTop的动画解决方法

    写移动端的时候,引入的zepto.js里的animate不包括scrollTop,所以返回顶部的时候,没有动画的效果.这里我使用的是setInterval的方法.代码详情如下 <!DOCTYPE ...

  3. 微软BI 之SSIS 系列 - 变量查询语句引起列输出顺序不一致的解决方法

    开篇介绍 这个问题来自于 天善BI社区,看了一下比较有意思,因为我自己认为在 SSIS中处理各种类型文件的经验还比较丰富(有一年的时间几乎所有ETL都跟文件相关),但是这个问题确实之前没有特别考虑过. ...

  4. 关于微信H5页面开发中音乐不自动播放的解决方法

    我想应该有很多人在做H5场景应用.H5微刊.H5微杂志的时候加入背景音乐吧(客户需求),相信很多人一定碰过不能自动播放的时候,即使是相同的iPhone 5s也有不播放的时候,很蛋疼吧!? 之前我的解决 ...

  5. HTML5添加 video 视频标签后仍然无法播放的解决方法 IIS添加MIEI类型

    现象:插入如下代码后仍然无法看视频(注:视频已确认为浏览器支持格式) <video controls="controls" width="500px" h ...

  6. A Script Pro nginx URL重写规则无法播放MP4解决方法

    I am using nginx and I have already add the line location /file/ { rewrite ^/-]+)/([-]+)/([^/]*)/([- ...

  7. Vue中swiper手动滑动后不能自动播放的解决方法

    用户操作swiper之后,是否禁止autoplay.默认为true:停止.如果设置为false,用户操作swiper之后自动切换不会停止,每次都会重新启动autoplay.操作包括触碰,拖动,点击pa ...

  8. 【转】使用ffmpeg转码的MP4文件需要加载完了才能播放的解决办法

    1.前一段时间做了一个ffmpeg转码MP4的项目,但是转出来的MP4部署在网站上需要把整个视频加载完成才能播放,到处找资料,最后找到解决方案记录于此备忘. FFMpeg转码由此得到的mp4文件中, ...

  9. cocos2d-x发生undefined reference to `XX'异常 一劳永逸解决的方法

    转自:http://www.myexception.cn/operating-system/1620542.html cocos2d-x发生undefined reference to `XX'错误 ...

随机推荐

  1. STM32 HAL库 IIC 协议库函数

    /* 第1个参数为I2C操作句柄 第2个参数为从机设备地址 第3个参数为从机寄存器地址 第4个参数为从机寄存器地址长度 第5个参数为发送的数据的起始地址 第6个参数为传输数据的大小 第7个参数为操作超 ...

  2. 2015 Multi-University Training Contest 5 hdu 5348 MZL's endless loop

    MZL's endless loop Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Oth ...

  3. C/C++ 浮点数比较问题

    本系列文章由 @YhL_Leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/50255623 Never try to ...

  4. PatentTips - Sleep state mechanism for virtual multithreading

    BACKGROUND The present disclosure relates generally to information processing systems and, more spec ...

  5. spring mvc拦截器interceptor

    1.  SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理.比如通过它来进行权限验证,或者是来判断用户是否登陆,或者是像123 ...

  6. 关于Thread的那些事

    关于Thread的那些事 1 : 你能够调用线程的实例方法Join来等待一个线程的结束.比如: public static void MainThread() { Thread t = new Thr ...

  7. Windows身份验证和混合验证的差别

    两个验证方式的不同主要集中在信任连接和非信任连接.         windows 身份验证相对于混合模式更加安全,使用本连接模式时候,sql不推断sapassword.而仅依据用户的windows权 ...

  8. 夜&#183; 启程

    有写博客的念头,还是在去年的时候. 那天早上我非常兴奋,也非常忐忑.由于我立即要去JD面试.JD大家都知道的,对我这样的没见过世面的人来说.这就是个高高在上殿堂. 结果我的满腔热血.被一张面试题卷给浇 ...

  9. bzoj4554: [Tjoi2016&Heoi2016]游戏(二分图匹配)

    4554: [Tjoi2016&Heoi2016]游戏 题目:传送门 题解: 一道很牛逼的匈牙利..和之前模拟赛的一道题有点相似(不过这题不用完美匹配) 我们可以把连续的行和列全部编号(如果之 ...

  10. CoreData 从入门到精通(四)并发操作

    通常情况下,CoreData 的增删改查操作都在主线程上执行,那么对数据库的操作就会影响到 UI 操作,这在操作的数据量比较小的时候,执行的速度很快,我们也不会察觉到对 UI 的影响,但是当数据量特别 ...