Iphone Cocos2d-将CCSprite传递给子层

Iphone Cocos2d-将CCSprite传递给子层,iphone,objective-c,cocos2d-iphone,Iphone,Objective C,Cocos2d Iphone,我有一个场景,一个主层和一个子层,主层包含一个播放器*对象,它是CCSprite的一个子类,我想将播放器传递到子层,如下所示: BattleLayer* b = [[BattleLayer alloc] initWithPlayer:_player]; [((CCScene*)self.parent) addChild:b]; -(id)initWithPlayer:(Player *)p { if((self=[super init])) { _player

我有一个场景,一个主层和一个子层,主层包含一个播放器*对象,它是CCSprite的一个子类,我想将播放器传递到子层,如下所示:

BattleLayer* b = [[BattleLayer alloc] initWithPlayer:_player];
[((CCScene*)self.parent) addChild:b];

-(id)initWithPlayer:(Player *)p
{
    if((self=[super init]))
    {
        _player = p;
        [self addChild:_player.spriteSheet];
    }
    return self;
}
但是,当我执行[self addChild:_player.spriteSheet]时,这会给出一个错误

*** Assertion failure in -[BattleLayer addChild:z:tag:]
在传入之前,我已经尝试过将精灵从主层中移除,但即使使用“清理”:否,这也会导致错误

*** -[CCSpriteBatchNode tag]: message sent to deallocated instance 0x747a580

我做错了什么?实现这一点的最佳方法是什么?

我可以看到导致addSprite断言失败的三个原因之一

  • p是零
  • p、 spriteSheet为零
  • 最后,p.spriteSheet已经有一个父节点(即spriteSheet已经预先添加到一个CCNode)

我可以看到导致addSprite断言失败的三个原因之一

  • p是零
  • p、 spriteSheet为零
  • 最后,p.spriteSheet已经有一个父节点(即spriteSheet已经预先添加到一个CCNode)

我以前也遇到过这个问题,重新订购后保留并发布。我的对象是自动释放的,仅由CCLayer保留,因此这是有效的,请尝试:

[_player retain];
[_player removeFromParentAndCleanUp:YES];
[self addChild:_player];
[_player release];

然而,我遇到了一个错误,快速删除并重新添加精灵,这里有描述:

我以前遇到过这个问题,并保留了它,然后在重新排序后发布。我的对象是自动释放的,仅由CCLayer保留,因此这是有效的,请尝试:

[_player retain];
[_player removeFromParentAndCleanUp:YES];
[self addChild:_player];
[_player release];

但是,我遇到了一个快速删除和重新添加精灵的错误,这里描述了它:

那么,如果p.Spritesheet有父级,我该怎么办?[[u player.spriteSheet remove from parents and cleanup:YES];如果p.Spritesheet有父对象,我该怎么办?[[u player.spriteSheet remove from parents and cleanup:YES];这没用