您的位置:首页 > 移动开发 > Cocos引擎

【吼吼睡cocos2d学习笔记】第六章 - cocos2d中的层以及层之间的传值

2011-12-15 16:18 531 查看
游戏必然涉及到多层,层的操作是IOS开发中至关重要的一环,其中涉及到的东西很多很碎,但是我认为,以下几点需要我们格外注意:层的分割技巧层的组织层的事件处理层之间的通信本例涉及到了3个层:AllInmeLayer,GameLayer,UserInterfaceLayerGameLayer中包含了地图、游戏精灵。UserInterfaceLayer中提供了用户交互的功能。AllinmeLayer层本身没有视觉效果,其实以上两个层是作为子节点放到本层中的,本层中也提供了对这两个层的访问和通信。和一个场景:LoadingScene这只是一个过渡场景,详见第五章。本例的演示动画启动界面:点击UI层,旋转游戏层。毫无疑问,AllinmeLayer是本例中的一个关键层,下面我们分析一下他的代码,首先看.h中:
//定义了2个只读属性,返回gameLayer和UserInterfaceLayer对象
@property(readonly)GameLayer* gameLayer;
@property(readonly)UserInterfaceLayer* UILayer;

看注释。这两个属性的实现在.m中:
//gameLayer属性的读取器
-(GameLayer *)gameLayer
{
CCNode *node = [self getChildByTag:TAGGAMELAYER];
return (GameLayer *)node;
}
//UILayer属性的读取器
-(UserInterfaceLayer *)UILayer
{
CCNode *node = [self getChildByTag:TAGUSERINTERFACE];
return (UserInterfaceLayer *)node;
}
这两个方法非常简单,其实就是封装了getChildByTag,需要注意的是这里使用了几个enum成员,定义如下:
//将本例中用到的tag,以enum的形式定义到此处,正式开发中精灵、动作、层的tag应该分开写。
typedef enum  {
TAGGAMELAYER,
TAGUSERINTERFACE,
TAGUIFRAMESPRITE,
TAGACTIONROTATE
}TAGID;
这是一个很好的编程习惯,希望大家从开始学习的时候就要养成。代码中应该最大限度的避免出现常量,尤其是字面常量!!!思考:属性需要对象来访问,在其他层中我们如何才能高效的生成AllinmeLayer的对象呢?本例中使用了一个静态方法来实现:
//本静态方法向外部提供了本例的一个对象
//在其它层中可以通过该对象访问gameLayer和UILayer属性。
+(AllinmeLayer *)getShared
{
return sharedAllInMe;
}
该方法中的sharedAllinMe是一个静态成员,在init方法中用self赋值。在init方法中将GameLayer和UserInterfaceLayer作为子节点添加到自己中:
//将两个层作为子节点加到本层中
CCLayer *gameLayer = [GameLayer node];
[self addChild:gameLayer z:1 tag:TAGGAMELAYER];CCLayer *userInterface = [UserInterfaceLayer node];
[self addChild:userInterface z:2 tag:TAGUSERINTERFACE];
注意z轴的顺序,UI层在上方,所以使用的更大的z值。GameLayer层没有什么好说的,无非就是精灵和随机移动,以及几个CGPoint的操作,我都有详细的注释。UserInterFaceLayer层ccTouchBegan方法中的这行代码是本章的关键:
//此行代码是本例的关键,实现了层之间的引用
GameLayer *gameLayer = [AllinmeLayer getShared].gameLayer;
[AllinmeLayer getShared] 获取了AllinmeLayer的对象。对象.gameLayer引用到了该对象的只读属性。就是通过这种方式在一个层中访问到了另一个层,这也个AllinmeLayer层存在的价值。代码下载------
                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐