2011-12-29 6 views
0

私はゲームエンジンのビットを別のゲームコードに移植しています.2つの懸念があります。GameScene sharedGameScene対GameSceneノード

コード:GameSceneは上記のコードであるよう

-(void) checkForBulletCollisions 
     { 
       Enemy* enemy; 
       CCARRAY_FOREACH([batch children], enemy) 
       { 
       if (enemy.visible) 
       { 
         BulletCache* bulletCache = [[GameScene sharedGameScene] bulletCache]; 
         //etc etc 

GameScene私はこのコードを移植していたプロジェクトでは、シングルトンではありません。ここで

はGameSceneのインタフェースコードは次のとおりです。

@interface GameScene : CCScene 
    +(void) newGame:(NSString*)levelFile; 
    -(void) reloadGame:(NSString*)levelFile; 
@end 

私はコードの先頭行を置き換えコードの先頭行移植する場合:

BulletCache* bulletCache = [[GameScene node] bulletCache]; 

を私は正しい軌道に乗っているだろうか?

+0

[GameSceneノード]あなたが期待する結果を得ることはありませんので、新しいGameSceneインスタンスを返します。 checkForBulletCollisionsメソッドを持つクラスは、GameSceneインスタンスへの参照を持つ必要があります。これにより、bulletCache = [theGameSceneInstance bulletCache]を呼び出すことができます。さらに、GameSceneはシングルトンには適していません。 – hiepnd

答えて

0

hiepndが述べたように、ノードメソッドは新しい自動解放インスタンスを作成します。しかし、あなたが移植しているコードは、シングルトンを呼び出すことです。シングルトンが「現在のシーン」であると仮定します。したがって、移植では、ノード階層の最上位ノードを見つけて、それが実際にクラスGameSceneであることを確認してから、bulletCacheそれから。次のように

現在のシーンがディレクターから取得することができます。

CCScene *currentScene = [[CCDirector sharedDirector] runningScene]; 
GameScene *gameScene = nil; 
if ([currentScene isKindOfClass:[GameScene class]]) gameScene = currentScene; 
BulletCache *bulletCache = [gameScene bulletCache]; 
+0

チップのおかげで!私のプロジェクトでは、BulletCacheのトップノードはLevelObjectクラスで、それ自体はCCNodeのサブクラスですが、他のプロジェクトのコードにはGameSceneの箇条書きのアクセサーがあります。これがGameSceneシングルトンを呼び出す理由です。 @hiepend私はあなたに同意します。そのため、既存のLevelObjectクラスのBullet/BulletCacheクラスのサブクラスをCCNodeのサブクラスにしています – GPP

関連する問題