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