gpt4 book ai didi

iphone - Cocos2d : Initializing layers by node - class is nil

转载 作者:行者123 更新时间:2023-11-29 03:59:48 25 4
gpt4 key购买 nike

我是一个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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com