我有个需要执行两个动作的精灵,第二个动作在第一个动作执行完后再执行,请问如何实现比较好?
我目前的方法是在第一个动作执行完成后执行回调函数,设置一个标记,在第二个动作的函数中不断循环,直到标记为完成。但是这个回调函数的执行在第二个动作执行之后,导致标记始终未被设置,程序进入死循环。不知道大家有没有什么好办法?
用Sequence
参考下这个吧http://cn.cocos2d-x.org/tutorial/show?id=1081
— Begin quote from ____
引用第1楼abc88798于2015-02-28 11:47发表的 :
用Sequence
参考下这个吧http://cn.cocos2d-x.org/tutorial/show?id=1081 http://www.cocoachina.com/bbs/job.php?action=topost&tid=286319&pid=1248172
— End quote
谢谢你的回复,我想过用sequence,但是我的两个动作是分在不同函数里的,要把两个动作在两个函数里组成一个sequence,做起来并不好做。
setTag 后 getChildByTag不行吗
— Begin quote from ____
引用第3楼abc88798于2015-02-28 11:58发表的 回 2楼(catthunder) 的帖子 :
setTag 后 getChildByTag不行吗 http://www.cocoachina.com/bbs/job.php?action=topost&tid=286319&pid=1248184
— End quote
主要是sequence创建后add actions,另外一个原因是sequence不能提前和Sprite绑定,一旦sprite和sequence多了,就不好处理了。
写一个函数,函数中某个精灵执行连续动作,连续动作最后的回调函数是该函数本身
— Begin quote from ____
引用第5楼windyqiang于2015-02-28 12:56发表的 回 4楼(catthunder) 的帖子 :
写一个函数,函数中某个精灵执行连续动作,连续动作最后的回调函数是该函数本身 http://www.cocoachina.com/bbs/job.php?action=topost&tid=286319&pid=1248210
— End quote
谢谢。不知道你说的回调函数是该函数本身的作用是什么?
我改了判断第一个动作是否完成,把判断放到了update函数里面,这样不会造成第二个动作的函数进入死循环。目前看来是可行的,不知道以后会不会遇到其它问题。
当你执行第一个精灵动画的的时候,把第二个精灵记录下来,然后在第一动画结束的回调的时候调用第二个精灵的动画就好了。
— Begin quote from ____
引用第7楼zpbaaa于2015-03-02 10:19发表的 :
当你执行第一个精灵动画的的时候,把第二个精灵记录下来,然后在第一动画结束的回调的时候调用第二个精灵的动画就好了。 http://www.cocoachina.com/bbs/job.php?action=topost&tid=286319&pid=1249126
— End quote
谢谢。如果是一个精灵,那这种方法是可行的。不过我的第二个动作是要等一批精灵的第一个动作完成后再执行。
楼主,尝试下我的思路:为每个精灵写动作管理器,精灵都有一个自己的管理器,动作和数组一样,无动作的时候是【null】不执行动作,有动作的时候【动作1,,null】,大概思路就是这样,可以插入删除动作,自己管理很方便。
】
— Begin quote from ____
引用第9楼DDDigua于2015-03-02 14:20发表的 回 8楼(catthunder) 的帖子 :
楼主,尝试下我的思路:为每个精灵写动作管理器,精灵都有一个自己的管理器,动作和数组一样,无动作的时候是【null】不执行动作,有动作的时候【动作1,,null】,大概思路就是这样,可以插入删除动作,自己管理很方便。
】 http://www.cocoachina.com/bbs/job.php?action=topost&tid=286319&pid=1249356
— End quote
谢谢你的热心回答。我有按前面网友的提示,把一系列动作放到一个向量中,然后让它们一次运行。不过不知道是不是我哪里用得不对,感觉sequence执行起来仍然不够如意,而且程序一复杂起来也蛮难控制的。
我的代码是这么写的:
void CellSprite::AddAction(FiniteTimeAction* action){
m_ActionsVector.pushBack(action);
}
void CellSprite::RunActionSequence(){
if (m_ActionsVector.size() >= 1 && m_Sprite != nullptr){
auto *actions = Sequence::create(m_ActionsVector);
m_Sprite->runAction(actions);
// m_ActionsVector.clear();
}
}
目前我调用每个精灵的getNumberOfRunningActions() 去判断。