七十一雾央原创 转载请注明 http://blog.csdn.net/hust_xy
看cocos2d-x有一个星期了,零零散散的看了一些大家的博客,对于基本的东西有了一点认识。总的来说,如果不急着知道实现的原理,学习cocos2d-x还是挺容易的,用起来也很方便,做游戏省了很多事,当然我现在还是初学,没弄什么复杂的东西哈。
优点
对于现在的我来说,它的优点最主要是
1.跨平台。我一直很想做Android游戏,但是又不想学Java,这是我学cocos2d-x的首要原因
2.C++开发
3.封装好的很多类用起来很方便,尤其是动画特效,粒子系统,还有场景切换效果,另外还提供了很多UI控件,比如输入框。
4.支持很多工具,比如Tile Map Editor
基本概念
Cocos2d-x有几个重要概念,导演Director,摄像机Camera,场景Scene,层Layer,精灵Sprite,动作Action等。它绘制使用的OpenGL接口,自己以前学过一段时间D3D,理解起摄像机还是蛮清楚。其他的概念在游戏中很常见,以前自己用MFC+GDI一点点写ARPG游戏的时候,我封装的是场景管理SceneManage,场景Scene,角色Character,动画Animation几个大类,和这个也差不多,毕竟游戏中的组成元素就那么些。事实上,这些概念看着字面意思就可以理解的差不多了。
与MFC单文档写游戏的对比
刚开始学习的时候把HelloWorld的那个例子好好看看,基本就可以知道大致该怎么写程序了applicationDidFinishLaunching运行第一个场景,场景中需要初始绘制的内容可以在init函数中写出来,在场景创建的时候,init函数一定会被调用(在CREATE_FUNC中可以看到)。看了HelloWorld给我的感觉其实是和用MFC单文档写是一模一样的:
1.变量。变量作为类的成员变量,cocos2d-x写在层类中,它在层类中创建了场景,然后把层加入到了场景中,看起来总觉得怪怪的;MFC中写在视图类中。
2.初始化。Cocos2d-x在init中,MFC单文档可以写在PreCreateWindow中。
3.绘制。MFC中是在OnPaint不断的重绘。而cocos2d-x将这个过程封装起来了,只要我们指定了要绘制的内容后,自动会在每一帧进行绘制,接触不到绘制函数。我猜测cocos2d-x维护一个绘制的队列或容器什么的,我们在init中将要绘制的东西加入到容器中,然后cocos2d-x每次将容器中的东西绘制出来。
4.操作响应。Cocos2d-x主要用来开发移动平台上的游戏,主要的操作就是触屏响应,MFC是鼠标键盘响应,两者基本没什么区别
5.定时器。用法完全一样,cocos2d-x封装的更容易使用,提供定时使用一次,延时执行等多种函数,比较方便。
Cocos2d-x还是比较好学的,当然另一方面也说明了没有什么知识是白学的,自己某一天学习到的东西总是会有一天起作用的。
内存管理
据说是为了照顾Java程序员,cocos2d-x使用了自动内存回收。即在每一帧中,内存管理器会扫描一遍所有对象,不再需要的对象会被释放掉,自动回收内存。看起来似乎很是方便,减少内存泄露的犯错机会,不过刚学的时候在这上面遇到不少问题,即使到现在也不是特别的清楚。
主要有三个函数 object->autorelease,object->retain,object->release
所有对象使用create创建的时候默认都是autorelease的,即自动释放内存。
我在尝试写自己第一个小游戏的时候,总是出错,调试发现在场景层类中定义的一些精灵变量指针都变成空指针了,原因就是它们被自动释放了。要避免它被自动释放,需要调用retain函数,这样内存管理器就不会管它了,这个对象会一直存在,一直到我们手动释放它或者程序结束,手动释放它就调用release就好了。在初学的时候,这个问题感觉就像学C语言的时候if条件“==”写成“=”一样几乎人人都会遇到吧。当然我们看到HelloWorld程序中的精灵似乎并没有调用retain函数,但是仍然在每一帧都绘制出来了,这是因为它们被加入到了层中,即被addChild了,addChild函数的实现中其实调用了retain,当然在removeChild中也就调用了release了。
学了一周,老是看也记不住那些API,当然现在也不需要记住,呵呵。Cocos2d-x官网上有个小例子,教新手写一个简单的小游戏。这个例子确实很基础很简单,但是可以学到精灵绘制、定时器、障碍判定、声音、动画、场景切换等很多知识,也可以了解一下cocos2d-x组织游戏的结构。自己看了一遍例子后,花了一下午的时间自己写了一遍,把之前自己学到的知识都用一遍,在原来例子的基础上在扩展一下功能,加上地图滚动,积分,技能,摇杆等等,就可以学到越来越多的东西了。写程序的过程中也会遇到一些问题,比如原来教程的有些接口已经变了,有部分东西不一样了,但是查阅资料都是很容易解决的。因为每个人的环境不一样,即使是照着别人的教程一步一步做的,仍然是可能会出现各种蛋疼的问题,解决这些问题的过程就是自己成长的过程。