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?
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.