博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
cocos2dx 几个精灵依照顺序播放动画解决方法
阅读量:6240 次
发布时间:2019-06-22

本文共 3895 字,大约阅读时间需要 12 分钟。

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

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

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

如今说说更好的方法吧:

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

一:

先在类里定义数据和函数

std::vector
> 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
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
a; a=v_action.at(0); int sprite_tag=a.at(0); int action_tag=a.at(1); std::vector
>::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,所以想播放其它动画就改函数吧)

如今看看效果:

完毕!

你可能感兴趣的文章
android 在非UI线程更新UI仍然成功原因深入剖析
查看>>
清北NOIP训练营集训笔记——图论
查看>>
oracle ORA-00060死锁查询、表空间扩容
查看>>
转载自https://github.com/jsfront/src/blob/master/css.md
查看>>
MySQL索引优化分析(上)
查看>>
jquery $().each,$.each的区别
查看>>
sql server 2000/2005 游标的使用操作(转)
查看>>
Tomcat 部署 Web 通过 ip 直接访问项目
查看>>
Cache Fusion
查看>>
bzoj2502
查看>>
Xcode 控制台打印Unicode字符串转换为中文
查看>>
Codeforces 831C--Jury Marks (思维)
查看>>
oracle内存结构+系统全局区+程序全局区(pga)+排序区+大型池+java池
查看>>
成长7 - lambda,filter,map的运用
查看>>
New Concept English Two 18 46
查看>>
Qt 删除目录
查看>>
Git 移除某些文件
查看>>
poj2940
查看>>
django做form表单的数据验证
查看>>
【OpenFOAM】——OpenFOAM入门算例学习
查看>>