cocos2D替换场景而不是初始化类

时间:2012-02-03 06:37:00

标签: ios ios4 cocos2d-iphone scene

我有两个场景(mainMenu)和其他(HelloWorldScene)。我可以使用替换场景切换场景但是在第二次尝试加载它之后它不会调用init方法。

到目前为止,这是我的努力。

//In my mainMenu.m

-(void)starting{

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

}

//and in my HelloWorldScene.m file

-(void)goMain{

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

}

我的问题是如何在替换场景时为该类调用 - (id)init方法。

3 个答案:

答案 0 :(得分:1)

不要这样做:

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

您正在尝试重新初始化已存在的对象(mainMenu)。如果你想使用相同的节点(我可能会添加相当不寻常的节点),那么你必须这样做:

[[CCDirector sharedDirector] replaceScene:mainMenu];

但是,由于您希望调用init,因此您希望创建主菜单的新实例,通过将节点消息发送到类本身,您可以实现与[HelloWorldLayer场景]相同的方式(假设MainMenu是班级名称):

[[CCDirector sharedDirector] replaceScene:[MainMenu node]];

答案 1 :(得分:0)

init方法通常设计为仅在首次创建对象时调用。当你切换回一个场景时,你可以编写自己的 - (void)switchBack方法并调用它来适当地更新场景(这可能与你的init方法看起来非常不同,因为你不想重新开始添加一切)。

我遇到了这个问题,最后我在场景之间切换时创建了一个新场景(并发布了当前场景),因为它对我来说并不昂贵。这很好,因为我可以在场景切换后释放所有未使用的纹理,而且我不必担心更新事物。

答案 2 :(得分:0)

init方法正在调用,但有些变量没有重置,我不得不在方法中手动重置它们。

通过为HellowWorldLayer创建一个句柄,我们可以调用该类内部定义的任何方法。

HelloWorldLayer *hw = [HelloWorldLayer node]; // This is how we create the handle.
[hw Testing]; // This is how we call any method inside.

[[CCDirector sharedDirector]replaceScene:[CCTransitionCrossFade transitionWithDuration:0.5 scene:hw]]; // Use that handle for changing the scene

希望它会帮助别人。