大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处.
如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy 
大家对Cocos2d中动作的使用大概都很清楚了,其实本身action的概念也不复杂.
但是在某些情况下,一般的动作不能满足我们需求的时候,我们就必须使用更高级的Action方法来解决问题.
比如,串行化(不是序列化哦,这是两个完全不同的概念)不同Action的执行…有些童鞋可能会说很简单,直接用CCActionSequence不就结了,但是等等我还没说完…这些串行执行的动作的目标是不同的.
再说的具体点,游戏中有2个队列,分别是我方队列和敌方队列,每个队列有若干unit,每个unit可以做攻击动作,同时每个unit也可以做被攻击的动作.现在要求的逻辑是:
1.取出一个unit发起攻击动作
2.等到攻击动作结束后,被攻击的unit再完成被攻击动作
3.依次串行化以上2个步骤,直到所有unit都处理完毕
看似简单的要求,如果使用正常的Action来完成就会发现无从下手.其实一般的解决办法是有的,但是有限制,就是假定每个被攻击动作的时间都一致.这样可以通过特定延时的方法来解决,伪代码如下:
Array *actions
for each unit in list
attacker = unit
attackTarget = unit.target
CallBack *cb = ^{}
Delay *delay = ;
;
;
;
end for
基本上类似如上的代码,注意其中增加了一个延时1秒钟,因为我知道AttackedAction大概要运行1秒钟.
如果每次AttackedAction运行的时间不确定的话,这招就没有用了.
我们这时必须使用另外一种Action:CCTargetedAction
CCTargetedAction是一个很神奇的类,它本身没有什么动作效果,但是它可以把一个动作和一个特定目标绑定起来,并且返回一个新的Action,我们就可以按需要操作这个新的动作了.
不过该类在Cocos2d-x中和Cocos2d-2.x中才存在,而本猫使用的Cocos2d的版本为最新的3.4.9.而在cocos2d 的v3版本中,CCTargetedAction类是不存在的.
不过好消息是,2.x版本中的对应类是可以在3.x中使用的,我们只需要将原来的代码拷贝到3.x中就可以了.
但是光拷贝是不行的,据说会将一个动作执行2遍,这时我们必须手动再加一条代码:
-(BOOL)isDone{
return ;
}
即在具体类中写一个完成方法的重载即可.
好了,在Cocos2d v3.4.9中的准备工作都已完成,下面是实现代码:
NSMutableArray *actions = ;
for (BattleUnitRoot *unit in sortBattleUnits) {
BattleUnitRoot *target = _attackTargets;
CCTargetedAction *atkAction = [CCTargetedAction actionWithTarget:unit.sprite action:
(CCActionFiniteTime*)];
CCTargetedAction *atkedAction = [CCTargetedAction actionWithTarget:target.sprite action:
(CCActionFiniteTime*)];
;
;
}
CCActionSequence *seq = ;
;
编译运行,以下是实际游戏到效果动画: