Cocos2D的设计模式不同于iOS一般应用开发所使用的MVC模式。我们知道,在MVC模式中,模型(Model)和视图(View)是完全分开的,通过ViewControllers来连接两部分。而Cocos2D一般不使用MVC模式,根本原因在于Cocos2D的运行方式和结构是完全不同的。以下都是个人观点。
Cocos2D 2.x是基于OpenGl ES 2来开发的,那么程序运行的过程是update frame的过程,就是不断的更新页面帧来实现程序的运行。因此,所以的逻辑判断或者说游戏AI都必须在update中进行运算。因此,View和Model因为都需要纳入Update使两者更加紧密。这是原因之一。
另一方面,一般的游戏都会有很多的对象,比如各种游戏中的人物,每个对象的显示,动画,AI都不一样,而且可能都很复杂,如果将显示和AI分开,那么在update要通过AI判断来确定显示,而显示的状态比如位置又反过来影响AI的判断流程,那么这种交联将变得极其麻烦,估计得用无数个Protocol来实现。因此,把一个对象的显示,AI封装在一个类里面是更好的选择。这是原因之二。
然后就是Cocos2D的软件架构了。可以说,做Cocos2D游戏就像制作一部电影,甚至Cocos2D里面的对象也参照了电影拍摄中的专有名词。下图的Cocos2D node的层次关系图:
这个图摘自Learning Cocos2D这本书。
可以看到,和iOS一般的架构不同,先回顾一下iOS通常的情况。程序启动,生产一个Window,然后window里面有各种Views,View通过ViewController控制。
那么Cocos2D是怎样的呢?
程序启动生成一个CCDirector(导演),然后Director下面有很多Scene(场景),Director(导演)就负责切换各种Scene(场景)。然后一个Scene下面有不同的Layer(图层),就类似电影中的场景有背景,有人物,有道具,这些东西在不同的层次。然后每个Layer中可以有不同的Sprite,这才是具体要控制的对象。比如人物层可以有很多人,每个人就是一个Sprite,专业翻译叫子图形,我觉得可以叫角色或者道具。那么对于Sprite,比如一个人,它既有思考,内在(Model),又有表现(View),只要将一个完整的Sprite(Class)添加在Layer中,那么之后的事情就是随着Update(时间的流逝)让这个Sprite自己表现了。
因此,在游戏开发中,更通常的方式是把Sprite完全看成一个个体,通过一个Class把它的Model和View都封装在一起,感觉像是在游戏的虚拟世界中创造的一个生物(Creature),然后你就像游戏中的上帝,把“生物”按自己的意愿添加进游戏世界,然后“生物”怎样活动就完全看它自己了,当然作为”上帝“的你掌握了游戏里面的所有信息。说着感觉越来越像黑客帝国了。不过哪天AI水平足够高了,那你真的可以成为虚拟世界的”上帝“去创造一个虚拟的宇宙。
通过上面的分析,我想我们就比较清楚在使用Cocos2D开发游戏要怎么做了,那就是
像上帝一样去创造游戏世界!像导演一样去执导游戏过程!
我想这大概也是制作游戏的一大乐趣所在!
Question:如何创造游戏世界?
上帝是怎么创造世界的呢?
先创造基本粒子,然后粒子组成各种物质,物质再组成各种更负责的物质,然后有些物质组成了生物,生物中从植物进化到动物,最后到最负责的人类。
游戏也一样。为了使程序结构清晰,那么在编写Class的时候,也应该是类似上面的结构,先编写一些基本的类,然后继承来编写更具体的子类。比如游戏中,有会动的,有不会动的,然后可以先做一个基类比如叫做GameObject,把共同的属性放进去,然后子类再分情况编写,这样就会比较清楚了。
先说到这吧!下一篇笔记再来说说具体的程序结构!解剖一下!
[注:本文为原创文章,如需转载,请注明出处!谢谢合作!]