IOS cocos2d学习笔记-<二>CCScene、CCLayer、CCSprite的关系

来源:互联网 发布:南通seo招聘 编辑:程序博客网 时间:2024/06/05 10:29


(本文写作基于千锋3g学院提供的第三季讲授视频编写,更多资料和资源下载地址请看笔记扉页:传送门


在第一篇学习笔记的结尾处,我提前写出了创建第一个剧场的简单流程和代码,这一篇我们来详细探讨一下cocos2d游戏开发中CCScene、CCLayer、CCSprite三个重要的元素

说到尾,这三个类都分别继承于CCNode这个类,但它们却有不同的作用以及不同的逻辑位置。在愤怒的小鸟第二讲视频中也有这么一幅图:

嗯,我们第一个写的场景叫做LoadingScene,可能有人会问:你之前不是说这个LoadingScene叫做Scene,但又继承于CCLayer,你逗我玩吗?

嗯,一开始我也这么对着屏幕问欧阳老师,虽然它没鸟我,继续说他自己的,不过这个我们都要去搞懂的东西。要搞懂这些东西,

我们就必须先搞清它们之间那些神秘的关系才行,请看图:

画得还是挺漂亮的对吧?(我用的是MindNode Lite,我真的不是在打广告)

这个图应该很好地可以解释得到这三类的包含逻辑关系了,在节目中含有多层图层,而每个图层相对透明,里面可以插入各自的精灵,也就是所有精灵都有各自的显示图层

这里额外提供一个基础知识:

在一个场景(CCScene)中一般含有三个图层(CCLayer):分别是背景层、游戏对象层以及虚拟手柄层(也就是控制层)。

接着我们深入一点点:

  1-如我们所看到的,还记得我们之前在AppDelegate里面建立的EAGLView吗?叫做glView的呢,被导演setOpenGLView:去了的那个啊,记得吧

自从被Set了之后,这个EAGLView就像一个电视机,里面就会播放一个一个的节目。注意,电视机每次只能播一次节目。

意思是:你一次只能使用一次导演类的runWithScene:(CCScene *)方法

这个方法就相当于打开电视机的动作,必须在电视机目前没有节目的情况下使用,不然会报错

而换节目的方法使用导演类的replaceScene:(CCScene *)方法

这个方法相当于电视机转台,完全替换一个新的CCScene对象


 2-从这个图我们可以知道,一个cocos2d游戏里面的所有元素可以用一个MindMap来表示,于是我们可以称每一个元素都是一个“节点”。

所以,这就告诉了我们为什么这些类都继承于CCNode,而CCNode里面一个常用的方法是addChild:(CCNode*)

方法用作在该节点上添加子节点,在你的脑中绘出自己的MindMap吧


OK,是不是觉得有种醍醐灌顶的感觉呢?哈哈哈


回到我们的问题上面:这杀千刀LoadingScene究竟是什么?

我们把代码粘上来看一下先。

LoadingScene.h

#import <Foundation/Foundation.h>#import "cocos2d.h"//CClayer是所有场景的基本类型@interface LoadingScene : CCLayer{    CCLabelBMFont *loadingTitle;}+ (id) scene;@end

我们可以看到这个LoadingScene是继承于CCLayer这个类的,那么LoadingScene明显是一个图层

接下来,聪明的你可能又会问,你不是说电视机(EAGLView)里面播的是节目(CCScene)吗?继承于CCLayer的这个LoadingScene怎么能摆得上台呢?

请注意,这里面有一个方法叫做+(id)scene.  我们先看一看这类方法里面是怎样写的。


LoadingScene.mm

@implementation LoadingScene+ (id) scene{    CCScene *sc = [CCScene node];    // 创建空的剧场    LoadingScene *ls = [LoadingScene node];    // 创建自己的节目    [sc addChild:ls];    // 把节目加到通用剧场尚    return sc;}
    在scene这个类方法下,我们就可以清楚看到,这个方法先分别实例化一个CCScene和一个LoadingScene,然后很自然地把LoadingScene加到CCScene中,返回的果真是一个CCScene对象!这下大家都知道什么回事了吧,虽然这个LoadingScene是继承于CCLayer这个类的,但实际使用起来,还是要提供它一个节目(CCScene)作为容器,才能把它摆到电视机(EAGLView)中播出。


顺带说明一个地方,就是node方法,欧阳老师也说得很清楚:

这个node方法实际是CCNode里面的方法,下面左右互等:

[LoadingScene node];          [[[LoadingScene alloc] init] autorelease];

然后其中左边的init方法就可以在本实现文件里面重写,如下:

- (id) init{    self = [super init];    if (self)    {        // 标准init方法    }    return self;}

在里面括号就可以随心所欲地添加自己想要的东西,这些东西都会出现在LoadingScene这个图层里面。


最后,必须说明的一点是,像本文LoadingScene这样编写剧场的方法只适用于这样一个简单的Loading画面剧场中,在真正游戏中,最好还是按照标准的系统的做法

建立一个继承于CCScene的类,里面包含几个所需图层,然后在初始化实例的方法中将他们add入,这样做的方法更安全,更规范。


这一篇就到这里了,看完之后如果有什么问题或者有收获或者有幸帮你解决些什么困扰欢迎交流或给赞大笑




原创粉丝点击