cocos2dx 几个精灵按照顺序播放动画解决方法

我先描述一下这个问题:

拿之前做的卡牌游戏来说,如果一方场上有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);

以上创建了两个精灵和两个按钮(另一个忽略),点击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;
	}
}

很简单,就是一个动作,当然我们可以根据需要增加。(注意返回参数是Sequence,所以想播放其他动画就改函数吧)

现在看看效果:

完成!

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-29 11:14:59

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

cocos2dx 几个精灵依照顺序播放动画解决方法

我先描写叙述一下这个问题: 拿之前做的卡牌游戏来说.假设一方场上有3张牌,那么肯定要以一种顺序来播放攻击动画.我是以从左到右的方式. 我的解决方案是向每张牌都传递一个延时參数,然后在runAction的时候使用DelyTime,可是这样的方法太麻烦. 如今说说更好的方法吧: 基本思路是vector与callfunc相结合. 一: 先在类里定义数据和函数 std::vector<std::vector<int>> v_action;//储存精灵TAG和动画TAG的容器 void pu

Android播放动画的方法示例

今天开始陆续整理一下一些常规的Android常用开发实用程序. 第一季:Android播放动画的方法示例 1. 通常动画都是gif图像,推荐使用easygifanimator工具来将其拆解为多个图片,建议是png的: 2. 在Android工程的res目录下新增anim目录,新建一个xml文件,比如loading.xml: <?xml version="1.0" encoding="utf-8"?> <animation-list android:

微擎ueditor编辑器图片批量上传顺序混乱的解决方法

上周六有客户反映刚上线的商城管理系统在商品详情页批量上传图片的时候出现图片显示顺序与上传顺序不一致的问题,经排查,发现是编辑器在上传时是按上传完成的顺序插入图片的,即先传完先显示,在网上查了一下,发现很多人都有遇到这个问题,初步认为是ueditor编辑器的bug,于是按照网上的方法去解决,但都没有解决问题,调试查找之后发现网上的解决方法根本不适合微擎的多图上传,因为涉及的文件都没有被调用....无奈只好自己查找,在和同事查找了将近一天之后终于找到了两个相关文件,然后又花了些功夫,最后总算是弄好了

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

现象:插入如下代码后仍然无法看视频(注:视频已确认为浏览器支持格式) <video controls="controls" width="500px" height="300px" preload="metadata"> <source src="video/FF4.ogv" type="video/ogg"> <source src="video

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

I am using nginx and I have already add the line location /file/ { rewrite ^/file/([0-9]+)/([0-9]+)/([^/]*)/([0-9]+)/(.*)$ /file.php?id=$1&server=$2&hash=$3&expire=$4&file=$5 last; } in the conf file of the domain. But the videos do not pl

关于Cocos2d-x程序运行时候提示关闭程序的解决方法

这个情况是资源没有被加载的表现 如果AppDelegate.cpp里面没有文件索引的语句 FileUtils::getInstance()->addSearchPath("res");,就更加说明是资源找不到的问题 解决方法 把资源直接复制在Resources文件的根目录下,不要放在Resources/Res目录下.

win8系统上搭建cocos2dx开发坏境遇到的问题以及解决方法(开发windows phone游戏)

搭建坏境流程: 1.安装window sdk(8.0版本) 2.安装VS2012英文版 一开始在nokia 1320上运行我们公司的游戏,游戏可以正确安装到手机上运行成功.但是确无法启动调试. 报错信息: 网上百度谷歌了尝试了很多方法都不成功,还是一直提示通信端口被占用. 后来发现电脑装的windos sdk的版本是8.0,而手机的系统版本是8.1,因此推测是SDK和手机系统版本不匹配.(等待下载安装8.1的SDK后再验证是否是此原因) 于是我把测试设备换成windows phone 925,安

cocos2d-x发生undefined reference to `XX&#39;异常 一劳永逸解决办法

cocos2d-x发生undefined reference to `XX'错误 一劳永逸解决方法 参考文章: http://blog.csdn.net/kafeidev/article/details/9157895 http://blog.csdn.net/fu_zk/article/details/12836431 eclipse cocos2dx项目,出现错误 E:/Acocos2d-x/cocos2d-1.0.1-x-0.11.0/MyBilliard/android/jni/../.

cocos2d-x发生undefined reference to `XX&#39;异常 一劳永逸解决的方法

转自:http://www.myexception.cn/operating-system/1620542.html cocos2d-x发生undefined reference to `XX'错误 一劳永逸解决方法 參考文章: http://blog.csdn.net/kafeidev/article/details/9157895 http://blog.csdn.net/fu_zk/article/details/12836431 eclipse cocos2dx项目.出现错误 [plai