1>. 纹理:
当一张图片被加载到内存后,它是以纹理的形式存在的。纹理是什么东西呢?纹理就是一块内存,这块内存中存放的是按照指定的像素格式填充的图片像素信息。它被最终作为三角面着色所依据的数据源。
ocos2d中最常用的类可以大致分为两部分——实体类和行为类,实体类就是主语(谁),行为类就是谓语(做什么),根据作者的开发经验,cocos2d大部分时间都是在围绕这两者工作。
实体类的基类是CCNode,它是所有实体类的父类,它内部封装的参数与方法是整个引擎中出镜率最高的,可以说是cocos2d的核心(菜单、精灵都是继承自它)
行为类则大部分继承自CCAction,它的子类实例可以让一个CCNode对象执行一个行为,比如旋转、移动,甚至是自定义的行为,一个CCNode可以同时执行多个行为或是按顺序执行一个行为序列,有了这些类,开发者就可以在游戏中轻松加入各种华丽的效果了。
有了CCNode和CCAction,我们是不是就可以开发游戏了呢?还不行,我们还需要一个乘纳它们的舞台。比如我们创建一张图片,并赋予它一个移动的行为,但是我们无法看见它,因为我们并没有把它显示到屏幕上,而舞台的作用就是把它上面的演员显示到屏幕上,呈现给观众。cocos2d实现舞台的方式是这样的:
舞台分为三部分:导演–场景–层。首先,屏幕的显示是以场景为单位的,我们通过显示器看到的所有内容都在一个场景中,而层是构成场景的元素,就好比场景是一个舞台,我们通过它观看游戏中的世界,而层就是组成舞台的各种背景,比如远景、近景、字幕。当一段故事讲完后,我们可能需要切换到另一个舞台来讲述下一段故事,在戏剧中通常是拉上大幕,在幕后切换背景,然后再拉开大幕,在cocos2d中也是这个步骤,而完成这一工作的就是导演。导演类负责场景间的切换,场景负责将游戏中的元素呈现给玩家,而层负责容纳元素以及接收玩家的输入信息。
通过这些类的合作,我们就可以进入自己创造的游戏世界了~
//===================================================
最核心的类——CCNode
类如其名,这个类的实例就是一个节点。Cocos2d的类是树状继承的,而在内存中,各个实例之间也是以“树”这种数据结构相关联的。
场景类是CCScene,层类是CCLayer,它们都是CCNode的子类,就是说它们实际上也是一个node,完全可以放置在树的任何位置。像这样的例子在cocos2d中还有很多(比如精灵).
CCNode是cocos2d-x的渲染链,写游戏基本上就是和他打交道了,cocos2d-x同时只能渲染一个CCScene,因此CCScene是渲染的根节点。在构建游戏时,一般是一个Scene中添加一个或者多个CCLayer,一个Layer中又添加多个CCSprite或者CCMenu,CCSprite中还可以添加CCParticleSystem等等。这样就构建了一个渲染树,cocos2d-x历遍这个树来将图像显示在屏幕上。
coco2d-x的渲染实际上是调用visit()函数来完成的:即visit()这个函数调用它包含的Child的zOrder<0的visit()函数,之后调用draw()函数,再调用Child的zOrder>=0的visit()函数,它实际上是一个深度优先的算法。他的Child是按照zOrder排序的,以保证渲染的正确性。draw()的作用是绘制自己。在CCSprite这些确实需要绘制的类中,draw()调用openGL的函数来完成绘制功能——把一个纹理映射到一个矩形上。
如果要自定义绘制一些图像,可以重写draw()函数,不过不要忘记调用父类的draw()函数。
可以进行网状关系的管理,其实CCScene,CCLayer也是一个CCNode.它提供节点增删,包含,提供节点缩放,每个节点有一个照相机,提供动画支持,也就是说每一个从CCNode派生的类都可以执行动画操作;
//========================================================
精灵角色(CCSprite)
是一副2D图像,CCSprite可以通过图像或者图像中的一个矩形子区域创建
//========================================================
CCLayer 是CCNode的子类 ,实现了TouchEventsDelegate接口,继承了CCNode所有的特性,并且附加了一些自己的特性,它能够接收iPhone的触摸事件,也能够接收Accelerometer的输入。
//========================================================
CCScene
作为场景类,为何只有这两个函数而没有其他方法呢,因为目前在CCScene承担的是一个容器的功能,游戏开发时需要渲染的对象反正CCScene里面统一管理,包括创建、销毁和场景切换等,而且从其类的结构图可看出,其直接继承了CCNode类
//========================================================
CCCamera
在cocos2d-x中,每个节点(CCNode)都需要用到,即当节点发生旋转、缩放和位置变化等时,都需要覆盖CCCamera,然后这个节点通过CCCamera重新渲染。
//========================================================
CCDirector
在cocos2d-x里面,游戏的任何时间,只有一个场景对象实例处于运行状态,该对象可以作为当前游戏内容的整体包对象
Cocos2d-x引擎除了提供了CCDirector,还提供了一个CCDisplayLinkDirector,CCDisplayLinkDirector是一个可以自动刷新的CCDdirector。
//========================================================
CCEGLView
代表OpenGL显示窗口。封装了使用OpengGL做为显示底层API的一个基本的WINDOWS窗体的创建与控制。
//========================================================
在普通的iphone上,一个点就等于一个像素,而在高清显示设备中,默认一个点等于二个像素
//========================================================
CCLabelBMFont继承下面三个类
CCSpriteBatchNode :精灵批次管理类,用于将使用一张图的多个精灵在设置一次纹理的批次里进行绘制,提高渲染的效率。
CCLabelProtocol
:文字字串类
CCRGBAProtocol
:颜色调节接口类
//========================================================
CCDictElement CCDictionary
在引擎开发中,通过名称或索引快速找到所对应的节点,资源,物体是最最基础的算法需求。如何更高效的满足引擎灵活的存储与查询需求,是任何一款引擎要考虑的问题,在诸多款开源或商业引擎中,都有过为了解决此类需求而专门设计的模版类或容器,它们通常被称为“词典”或“字典”。
我们在Cocos2d-x中的很多地方也遇到过词典类CCDictionary。它是利用哈希表算法来进行CCObject管理的一个类。学习它可以让我们对于Cocos2d-x的内部管理机制有更清晰的认识。同时也可以学习这种思想,帮助我们在以后的项目开发中设计出更棒的管理器架构。
//========================================================
CCTexture2D: 纹理,即图片加载入内存后供CPU和GPU操作的贴图对象。
CCTexturePVR:处理PVR文件生成纹理的类,提示: 大家可以用它解析愤怒的小鸟中的图片。
CCTextureCache:纹理管理器,负责加载图片并对生成的纹理进行管理。通过“字典”来进行快速的查询。
CCTextureAtlas:纹理块管理器,如果图片是由多个小图块组成的,则纹理块管理器用来存储这些小图块的相关信息,以方便绘制相应图块
//========================================================
CCMutableArray
是一个CCObject指针容器类,它内部通过使用STL的vector容器来存储CCObject指针。在加入一个新CCObject时对其引用计数器加1,在移除CCObject时对其引用计数器减1。
//========================================================
CCPoolManager
Cocos2d-x提供了一个内存管理器类CCPoolManager,它有一个容器m_pReleasePoolStack,而这个容器是用来存放了一些容器管理类CCAutoreleasePool的实例对象的。需要自动进行内存释放的CCObject实例对象会把其指针存放在容器管理类CCAutoreleasePool的实例对象中的m_pManagedObjectArray容器里。所有存在其中的CCObject实例对象在进行释放操作时通过使用计数器来进行判断在何时真正delete内存
//========================================================
CCAction, CCFiniteTimeAction, CCSpeed,CCFollow四个类
CCAction:一切动画的基类。它需要传入一个结点来做为表演动画的“演员”。
CCFiniteTimeAction:加入了时间属性的动画基类,用于派生各种由时间插值进行计算的动画。
CCSpeed:用来控制其它动画播放速度的动画,它需要传入一个动画来做控制目标。
CCFollow:用来控制演员跟随动画移动的基类,它需要传入一个结点来做跟随目标。
有了以上这几个基类,在后面我们就可以理解很多很多种各种各样的动画是如何创造出来的。
//========================================================
CCActionManager 动画管理器类
这个动画管理器负责对所有的动画进行管理。管理和执行
流程是这样的:在CCApplication的run函数中,显示设备链调用相应的场景显示函数drawScene来绘制场景,然后调用了CCScheduler的update函数,在这个函数里,对所有注册要调用update的对象指针进行遍历并调用其update函数,而CCActionManager的update会对所有演员的动作调用step函数,最终实现各个动画的播放。
//========================================================
CCActionInterval
基类CCAction,我们知道它有必须有一个“目标结点”。它是动画的使用者,即演示动画的精灵。我们让一个精灵调用runAction函数,则这个精灵就是使用者。它会被记录在动画的“目标结点”中。CCAction通过step函数来取得时间的流逝并计算动画进度。但在CCAction中,step函数是一个虚函数,它并没有在CCAction中进行相应功能的实现。而是由CCAction 派生到CCActionInterval这个类时才进行了相应功能的实现。可以说CCActinInterval这个类才真正的实现了时间流逝的动画计算功能。
//========================================================
序列帧动画主要有几个类:
CCSpriteFrame:精灵帧信息,序列帧动画是依靠多个精灵帧信息来显示相应的纹理图像,一个精灵帧信息包包含了所使用的纹理,对应纹理块的位置以及纹理块是否经过旋转和偏移,这些信息可以取得对应纹理中正确的纹理块区域做为精灵帧显示的图像。
CCAnimationFrame:序列帧动画单帧信息,它存储了对应的精灵帧信息。
CCAnimation:序列帧动画信息,它存储了所有的单帧信息,可以对单帧信息进行管理。
CCAnimate:序列帧动画处理类,它是真正完成动画表演的类。