我是一个Cocos2d初学者,所以虽然这里的代码有点多。有经验的人应该能够看出我在这里做错了什么。当我尝试获取作为子级添加到该层的 GameBackground 类
的实例时,它在 backgroundLayer
中的 NSAssert
上崩溃+(id)scene
类方法。它崩溃是因为它是 Nil
(
GameBackground 类)。但我认为我在请求它的 node
时在 +(id)scene
方法中初始化了它?但请纠正我,我对这件事的想法很模糊。
static GameLayer *sharedGameLayer = nil;
+(id) scene
{
CCScene *scene = [CCScene node];
//GameLayer* layer = [GameLayer node];
//[scene addChild:layer];
CCNode *backgroundLayer = [GameBackground node];
[scene addChild:backgroundLayer z:1 tag:LayerTagBackgroundLayer];
CCLayer *cocosObjectsLayer = [HelloWorldLayer node];
[scene addChild:cocosObjectsLayer z:2 tag:LayerTagGameLayer];
CCLayer *userTouchInterface = [GameUserTouchInteface node];
[scene addChild:userTouchInterface z:3 tag:LayerTagUILayer];
return scene;
}
// To access this scene: MultiLayerScene* sceneLayer = [MultiLayerScene sharedLayer];
+ (GameLayer *) sharedLayer
{
NSAssert(sharedGameLayer = nil, @"sharedGameLayer not available.");
//if (sharedGameLayer == nil) sharedGameLayer = [[GameLayer alloc] init];
return sharedGameLayer;
}
-(id) init
{
NSLog(@"init called");
self = [super init];
if (self)
{
NSAssert(sharedGameLayer == nil, @"another GameLayer is already in use!");
sharedGameLayer = self;
// uncomment if you want the update method to be executed every frame
//[self scheduleUpdate];
}
return self;
}
// MultiLayerScene* sceneLayer = [MultiLayerScene sharedLayer];
// To access this scene: GameBackgroundLayer* backgroundLayer = [sceneLayer backgroundLayer];
-(GameBackground *) backgroundLayer
{
CCNode *layer = [self getChildByTag:LayerTagBackgroundLayer];
NSAssert([layer isKindOfClass:[GameBackground class]], @"%@: not a BackgroundLayer!", NSStringFromSelector(_cmd));
return (GameBackground *)layer;
}
然后尝试从另一个类获取背景层的实例:
GameBackground *backgroundLayer = [GameLayer sharedLayer].backgroundLayer;
[backgroundLayer runAction:sequence];
最佳答案
我猜失败的断言是。-
NSAssert(sharedGameLayer = nil, @"sharedGameLayer not available.");
您将 nil
分配给 sharedGameLayer
,而不是进行比较 (==
)。此外,您还注释了设置 sharedGameLayer
的行。只是在这里猜测,但您可能想做这样的事情。-
+(id) scene
{
CCScene *scene = [CCScene node];
sharedGameLayer = [GameLayer node];
[scene addChild:layer];
return scene;
}
让您的static
构造函数尽可能干净。
+ (GameLayer *) sharedLayer
{
return sharedGameLayer;
}
-(id) init
{
NSLog(@"init called");
self = [super init];
if (self)
{
CCNode *backgroundLayer = [GameBackground node];
[self addChild:backgroundLayer z:1 tag:LayerTagBackgroundLayer];
CCLayer *cocosObjectsLayer = [HelloWorldLayer node];
[self addChild:cocosObjectsLayer z:2 tag:LayerTagGameLayer];
CCLayer *userTouchInterface = [GameUserTouchInteface node];
[self addChild:userTouchInterface z:3 tag:LayerTagUILayer];
// uncomment if you want the update method to be executed every frame
//[self scheduleUpdate];
}
return self;
}
在 init
方法中创建节点树,并将它们添加为根层 (sharedGameLayer
) 的子级,而不是场景对象。
关于iphone - Cocos2d : Initializing layers by node - class is nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16024575/