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

标签 iphone ios objective-c cocos2d-iphone

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

相关文章:

iphone - 核心数据排序并且不显示重复项

ios - 如何在 MPMoviePlayerController 中获取视频的真实大小?

ios - 以编程方式选择 UITextField 中的所有文本

ios - Swift 在将 NSString 转换为 NSDate 时显示与 Objective-C 不同的结果?

objective-c - native Google 阅读器 iPhone 应用程序

iphone - iOS facebook 整合方法

ios - 收到带有数据的远程通知时激活 iOS 应用程序

ios - 从 Int 中减去

ios - 无限 collectionview 单元格没有唯一的索引路径

ios - 子类化 UIViewController,何时以及何时不