Cocos2d - 将CCSprite传递给子层

时间:2012-02-09 22:12:56

标签: iphone objective-c cocos2d-iphone

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

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

我在这里做错了什么?什么是实现这一目标的最佳方式?

2 个答案:

答案 0 :(得分:2)

我可以看到导致addSprite断言失败的三件事之一。

  • p是nil
  • p.spriteSheet是nil
  • 或者最后,p.spriteSheet已经有一个父级(即spriteSheet已经预先添加到CCNode)

答案 1 :(得分:1)

我之前遇到过这种情况并保留,然后在重新排序后发布。我的对象是自动释放的,仅由CCLayer保留,所以这有效,试试:

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

但是我遇到了一个快速删除和重新添加精灵的错误,这里有描述:http://www.cocos2d-iphone.org/forum/topic/9980