前篇创建了一个没有任何内容的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