`

Scene with Multi-layer

 
阅读更多

前篇创建了一个没有任何内容的GameScene,本篇就来为它加上两个layer,再说说管理多layer的小技巧。假设这两个layer已经写好了,分别叫作GroundLayer和UserInterfaceLayer。
我们先给两个layer定义个tag,方便以后获取它们:
//GameScene.h
typedef enum
{
    LayerTagGroundLayer,
    LayerTagUserInterfaceLayer,
} GameSceneTags;

然后就在GameScene里添加这两个layer:
//GameScene.m
-(id) init
{
    if ((self = [super init]))
    {
        gameSceneInstance = self; //先不管它,后面用上

        GroundLayer* groundLayer = [GroundLayer node];
        [self addChild:groundLayer z:1 tag:LayerTagGroundLayer];
    
        UserInterfaceLayer* uiLayer = [UserInterfaceLayer node];
        [self addChild:uiLayer z:2 tag:LayerTagUserInterfaceLayer];
    }   
    return self;
}

z和tag的作用估计大家一看就懂,这段的意思也很明白。两个layer加好了,问题也随之而来:1.多个layer内部如果想和scene通信怎么办?  2.多个layer之间想通信怎么办?
首先解决问题1:
//GameScene.m
static GameScene* gameSceneInstance;

+(GameScene*) sharedScene {
    return gameSceneInstance;
}
利用一个简陋的单件(singleton)模式,现在所有layer都能拿到GameScene了,方法为[GameScene sharedScene]; 问题1解决,但注意的是必须确保GameScene同时只有一个实例对象。

问题2,给GameScene加上几个getter方法:
-(GroundLayer*) groundLayer
{
    return [self getChildByTag:LayerTagGroundLayer]; //tag派上用场了
}

-(UserInterfaceLayer*) uiLayer
{    
    return [self getChildByTag:LayerTagUserInterfaceLayer];
}
这样,在任何地方可以通过[[GameScene sharedScene] groundLayer];就拿到了GroundLayer对象。
当然,想代码漂亮点,加两个property就更好了。

written by Magic
转载请注明原地址: http://blog.sina.com.cn/s/blog_77013e2b0100ql5r.html

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics