Cocos2d - 使用子类中的getChildByTag来获取场景中的对象

时间:2011-01-12 12:15:42

标签: cocos2d-iphone

我有一个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的部分场景图的引用,它将获得我的标记对象,无论场景转换的状态如何?

2 个答案:

答案 0 :(得分:3)

@erik - 你的回答与问题有什么关系?

您可以将代码移动到onEnter()方法,该方法似乎在转换到新场景后执行,即:

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

答案 1 :(得分:-1)

我建议您不要使用这种方法来研究Singleton类。 在这种情况下,Singleton类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;
}

另一个想法(如果你需要经常在场景之间传递数据)是让一个场景成为另一个场景的代表。