2011-01-12 11 views
0

内のオブジェクトを取得するには子クラスからgetChildByTagを使用して、私は、画面表示を構成するいくつかの子オブジェクトを持っているcocos2dのシーンを持っています。これらの子オブジェクトのいくつかは、ディスプレイが更新されるように、互いに通信する必要があります。Cocos2d - シーン

シーングラフのオブジェクトへの参照を渡すのではなく、すべてのcocos2dノードにタグを付け、タグ値を渡してから、シーンオブジェクトが必要なときは常にディレクタを使ってオブジェクトを取得しますタグ。

これは私の周りに飛んでオブジェクトへの参照をたくさん持っていないことを意味し、私の考えでは、それはクリーンでオブジェクトが、彼らはすべきではない時に保持された状態でメモリの問題を引き起こす可能性が低いだろうということでした。

CCNode* node = [[[[CCDirector sharedDirector] runningScene] getChildByTag:TAG_MY_LAYER] getChildByTag:TAG_MY_OBJECT]; 
if (node != nil){ 
    NSAssert([node isKindOfClass:[myObject class]], @"node is not a myObject"); 
    myObject* mo = (myObject*)node; 
    ... 
    other stuff 
    .... 

問題::シーンが変化して初期化されている場合、このメソッドは動作しません

は、私は特定のノードを取得するには、次のコードを使用します。ランニングシーンへの呼び出しは、新しいシーンではなく、トランジションを返します。 - onEnterTransitionDidFinishを待つなら、それでもそれは動作しません。トランジションが削除され、runningSceneが新しいシーンになる前に、少し後に(おそらく古いシーンが破壊される)待たなければならないかのようです。

は、それは私がからgetChildByTagを呼び出すことができ、それは関係なく、シーンの移行の状態の、私のタグ付けされたオブジェクトを取得しますシーングラフの一部への参照を取得することはできますか?

答えて

-1

代わりのアプローチを使用して、私はあなたがシングルトンクラスに見てください。 この場合、シングルトンクラスGameSettings.h可変globalScoreを追跡するために使用されます。

どこでもあなたのコードで、あなたは今、あなたには、いくつかの値は、あなたが単に通知センターを使用することができます変更されたことを別のシーンを伝えるために必要がある場合 [[GameSettings sharedGameSettings] globalScore];

を呼び出すことで、変数を参照することがあります。

GameSettings.h

#import <Foundation/Foundation.h> 
#import "cocos2d.h" 

@interface GameSettings : NSObject { 
    int globalScore; 
} 

@property (nonatomic, assign) int globalScore; 

@end 

GameSettings.m

#import "GameSettings.h" 

@implementation GameSettings 

@synthesize globalScore; 

static GameSettings *sharedGameSettings = nil; 

+(GameSettings *)sharedGameSettings 
{ 
    @synchronized(self){ 
     if(sharedGameSettings == nil) 
     { 
      sharedGameSettings = [[self alloc] init]; 
     } 
    } 
    return sharedGameSettings; 
} 

+(id)allocWithZone:(NSZone *)zone{ 
    @synchronized(self) 
    { 
     if(sharedGameSettings == nil) 
     { 
      sharedGameSettings = [super allocWithZone:zone]; 
      return sharedGameSettings; 
     } 
    } 
    return nil; 
} 


-(id)init{ 

    self = [super init]; 

    if(self){} 
    return self; 
} 

もう一つのアイデア(あなたは、多くの場合、シーン間のデータを渡す必要がある場合)1つのシーン他のシーンのデリゲートを作ることです。

3

@erik - あなたの答えは尋ねた質問に関連していますか?

あなたは新しいシーンへの移行が完了した後に実行しているように見えるフォーカス取得時()メソッドにコードを移動することができ

すなわち:

-(void)onEnter { 
    [super onEnter]; 

    CCNode* node = [[[[CCDirector sharedDirector] runningScene] getChildByTag:TAG_MY_LAYER] getChildByTag:TAG_MY_OBJECT]; 
    if (node != nil){ 
    NSAssert([node isKindOfClass:[myObject class]], @"node is not a myObject"); 
    myObject* mo = (myObject*)node; 
    ... 
    other stuff 
    .... 
    } 
} 
関連する問題