我使用menus tutorial中的基本代码启动了我的应用程序。以这种方式,我所有的“屏幕”(只有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中,如果我goMenu应用程序以'NSInternalInconsistencyException‘终止,原因是:’孩子已经被添加。它不能被再次添加‘。我假设这是因为我试图在层的初始化代码中添加一些子子sprites,然后我再次添加它们。
我的第一次调试尝试是在所有层的onExit代码中调用[self removeAllChildrenWithCleanup:YES];。这并没有解决问题。我添加了一些调试日志,发现在脚本崩溃之前执行的最后一行是指定的[myLayerClass node];。layer类中的初始化代码根本不会被执行--所以它不可能是sprites或其他被添加的子类导致的问题。再说一次--请记住,当我第一次尝试打开任何场景时,一切都正常。它正在回到一个目前存在问题的开放场景中。
所以我尝试了一种不同的方法-- Cocos2D Hello world中使用的方法。我修改了所有的Layer类,添加了一个单例+(id) scene方法,定义如下:
+(id) scene
{
CCScene *scene = [CCScene node];
myLayerClass *layer = [myLayerClass node];
[scene addChild: layer];
return scene;
}在dealloc中添加了一个[super dealloc],并将我所有的初始化代码封装在:
-(id) init
{
if( (self=[super init] )) {
// All init code here....
}
}当然,场景管理器中的所有goLayerName单例方法都替换了它们的内容以匹配以下内容--例如:
+(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的工作方式,它一定很棒。另外,因为我的每个场景都会单独创建一次(因此每个层都会单独创建一次)。没有任何效果!当我第一次访问任何场景时,它都会按预期运行。每当我试图导航回任何现有的场景时,我都会得到上面提到的错误。
我尝试了一下SO和found this,但我不确定如何正确地实现它;我也不能完全确定这是否能解决问题--因为症状是不同的(他只是得到一个粉色屏幕,而我的应用程序终止了)。
任何帮助都将不胜感激。
发布于 2012-04-23 12:52:55
对于任何对这个问题感兴趣的人,我都能够解决这个问题。
总之,您添加的子项的任何子项都不会随releaseAllChildrenWithClenup一起发布。该函数只会释放直接的子级,因此您需要自己释放任何嵌套的子级。
在我的游戏中,我有一些角色,他们的眼睛嵌套在头部精灵中(这样我就可以移动/旋转头部)。眼睛有自己的动画循环,但我想让它们与头部一起变形。所有这些都起作用了,但是因为我在init中有一行代码,基本上就是[headSprite addChild:eyeSprite];,所以我还必须在onExit代码中添加[headSprite removeChild:eyeSprite];来解除它的关联,之后是,然后是releaseAllChildrenWithClenup,这样就删除了所有n=1级别的子级。
一旦处理好了,一切都如广告所说的那样工作。
https://stackoverflow.com/questions/10273039
复制相似问题