切记 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对象上,这样就可以了。