2011-01-12 5 views
0

Ich habe eine cocos2d-Szene mit mehreren untergeordneten Objekten, aus denen die Bildschirmanzeige besteht. Einige dieser untergeordneten Objekte müssen miteinander kommunizieren, damit die Anzeige aktualisiert werden kann.Cocos2d - Verwenden von getChildByTag aus untergeordneten Klassen zum Abrufen von Objekten in einer Szene

Ich entschied mich dafür, Referenzen auf Objekte im Szenegraphen nicht zu übergeben, sondern alle cocos2d-Knoten zu markieren, die Tag-Werte zu übergeben und dann jedes Mal, wenn ich ein Szenenobjekt brauche, den Director zu verwenden das Etikett

Dies bedeutet, dass ich nicht viele Verweise auf herumfliegende Objekte habe und mein Denken war, dass es sauberer wäre und weniger Speicherprobleme verursachen würde, wenn Objekte nicht beibehalten würden.

Ich verwende den folgenden Code einen bestimmten Knoten abzurufen:

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 
    .... 

Problem: Wenn eine Szene mit einem Übergangs Initialisierung wird dann dieses Verfahren funktioniert nicht. Der Aufruf der laufenden Szene gibt den Übergang und nicht die neue Szene zurück. Wenn Sie auf das - onEnterTransitionDidFinish warten, funktioniert es immer noch nicht. Es scheint so, als müssten Sie danach etwas warten (vermutlich, damit die alte Szene zerstört wird), bevor der Übergang entfernt wird und runningScene Ihre neue Szene ist.

Ist es möglich, einen Verweis auf einen Teil des Szenengraphen zu bekommen, von dem ich getChildByTag aufrufen kann, und es wird mein getaggtes Objekt bekommen, unabhängig vom Status der Szenen, die übergehen?

Antwort

-1

Anstatt diesen Ansatz zu verwenden, schlage ich vor, dass Sie in Singleton-Klassen schauen. In diesem Fall wird die Singleton-Klasse GameSettings.h verwendet, um die Variable globalScore zu verfolgen.

Überall in Ihrem Code Sie verweisen jetzt die Variable kann [[GameSettings sharedGameSettings] globalScore];

durch Aufrufen Wenn Sie eine andere Szene erzählen müssen, dass einige Wert, den Sie einfach geändert hat das Notification Center verwenden können.

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; 
} 

Eine weitere Idee (wenn Sie häufig Daten zwischen den Szenen passieren müssen) ist eine Szene, ein Delegierter der anderen Szene zu machen.

3

@erik - wie ist Ihre Antwort relevant für die gestellte Frage?

Sie können den Code zum onEnter() -Methode bewegen, die nach an den neuen Szenenübergang ausgeführt werden soll, scheinen abgeschlossen ist, dh:

-(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 
    .... 
    } 
} 
Verwandte Themen