Cocos2d iphone cocos2d删除场景/场景转换

Cocos2d iphone cocos2d删除场景/场景转换,cocos2d-iphone,transition,Cocos2d Iphone,Transition,我使用在中找到的基本代码启动了我的应用程序。通过这种方式,我的所有“屏幕”(只有5个)都实现为CCLayer类的扩展,我有一个共享+场景管理器,它通过将我的层类作为子类添加到新场景中,然后使用导演运行或替换当前正在播放的场景: +(void) goMenu{ // \/---------- Issue right here, next line: CCLayer *layer = [MenuLayer node]; [SceneManager go: layer]; }

我使用在中找到的基本代码启动了我的应用程序。通过这种方式,我的所有“屏幕”(只有5个)都实现为CCLayer类的扩展,我有一个共享+场景管理器,它通过将我的层类作为子类添加到新场景中,然后使用导演运行或替换当前正在播放的场景:

+(void) goMenu{
    // \/---------- Issue right here, next line:
    CCLayer *layer = [MenuLayer node];
    [SceneManager go: layer];
}

+(void) go: (CCLayer *) layer{
    CCDirector *director = [CCDirector sharedDirector];
    CCScene *newScene = [SceneManager wrap:layer];
    if ([director runningScene]) {
        [director replaceScene: newScene];
    }else {
        [director runWithScene:newScene];
    }
}

+(CCScene *) wrap: (CCLayer *) layer{
    CCScene *newScene = [CCScene node];
    [newScene addChild: layer];
    return newScene;
}
我遇到的问题如下。假设我有两层--“MenuLayer”和“GameLayer”。我从MenuLayer开始,然后使用
[SceneManager go:[GameLayer node]]
转换到GameLayer。从GameLayer,如果我进入菜单,应用程序终止时出现“NSInternalInconsistencyException”,原因是:“已添加子项。”。无法在指定位置再次添加。我假设这是因为我试图在层的初始化代码中添加一些子精灵,然后再次添加它们

我调试的第一次尝试是调用
[self-removeAllChildrenWithCleanup:YES]在我所有层的
onExit
代码中。这并没有解决问题。我添加了一些调试日志,发现在脚本启动之前执行的最后一行是指定的
[myLayerClass节点]。layer类中的init代码根本不会执行——因此它不可能是正在添加的精灵或其他子元素之一导致了问题。再一次--记住,在我第一次尝试打开任何场景时,一切都是正常的。它正在移回当前有问题的已打开场景

所以我尝试了另一种方法——Cocos2D Hello world中使用的方法。我通过添加singleton+(id)场景方法修改了所有层类,该方法定义如下:

+(id) scene
{
    CCScene *scene = [CCScene node];    
    myLayerClass *layer = [myLayerClass node];
    [scene addChild: layer];
    return scene;
}
在Dealoc中添加了一个
[super dealoc]
,并将我的所有初始化代码封装在:

-(id) init
{
    if( (self=[super init] )) {
        // All init code here....
    }
}
当然,场景管理器中的所有
goLayerName
singleton方法的内容都已被替换以与此匹配,例如:

+(void) goMenu {
    //CCLayer *layer = [MenuLayer node];
    //[SceneManager go: layerMenu];
    CCDirector *director = [CCDirector sharedDirector];
    if ([director runningScene])
        [director replaceScene:[MenuLayer scene]];
    else 
        [director runWithScene:[MenuLayer scene]];
}
我想这就是Cocos2D的hello world的工作方式,一定很好。而且,因为我的每个场景都会单独创建一次(因此每个层都会单独创建一次)。没有任何效果!我第一次访问任何场景时,它都会按预期运行。每当我尝试导航回任何现有场景时,都会出现上面提到的错误

我试着四处闲逛,但我不确定如何正确地实施它;此外,我也不完全确定这是否能解决问题——因为症状不同(他只是得到一个粉红色的屏幕,而我的应用程序终止)


任何帮助都将不胜感激。

对于任何对这个问题感兴趣的人,我能够解决这个问题

总之,您添加的子项的任何子项都不会随
releaseAllChildrenWithClenup
一起释放。该函数将只释放直接子级,因此您有责任自己释放任何嵌套子级

在我的游戏中,我有一些角色,他们的眼睛嵌套在头部精灵中(这样我就可以移动/旋转头部)。眼睛有自己的动画循环,但我希望它们与头部一起变换。所有这些都起作用了,但因为我在init中有一行代码,基本上是
[headprite addChild:eyeSprite],我还必须添加
[headSprite removeChild:eyeSprite]
在onExit code中,要将其分离,后跟
releaseAllChildrenWithClenup
以删除所有n=1级子级


一旦处理好了,一切都像广告中所说的那样运作。

对于任何对这个问题感兴趣的人,我都能够解决这个问题

总之,您添加的子项的任何子项都不会随
releaseAllChildrenWithClenup
一起释放。该函数将只释放直接子级,因此您有责任自己释放任何嵌套子级

在我的游戏中,我有一些角色,他们的眼睛嵌套在头部精灵中(这样我就可以移动/旋转头部)。眼睛有自己的动画循环,但我希望它们与头部一起变换。所有这些都起作用了,但因为我在init中有一行代码,基本上是
[headprite addChild:eyeSprite],我还必须添加
[headSprite removeChild:eyeSprite]
在onExit code中,要将其分离,后跟
releaseAllChildrenWithClenup
以删除所有n=1级子级


一旦处理完毕,一切都如广告所示。

仅供参考,我说的“myLayerClass”是指menuLayer、gameLayer、settingsLayer等。仅供参考,我说的“myLayerClass”是指menuLayer、gameLayer、settingsLayer等。。