在我的代码中,我创建了一个GameManager单例,它有一个负责更改场景的方法。我调用的第一个场景是MenuScene,之后我用GameScene替换它。当我这样做时,控制台输出显示:
2013-10-07 19:40:55.895 MyGame[56164:a0b] -[MenuScene distance]: unrecognized selector sent to instance 0xb460690
2013-10-07 19:40:56.011 MyGame[56164:a0b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[MenuScene distance]: unrecognized selector sent to instance 0xb460690'
从日志中,我不明白为什么我得到-[MenuScene distance] ...
,因为距离是GameScene的属性,而不是MenuScene。
以下是用于更改场景的GameManager方法:
-(void)runSceneWithID:(SceneTypes)sceneID {
SceneTypes oldScene = currentScene;
currentScene = sceneID;
//NSString* str;
id sceneToRun = nil;
switch (sceneID)
{
case kBeginScene:
sceneToRun = [BeginScene node];
break;
case kGameScene:
sceneToRun = [GameScene node];
break;
case kMenuScene:
sceneToRun = [MenuScene node];
break;
default:
CCLOG(@"Unknown ID, cannot switch scenes");
return;
break;
}
if (sceneToRun == nil) {
// Revert back, since no new scene was found
currentScene = oldScene;
return;
}
if ([[CCDirector sharedDirector] runningScene] == nil) {
[[CCDirector sharedDirector] runWithScene:sceneToRun];
} else {
[[CCDirector sharedDirector] replaceScene:sceneToRun];
}
}
此外,替换场景的调用是在一个图层类中,它是MenuScene的一部分。见下文:
-(void)startGameScene {
[[GameManager sharedGameManager] runSceneWithID:kGameScene];
}
请帮忙。
答案 0 :(得分:0)
您收到此消息是因为distance
消息已发送到没有此选择器的MenuScene
实例(显然GameScene
确实存在)。
所以可能在你的场景中某个地方管理单例出错了你仍然(或已经)有一个MenuScene实例,你希望有一个GameScene实例。
在Xcode中添加exception breakpoint以查看邮件的确切位置。
PS:在像单身人士这样的全局实例中管理场景时,要小心非常。如果在全局实例/变量中保留对场景(或任何节点)的强引用,则可能很容易泄漏内存。确保每个场景都使用日志实现了dealloc方法,以确定它实际上是否已取消分配。