cocos2D替换场景未初始化类

Posted

技术标签:

【中文标题】cocos2D替换场景未初始化类【英文标题】:cocos2D replace scene not initializing the class 【发布时间】:2012-02-03 06:36:59 【问题描述】:

我有两个场景(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 方法。

【问题讨论】:

【参考方案1】:

不要这样做:

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

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

[[CCDirector sharedDirector] replaceScene:mainMenu];

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

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

【讨论】:

我已经导入了 mainMenu.h 但使用该语句给了我一个错误(Unexpected Interface Name 'mainMenu': expected expression. I guess using that Node is required even if you don't want to初始化。【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

希望对某人有所帮助。

【讨论】:

以上是关于cocos2D替换场景未初始化类的主要内容,如果未能解决你的问题,请参考以下文章

Cocos2d 场景切换和替换问题

Objective - C 直接初始化(对于 Cocos2D 风格的动作)

cocos2d - CCDirector,replaceScene 功能问题

初始化cocos2d&ŧ039;的contentScale

正确重启/重新初始化半单例

application:didFinishLaunchingWithOptions: 真的是初始化 cocos2d 及其 OpenGL ES 视图的好地方吗?