切记 cocos2d中一个CCAction 对象只能被使用到一个Sprite对象上
在cocos2d中,经常需要将一个action施加到多个Sprites上面,以达到相同的效果。
所以经常会有下面的代码:
CCMoveTo * move =[CCMoveTo actionWithDuration:DESK_ANIMATE_TIME position:point];
[deskImage runAction:move];
[HeadImageSprite runAction:move];
[TipsSprite runAction:move];
这个代码会导致crash,原因在于CCMTo这个action的是一个施加在Sprite上面的异步的操作,
[deskImage runAction:move]
runAction调用完了之后,会继续调用
[HeadImageSprite runAction:move];
action的生命周期跟action的变量的定义的生命周期不一样,它需要在action被sprite执行完之后才完成,这个是不受我们的代码的控制的。所以一个action不能施加到多个Sprite上面去。
改进的方法如下:
CCMoveTo * move =[CCMoveTo actionWithDuration:DESK_ANIMATE_TIME position:point];
[deskImage runAction:move];
[HeadImageSprite runAction:[move copy]];
[TipsSprite runAction:[move copy]];
我们对action做一个copy,copy一份拷贝,然后再施加到其他的Sprite对象上,这样就可以了。