Sprite animation not working in NSThread method in Cocos2d

300 views Asked by At

I created a Thread like the below one:

[NSThread detachNewThreadSelector:@selector(connectionFinishedThread) toTarget:self withObject:nil];

inside this method, i created one sprite and given animation for this sprite. Animation not visible.

My code inside the Thread method:

CCSprite *aniSprite = [CCSprite spriteWithSpriteFrameName:@"r_anim01.png"];
aniSprite.position = ccp(50, 50);
[self addChild:aniSprite z:22];

[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"r_anim1.plist"];

CCSpriteBatchNode *animSheet = [CCSpriteBatchNode batchNodeWithFile:@"r_anim1.png"];
[self addChild:animSheet];

NSMutableArray *animFrames = [NSMutableArray array];
for (int i=1; i<=6; i++) {
    [animFrames addObject:
     [[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:
      [NSString stringWithFormat:@"r_anim1%d.png",i]]];
}

CCAnimation *anim = [CCAnimation animationWithSpriteFrames:animFrames delay:0.1f];
CCAction *spriteAction = [CCRepeatForever actionWithAction: [CCAnimate actionWithAnimation:anim]];

[sprite runAction:spriteAction];

Why it behaves like that?

2

There are 2 answers

0
CodeSmile On

Most changes to properties of CCNode classes must be done on the main thread. Cocos2D does not support multi-threading like Sprite Kit.

For example changing a sprite's texture from a background thread will certainly crash. But even subtle issues can occur because all properties are declared nonatomic.

The only way to use threads with cocos2d is to make sure whatever logic runs in the background thread does not directly change a node's properties. Ie doing some AI calculations in the background is fine, as long as AI actors aren't nodes but custom classes.

0
FuzzyBunnySlippers On

You should not try to manipulate cocos2d objects (e.g. CCNode derived object) from another thread. The container holding the object (CCLayer, CCScene, etc.) may be manipulating it at the same time and none of the typical concurrency mechanisms (mutexes) are in effect.

If you need your sprite to take some kind of update action every time the frame updates, should schedule the container to update and update the sprite then. It is very common to move sprites around, update their orientations, etc., during the CCScene update.