編集:ARCを使用しています
私のコードでは (この本の ShootEmUp の例に基づいており、これを強くお勧めします。第 8 章のソース コードはこちらから入手できます)、次の方法で GameScene にアクセスするトリックをよく使用します。
+(GameScene*) sharedGameScene;
これは、GameScene の静的インスタンスへの参照を返し、GameScene のすべての子 (ShipEntity、InputLayer など) によって GameScene と対話するために使用されます (編集: GameScene のシングルトン インスタンスとも呼ばれます)。
複数のレベルを作成するには、毎回異なるレベル データをロードする SceneWithId:(int) メソッドというメソッドを実装することを考えました。
編集: init メソッドのコード スニペット:
-(id) initWithId:(int)sceneId
{
CCLOG(@"scene With id");
if ((self = [super init]))
{
//All common initialization happens here..
switch (sceneId) {
case 1:
[self loadFirstLevelData];
break;
case 2:
[self loadSecondLevelData];
break;
default:
[self loadSecondLevelData];
break;
}
//Other common stuff..
[self setUpCounters];
[self setUpWeaponsMenu];
[self scheduleUpdate];
[self schedule:@selector(timerUpdate:) interval:1];
InputLayerButtons* inputLayer = [InputLayerButtons node];
[self addChild:inputLayer z:1 tag:GameSceneLayerTagInput];
}
編集:そのinitメソッドは大丈夫ですか? dispatch_once を使用するこの投稿を見つけました。私は同じことをする必要がありますか?
それとも、GameScene クラスを作成してサブクラス化する必要がありますか?
E.g. FirstGameScene : GameScene
編集: @LearnCocos2D のアドバイスに従い、クリーンアップ メソッドを使用しました。それを使用して、シングルトン オブジェクトの音楽レイヤーの再生を停止しました (MusicLayer オブジェクトは AppDelegate で初期化され、それを使用して音楽を「管理」するつもりでしたすべてのシーン - 問題は、dealloc で停止しないと、初期化時にロードされた音楽を再生し続けることでした)。
-(void) loadFirstLevelData{
//HERE WILL LOAD ALL SPECIFIC ELEMENTS: ENEMIES, BONUSES etc..
//AS WELL AS THE MUSIC FOR THE LEVEL
[[MusicLayer sharedMusicLayer] _loadMusic:@"1.mp3"];
[[MusicLayer sharedMusicLayer] playBackgroundMusicFile: @"1.mp3"];
}
-(void) cleanup
{
//Should I remove all child loaded in LoadLevelData??
CCLOG(@"cleanup GameScene");
[[MusicLayer sharedMusicLayer] stopAllMusic];
//MusicLayer is not a child of GameScene but of AppDelegate - the idea is to keep loading and unloading music files - sometimes I need to keep playing the file between scenes and hence I used the singleton pattern for this as well..
[super cleanup];
}
しかし、私はまだいくつかの疑問を持っています:
GameScene クラスに複数の loadLevelData メソッドがあっても問題ありませんか? 各メソッドの長さは 200 行です。GameScene をサブクラス化しようとしましたが、少し面倒です。私はよりよく説明します。サブクラスのヘッダー ファイルに "GameScene.h" をインポートしました。そうすることで、特定のメソッド (init など) のみをオーバーライドした場合、GameScene にインポートされたさまざまなクラス (InputLayerButtons など) を確認できると期待していました。そうではありません。したがって、Objective-C でインポートがどのように機能するかはおそらく理解できません
クリーンアップ メソッドで特定の子を削除しても問題ありませんか? LoadLevelXXXData メソッドに追加されたすべての子を削除して、メモリ使用量を削減しようと考えました。
この質問に報奨金を設定しましたが、質問を非常に正確にするために主題を十分に明確に理解していないため、おそらく回答をテストして再編集する必要があります。希望は大丈夫です。
PS: Cocos2D Shooter Game のUML スタイルの図を誰かが共有したいと思うなら、それは素晴らしいことです:)