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

Cocos2d iphone Cocos2d-使用子类中的getChildByTag获取场景中的对象,cocos2d-iphone,Cocos2d Iphone,我有一个cocos2d场景,其中有几个子对象组成了屏幕显示。其中一些子对象需要相互通信,以便可以更新显示 我决定不在场景图中传递对象的引用,而是标记所有cocos2d节点,传递标记值,然后每当需要场景对象时,我就使用控制器使用标记检索对象 这意味着我没有太多关于四处飞行的对象的引用,我的想法是这样会更干净,并且不太可能在不应该保留的对象被保留时导致内存问题 我使用以下代码检索特定节点: CCNode* node = [[[[CCDirector sharedDirector] runningSc

我有一个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
    ....
问题:使用过渡初始化场景时,此方法不起作用。对运行场景的调用将返回转换,而不是新场景。如果您等待-onentertransitiondFinish,那么它仍然不起作用。似乎在此之后您必须等待一段时间(可能是旧场景被破坏),然后才能删除过渡,runningScene就是您的新场景


是否有可能获取对场景图中我可以调用getChildByTag的部分的引用,并且无论场景转换的状态如何,它都将获取我的标记对象?

我建议您不要使用这种方法,而是研究Singleton类。 在本例中,Singleton类GameSettings.h用于跟踪变量globalScore

现在,您可以通过调用
[[GameSettings sharedGameSettings]globalScore]

当您需要告诉另一个场景某些值已更改时,只需使用通知中心即可

游戏设置

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

@interface GameSettings : NSObject {
  int globalScore;
}

@property (nonatomic, assign) int globalScore;

@end

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

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