------@H_301_3@
原创博客,转载请注明出处:http://www.jb51.cc/article/p-chztakgs-dt.html@H_301_3@
------@H_301_3@
有几天没有更新博文了,前几天对程序进行了一次重构,整个代码的架构都变了,原因在后面的博文会说明。@H_301_3@
--------@H_301_3@
听过一位游戏前辈说过,游戏就是美工+if+else。这句话不无道理,相比其他应用程序,游戏中很少应用到很复杂的算法,手机游戏更是如此。运用最多的就是for循环和if+else。但是一款游戏要做得好(至少要看得过去)就需要大量的美工支持,而我们初学者,没有美工支持怎么办?毛主席说:自己动手,丰衣足食!本次开发所应用到的游戏素材均来自网络,如有不如意之处就自己用PS处理一下。:)@H_301_3@
Cocos2dx的游戏资源是放在游戏根目录下的Resources目录下,开发者可以直接将各种图片丢进这个目录,然后用Cocos2dx调用即可,如果这么简单,就没必要写这篇博文了。Cocos2dx项目每一次创建一个有图像纹理的对象,都会读取一次目标图像,并且计算机读取图像的方式是按照2的整数次幂开设内存空间的(在2.0版本以前的OpenGL ES都是这么实现的),假设有10张3*5的图像,那每张图像的内存容量就是4*8,这会造成相当一部分内存成为碎片而无法使用。因此,一个显而易见的想法就是:把小图片拼成大图片,然后在用过一个标记文件(例如XML或者json)来划分各个子图,就能有效减少内存碎片的产生。@H_301_3@
此外将小图片组合成大图片还有一个好处,就是减少系统的IO时间,多次小容量IO会造成多次系统中断,大大降低系统效率。同时,引入大图片模式还可以是尽可能多的纹理图片在程序在如过程中就被载入内存,保证了游戏进行过程中的流畅性。@H_301_3@
接下来,问题来了:怎么将小图片拼成大图片呢?@H_301_3@
- 方法一:使用Adobe的Photoshop进行手动拼接,运用合适的算法(目测),同时记录下子图的坐标,写入XML。(等你这么做完,人家游戏都上线了。。。)
- 方法二:使用图像拼接软件,强力推荐 Texture Packer 这款软件,全自动计算最优拼接方法,生成XML。
@H_301_3@
Texture Packer还会提供很多编码算法,选择适合的方式能够进一步降低图像的容量,我采用的是RGBA4444格式,经过比对,并没有明显降低图片的质量,却极大地减少了容量,这是游戏制作者所喜闻乐见的,这是经过拼接之后的图片:(容量:1.8MB)@H_301_3@
@H_301_3@
这样,游戏所需要的素材就搞定了,在主程序里,只要用一句命令就能读入所有的图片纹理:@H_301_3@
cocos2d::SpriteFrameCache::getInstance()->addSpriteFramesWithFile(UserDefault::getInstance()->getStringForKey("textureFileName"));
由于所有的纹理都在载入时就读入了,这就能保证场景变换和生成新对象时不会有IO发生,提高游戏流畅度。@H_301_3@
下面,就是开发游戏场景了!@H_301_3@
--------------------------------------------
本系列的博客的作品都会开源在github上:https://github.com/netbeen/flyingACE,时时更新,欢迎大家star和fork,谢谢捧场!
某一关的测试视频demo:http://v.youku.com/v_show/id_XODgzNDQwNDgw.html?f=23404712&o=0 @H_301_3@