(自学用,不是什么大师,有不对的地方欢迎交流)
注意:本人这里主要讲的是框架搭建,从框架到细节,注重框架的讲解,其他知识等需要自己去查询。如果这个框架思想你领悟了 ,学起来会很快,而且自己知道需要什么,该学什么。带着需求去学,比学完再去应用的方式,掌握知识的速度要快的多,个人见解。
场景就是一段完整有意义的舞台,是一类内容的集合。比如做游戏的时候,有游戏场景,有商店场景。当然你可以将商店作为游戏场景的一层,但是单一场景的层多了,势必会影响运行速度和增加内存的使用。
如果一个游戏场景有许多对象(cocos2d中称为精灵)组成,比如背景图片,玩家角色,按钮等,那么层就是将精灵按照不同的目的进行分组。
用层分组的好处:
1.可以整体操作当前层上的所有对象,不需要关心每个如何变化,比如渐变,消失等
2.层有点像PhotoShop中的层,不同的层相互之间有遮挡关系。
继续上面的例子,现在我将背景图片放一层 ,玩家角色放一层,控制放一层。玩家在走动的时候肯定要遮挡你后面的背景,当然有好几排房子那种,你可以在角色层上面添加景物层 ,相互遮挡。最上面放控制层,但你安静音,暂停的时候你不希望角色挡住了按钮,使你不能静音,暂停吧?如图1所示:(作图工具为OmniGrafflePro-5.4.x for mac)
图1
那么这些层所在的容器就是场景,场景就是一个抽象的假象空间,存放层和精灵。
场景创建:
Loading.h
只有
static cocos2d::CCSence *scene();
有用其他两句是用于初始化层init()和创建层(CRETE_FUNC(Loading))的。在实际用的过程中经常自己写自己的初始化和创建函数。
先来创建一个层,场景本身是空的什么都没有。所以加载一个层来放东西。
LoadingScenery.h //用于放景物
static LoadingScenery *createLS();
这句话是公共的,对外的接口,当场景加载这个层的时候,必须通过这个函数来生成层对象。CreateLS()内部会通过LSinit();函数对对象进行初始化。
当此函数调用的时候会返回一个已经初始化完的层对象。
自己写create函数名字可以自定,内容可以自己根据需要写,且可以传参数。而CREATE_FUNC虽然方便但相对死板。
【插曲】爸爸送来了好吃的。。。( ⊙o⊙ )哇 ,切糕~~好吃好吃
bool LSinit();
这个函数主要用于初始化层加载精灵等
层最基本需呀这两个函数。
LoadingScenery.cpp
通过Command+control+方向下键切换到.cpp实现文件中
先来看createLs函数
注意第一句LOCATION_INFORMATION是我自己写的一个用于显示当前执行段是在哪个文件哪个函数第几行,便于调试定位用的
等同于CCLog("-- %s -- %s -- %d", __FILE__,__FUNC__,__LINE);当然因为__FILE__会显示出完整物理路径,这是我不需要的我只要是哪个文件就行。所以做了写改变,最后再说。
这个函数主要是,创建一个对象,如果创建且初始化成功则返回,否则报错。注意CC_SAFE_DELETE这个宏多了层防护,具体自己查看研究。
下面来看初始化函数
最后,将这个层加载到刚才创建的场景中。
Loading.cpp//场景实现文件
其中
sence->addChild(layerScenery,1,10);
可以改为:sence->addChild(layerScenery);
具体1,10参数什么意义,自己看addChild函数定义说明,或者查资料。
当然现在还不能运行,因为你还没有把这个场景放到屏幕上,下面我们就把这个放到屏幕上,需要修改下
OK ,到此就能运行到屏幕上了,结果:
为什么是竖屏?答案自己找吧。
总结:学东西最好先学框架,不要坠入细节,否则会很迷茫。编程就像搭积木一样,有些东西开始不理解那就固定下来,之后理解就好
比如:
我要写个游戏,先找个场景吧,那就创建一个C ++ 类文件起个名字
加个背景层,首先建立一个C++ 类文件
然后通过
Game.cpp的 Scene函数加载下,就可以了,如果想多层如此循环操作,后加载层会遮盖先加载层,也可以通过addChild函数进行修改层的顺序和标号
好了 ,假设现在创建好了 几个场景 ,怎么切换呢?
这就看导演了 CCDirector 。。。一旦加上导演,场景之间可以切换,场景上还有节目,那么一个游戏的骨架就有了,里面你添什么东西就是什么游戏