0

私のコードでは、シーンの変更を担当するメソッドを持つ 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] ...距離は MenuScene ではなく GameScene のプロパティであるため、取得する理由がわかりません。

以下は、シーンを変更するための 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];

}

助けてください。

4

1 に答える 1

0

メッセージがこのセレクターを持たないインスタンスdistanceに送信されたため、このメッセージが表示されます (明らかにあります)。MenuSceneGameScene

おそらく、シングルトンを管理しているシーンのどこかで問題が発生し、まだ (または既に) GameScene インスタンスがあるはずの MenuScene インスタンスが存在する可能性があります。

Xcode に例外ブレークポイントを追加して、メッセージの送信元を正確に確認します。

PS:シングルトンのようグローバル インスタンスでシーンを管理する場合は、十分に注意してください。グローバル インスタンス/変数でシーン (または任意のノード) への強力な参照を保持すると、簡単にメモリ リークが発生する可能性があります。実際に割り当て解除が行われることを確認するために、すべてのシーンにログを使用して実装された dealloc メソッドがあることを確認してください。

于 2013-10-07T20:53:58.637 に答える