我有一个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的部分场景图的引用,它将获得我的标记对象,无论场景转换的状态如何?
答案 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;
}
另一个想法(如果你需要经常在场景之间传递数据)是让一个场景成为另一个场景的代表。