cocos2d-x前端开发UI流程

手游前端开发中有一项很基础的流程,就是把美术资源拼成程序能用的UI界面。由于cocos2d-x并没有一套成熟的工具链,我们最开始是由美术大大们出效果图和切图资源,然后我们码农根据效果图,在C++代码中写设置位置、大小等界面逻辑。这种原始的人肉写界面代码的方法需要编译、链接、运行后才能看到最终的界面效果,如果效果不满意还需要重新来一遍,无疑大大降低了开发效率——说起来都是泪啊555......在经过一个多月挣扎之后,我们后来采用了cocostudio v1.0这个编辑器。虽然cocostudio还很不成熟,要让美术大大们上手也有难度,这项工作还是我们码农来做的,但相比之前好多了:cocostudio v1.0可以自动生成一个界面UI的配置json文件及其所需要的多张图集,免去了许多界面代码的编写和调试,而且将多张图片合并成图集可以减少draw calls开销。可是,随着系统越做越多,这一编辑器的弊端就越发明显。除了这个工具本身的bug导致各种所见非所得、给开发带来不便以外,由它自动生成的图集也带来了严重的问题:

一是我们无法指定图集里有哪些图片。这又引发了不同系统共用的图片被加到不同图集里的问题,因为我们无法把共用图片管理起来,去指定UI编辑器使用共用的资源、不要把共用图片和每个系统各自的图片放到同一张图集里。后来我们开始做多语言版本,无法管理图集里的图片资源这一问题就更为严重了。

二是该UI编辑器生成的图集对图片的packing算法并不理想,导致图集尺寸和文件大小偏大,而图片尺寸和大小一直是cocos2d-x游戏内存和存储空间占用的大头。

本渣虽然早就有心想针对这些问题去革新这套UI流程,无奈大家的开发工作一直繁重。最近正好运营市场的大大们不知怎么就拍脑袋要给我们游戏换皮,把目前所有的UI界面全部换掉。趁着这么个劳民伤财的机会,本渣研究出一套更好的UI流程,因此也被组里暂时甩给这个烫手山芋委以前端开发负责人的重任,带领大家在有限的时间内按照新流程去完成换皮......

目标(Goal)

策略(Strategy)

工具(Tools)

流程(Workflow)

1.最开始,我们首先创建两个文件夹tp_projcs_proj,分别作为TexturePackercocostudio项目和资源文件的目录。因为我们需要做多语言版本,这两个目录底下再根据语言种类创建一系列目录:enfade等等。这些目录都要做版本控制。

2.由本渣把被多个系统共用的资源整理出来——呼呼,幸好UI主美大大是个很有条理的大好人,帮本渣整理了绝大部分,发张好人卡嘻嘻——拷到公共资源目录(例如tp_proj/${lang}/common1/common1)下,每个人把各自要做的系统资源也拷到单独的目录下(例如武将系统的拷到tp_proj/${lang}/hero1/hero1)。

3.在TexturePacker中将第一级目录(例如tp_proj/${lang}/common1)拖进右边的Sprites栏,导出的plist和png指定到项目的目标资源目录下。plist和png的命名还是按规范来(例如上例就是common1.pngcommon1.plist)。这时候点击Publish按钮就可以生成图集了。

image

image

4.新建cocostudio项目,导入资源时选择之前放图片的二级目录(例如tp_proj/${lang}/common1/common1):

image

image

image

5.新建合图(Sprite Sheet)文件,注意文件名必须是之前TexturePacker所导出的图集名字:

image

image

image

6.在合图文件中把相应的导入资源拖进去:

image

这时资源左上角会有记号:

image

image

7.现在可以新建Node/Layer/Scene来做具体某个系统的界面了,资源都是直接用导入的图片,接下来都是平常做UI的流程了。不过最好别引入cocostudio默认的UI资源,例如按钮默认的图片,把按钮三种状态的图都填了:

这是cocostudio默认的按钮三种状态的图

[不推荐的方式]没有指定按钮disabled状态的图片

[推荐的方式]指定按钮三种状态的图片

8.点击Publish,这时候我们只需要把cocostudio项目目录中res下的csb文件拷到资源目录下面就可以啦!

image

当然,别忘了把cocostudio项目相关的图片、ccs、csd、csi等文件都加到版本控制里。

image

9.对于多语言版本,一般很少需要做编辑UI界面的改动,只需要更新对应tp_proj/${lang}下的图片资源,生成相应的图集即可。

Q&A

[Code: find_texture.py]

[Code: cocostudio/bash/refresh_csi.sh]

[Code: cocostudio/bash/refresh_csd.sh]

[Code: cocostudio/bash/refresh_ccs.sh]

[Code: cocostudio/bash/refresh_cocostudio_proj.sh]

肿么又是shell?用渣win的筒子们,本渣没有放弃你们,有Python版!还好,这些写起来可没有之前找rsyncPython库那么麻烦...... 这些脚本都放到了这里

对了,你们最后还是需要打开cocostudio发布一下csb的,因为cocostudio代码没公开,本渣不造它是肿么生成二进制文件的,否则早就想放脚本里了......

唉,本渣造你们和我一样懒啦,早就写了批量更新TexturePacker的tps项目文件的脚本。另外,本渣还发现,tps里记录的是文件的相对路径,由于一些人放的相对路径与项目版本控制主线里的相对路径不一致产生了问题,有的甚至还带有中文路径,脚本里也做了相应的检查和处理。

[Code: refresh_tps.py]

Future Works

本渣看到sunjiahua大神写了把Photoshop的psd文件转化成cocostudio的csd文件的工具,如果针对上述流程也有一套psd2csd的工具,那么将会进一步简化流程,提升工作效率。不过大神的工具暂时无法直接拿来用,psd脚本竟然是用混乱邪恶的js,还是等本渣有空以后再继续折腾吧......