cocos2d - 已经添加了孩子。无法再次添加

Posted

技术标签:

【中文标题】cocos2d - 已经添加了孩子。无法再次添加【英文标题】:cocos2d - child already added. It can't be added again 【发布时间】:2011-10-03 19:00:08 【问题描述】:

所以我创建了一个暂停菜单,

- (void) reset 

    CCSprite * backg = [CCSprite spriteWithFile:@"noise.png"];
    backg.position = ccp(480/2, 320/2); 
    [pauseMenu addChild:backg];


    CCLabelBMFont *restartLabel = [CCLabelBMFont labelWithString:@"Restart" fntFile:@"good_dog_plain_32.fnt"];
    restartLabel.color = ccc3(68,136,168);
    CCMenuItemLabel *restartItem = [CCMenuItemLabel itemWithLabel:restartLabel target:self selector:@selector(restartMenu)];
    restartItem.position = ccp(0, 40);

    CCLabelBMFont *mainMenuLabel = [CCLabelBMFont labelWithString:@"Main Menu" fntFile:@"good_dog_plain_32.fnt"];
    mainMenuLabel.color = ccc3(68,136,168);
    CCMenuItemLabel *mainMenuItem = [CCMenuItemLabel itemWithLabel:mainMenuLabel target:self selector:@selector(exitMenu)];
    mainMenuItem.position = ccp(0, -40);

    CCLabelBMFont *resumeLabel = [CCLabelBMFont labelWithString:@"Resume" fntFile:@"good_dog_plain_32.fnt"];
    resumeLabel.color = ccc3(68,136,168);
    CCMenuItemLabel *resumeItem = [CCMenuItemLabel itemWithLabel:resumeLabel target:self selector:@selector(resumeMenu)];


    CCMenu *menu = [CCMenu menuWithItems:resumeItem,restartItem,mainMenuItem, nil];
    menu.position = ccp(480/2,320/2);
    [pauseMenu addChild:menu z:1];


    [self.hero sleep];

    [self addChild:pauseMenu];


这个菜单是在我的游戏场景中创建的,所以每当用户按下暂停按钮时,它就会出现,现在我有另一个场景叫做mainMenu,你可以从暂停菜单转到mainMenu,我使用了这个代码:

- (void) exitMenu 

    [[CCDirector sharedDirector] replaceScene:[mainMenu scene]];

因此,一旦您按下此按钮,它就会起作用并返回主菜单,但是当我按下 mainMenu 中的“播放”按钮并进入游戏并按下暂停按钮时,我收到此错误:@ 987654326@ ...如果我从暂停菜单重新启动游戏场景,则不会发生这种情况,只有在加载游戏后从主菜单进入游戏时才会发生这种情况。

【问题讨论】:

【参考方案1】:

因为每次你点击暂停按钮时它都会调用[self addChild:pauseMenu];。你可以试试这个:

int pauseMenuTag = 99;

if(![self getChildByTag:pauseMenuTag]) 
    [self addChild:pauseMenu z:0 tag:pauseMenuTag];

这有望检查您是否已经添加了节点。或者,您可以确保按钮调用的所有方法都使用 removeChild:cleanup: 删除暂停菜单

【讨论】:

我会支持这条评论,因为我一直在寻找这样做,它非常有帮助,但问题是在exitMenu 函数中我没有删除 pauseMenu 子项,所以当游戏再次运行时,孩子已经在那里了。你的解决方案会解决它,所以只会删除孩子。【参考方案2】:

在我的情况下,当我创建缺少 json 文件的场景时发生此错误:

var loginScene = ccs.load(res.MainScene_json); 

我删除了 MainScene_json 文件,这就是它给我这个错误的原因。当我正确引用正确的文件 Login_json 时,错误就消失了。

var loginScene = ccs.load(res.Login_json); 

【讨论】:

以上是关于cocos2d - 已经添加了孩子。无法再次添加的主要内容,如果未能解决你的问题,请参考以下文章

cocos2d.js

Cocos2D v3 CCParallaxNode 滚动无法让玩家保持焦点

如何在 cocos2d 中为图层添加滚动?

Cocos2d 中的游戏中心成就

如何在 Cocos2d CCLayer 中添加摇动手势?

无法将孩子添加到 GameScene,只能添加到 SKSpriteNode