问题
I have a CCSprite
called sprite
that is a child of a CCLayer
called movingLayer
that is itself a child of the current CCLayer
running my game logic, so it is self
in this case. movingLayer
is moving back and forth across the screen in a repeat forever action and sprite
is riding along on it. I want to get sprite
to "get off" of movingLayer
and "get on" to self
where it can do some actions of its own.
When I try to do this, I need to tell movingLayer
to remove sprite
and self
to add sprite.
This is what I did...
- (void)attack:(id)sender
{
[sprite stopAllActions];
[movingLayer removeChild:sprite cleanup:YES];
[self addChild:sprite z:1];
CGFloat distance = ccpDistance(sprite.position, ccp(sprite.position.x, -sprite.contentSize.height/2));
id goDown = [CCMoveTo actionWithDuration:distance/moveDuration position:ccp(sprite.position.x, -sprite.contentSize.height/2)];
id repeatDown = [CCRepeatForever actionWithAction:[CCSequence actions:[CCMoveTo actionWithDuration:0 position:ccp(sprite.position.x, sprite.contentSize.height/2+self.contentSize.height)], [CCMoveTo actionWithDuration:moveDuration position:ccp(sprite.position.x, -sprite.contentSize.height/2)], nil]];
id attackAction = [CCSequence actions:goDown, repeatDown, nil];
[sprite runAction:attackAction];
}
I think stopAllActions
is redundant, but that's not the problem. If I remove sprite
from movingLayer
before adding it to self
I crash for accessing a zombie, and if I try to add it to self
first, I crash for trying to add something already added.
回答1:
Have you tried setting cleanup to NO?
Alternatively, try to retain sprite before you remove it from movingLayer, then release it when you're done with it:
[sprite retain];
[movingLayer removeChild:sprite cleanup:YES];
[self addChild:sprite z:1];
[sprite release];
来源:https://stackoverflow.com/questions/6720615/how-to-transfer-a-ccsprite-from-one-parent-to-another