需求:利用tiledmap拼接世界大地图,且为斜45度菱形地图。
为了提升细节势必需要更多的图层,而cocos一个图层只能使用一张tilesets,如果使用较多的图层则造成的问题是渲染压力提升,拖动地图时重新组织的开销变大。另外iso的tiledmap支持的图块集模式大致如下:

因为策划在铺图的时候都是按照rect选择框去选择然后hook到地块上面,虽然这看起来无可厚非,但是对于细节要求较高的地图基本需要4-5张2048的图才能满足需要,这对游戏资源的占用是令人发指的。
进入正题:
首先我们从贴图利用率上入手,我们看了上图发现其实可以把中间空白的地方利用起来,大致应该是这个样子
生成这张图的方式也很巧妙,本来是打算让美术手帖,感谢一个灵性老哥的提(zhi)醒(dian),使用tiledmap建立交错地图,利用tiledmap拼成想要的样子,然后导出为图像,需要注意的是根据uv坐标系,需要从左上角开始铺图,另外还有一个问题注意边界问题,假设图宽为2048,那么你一行最好是放7张set,为什么呢,细心的你会发现偶数行的贴图其实是前一行贴图的右下偏移。
还有的同学关心工作流的问题,因为tiledmap的工作原理是图层地块绑定图块集的gid, 其实策划在拼图的时候依然可是使用原图进行拼接,但是原图的大小完全可以超过2048*2048 因为我们后面会对臃肿的原图进行重新排列。策划拼好后,可以按照从左到右,自上而下的顺讯把原图的set重新排列,保证gid不变,生成的图是给程序用的,这时候我们就要去魔改一下tmxparse和tmxassembler中相关的代码。
1.CCTiledLyaer.js中_fillTextureGrids函数是生成gid对应的grid数据,包括每个gid对应的4个顶点的坐标,uv,颜色信息。我们的目的就是把原来的矩形修改为菱形,做一下顶点位移即可。
2.CCTMXXMLParse.js 中 rectForGID 用于计算每个gid在tilesets中对应的坐标,因为我们的图重新排过,所以这里也需要针对修改。
3.tmx-layer-assembler.js中render_data数据填充的时候,修改顶点坐标和uv映射:

说明:vm 其实是之前在paser里面增加的grid参数
嗯,以上修改完成后,我们就可以建立出很完美的iso地图,没有矩形边缘问题。

图是随便搞的,大家随便看下,这里只是为了测试。有不对的地方还望大佬斧正。
项目经过这波优化,原来的5张2048的图被压缩到3张。美滋滋…

