这是我第一次写cocos的框架思路哈,虽然只是写完了一个程序,按理来说应该再多写一些,多积累一些经验了再来写这个框架的构成,但是我觉得还是把我这次写代码的所有想法先记下来哈,等到以后继续写cocos的程序了,有更多收获了再来把这篇文章给完善了。
cocos2d虽然是个游戏引擎,但是实际上是任何的程序都可以使用的哈。因为cocos能兼容任何CocoaTouch为框架的iOS程序,所以cocos能够用在任何程序上。cocos的作用,在我现在的理解来说,就是显示一些图片,然后可以任意改变图片的属性,做成动画效果(当然这只是我这个菜鸟的理解,我也还没有看到后面的粒子效果等等,相信学完cocos的全部内容以后我会对cocos有个更加完善的了解)。cocos提供给我的这个功能就相当于提供给我了一个GUI制作器,让我能够自定义制作GUI,也不用限制于苹果官方给我们的GUI类库了(其实我只是因为当时学习CocoaTouch的时候不够顺利,所以转型写了cocos,当然如果真的熟练掌握CocoaTouch当然是最好不过的了)。
当前,我只写了一个打砖块的小游戏,并没有用cocos2d真正去开发一款软件,所以这里只是阐述游戏的cocos2d的框架思路。
正常的游戏思路应该如下
整个游戏就是一个接受用户的触摸点击,然后进行计算,再把计算的结果转化成显示的过程,其实这个跟所有的程序都是一样的。也就是说,整个游戏分为三个层:输入层,逻辑层和显示层。
先说输入层,在iOS的设备里面,输入层的所有事件总共有两种:通过加速器完成的手机用户操作手机动作的输入、通过触摸屏完成的用户触摸屏幕点的输入。这两个输入分别由两个cocos2d提供的自带方法完成。监测加速器的方法最后能返回手机偏移的距离和方向,监测触摸的方法最后能返回触摸的点的坐标,这两个参数都会传入逻辑层进行处理,至此输入层的任务就完成了。
然后是逻辑层。逻辑层就是一个计算当前状态的过程。总共有三个需要的参数:上一刻的状态,手机偏移的距离和方向,触摸点的坐标(当然大多数的情况下后面两个参数只会需要一个有意义的参数,当然也可以两个参数都为空)。逻辑层会根据这三个需要的参数,计算出这一刻的状态,然后把这一刻的状态传给显示层,并储存起来用于下一次的使用。
最后是显示层。显示层其实就是一个页面,要在页面上绘制的东西的属性由逻辑层给出的状态决定。
显示层是游戏的最独特的层,这也是游戏区别于其它应用程序的地方,所有的画面都会由程序自己来进行自定义绘制。而使用系统自带UI控件则没有这个烦恼,系统会自动绘制控件,只需要改变控件的属性。当然这也是游戏的好处,游戏也可以做应用,而且可以做出各种自定义的应用,不用局限于Apple官方给的东西。
理清楚主要的游戏思路以后,看一些最基本的东西:
cocos2d总共分成几个重要的模块:
CCDirector,可以理解成游戏的控制台,它拥有最高权限。
我们一般会用它来获取关于设备的各种信息,更改设备底层的参数,最最重要的是控制场景的更换
(这里的CCDirector相当于逻辑层的最高主管,虽然它有最高的权限,但是大部分的事情都不由它来做,它只是一个指挥的作用)
CCScene,可以理解成游戏的场景,或者游戏的关卡,只有CCDirector能够控制它。
如果把游戏开始界面,结束界面都想象成关卡的话,CCScene就可以理解成游戏关卡了。更深层次地说,CCScene更像是一个容器,它里面装着当前关卡所要显示的所有东西,包括怪物、地图、主人公等等,都放在CCScene里面。也只有放在这个里面才能正常显示这些东西。
(这里的CCScene就相当于刚才游戏思路里面的显示层,所有放在当前CCScene的东西都能被绘制,所以逻辑层所给出的状态,就是用于创建控件,或者改变在CCScene中所有控件的状态。)
CCLayer,可以理解成当前关卡游戏的某一层,属于CCScene控制。
可以这么想象,你在玩有摇杆的飞机大战,摇杆显示在最顶层,而且跟飞机都没有关系,所以摇杆是顶层,飞机是第二层,背景在最下面,而且跟飞机和摇杆都没有关系,所以背景在最后一层。这样可以理解层的概念了么。然后关于层跟CCScene的关系,其实层也是容器,刚才说的顶层里面装着摇杆,飞机层装着飞机子弹,底层装着地图,但是层把这些东西装进来以后,还是要把自己装到CCScene里面,这样才能够显示这些东西。
(这里的CCLayer可以理解为一个小型的显示层,几个小型的显示层拼凑成一个完整的CCScene)
CCSprite,最基础的类,里面放着一张图片(比如飞机),改变这个类实例的属性会改变图片的属性,放在CCLayer和CCScene里面。
虽然是这么说,但是并不仅仅是CCSprite一个,还有一些比如CCLabelTTF(显示文字),CCButton(显示按钮),CCMenu(显示菜单)等等,都是最基础的类,所有你能在屏幕看到的东西都是装到这些类里面的,然后不断修改它们就会产生动画效果和游戏效果。
(这里的CCSprite和其它的那些就相当于显示层上的控件,是由它们接受逻辑层的属性输入,改变了以后把自己放到显示层上)