tmx瓦片地图文件内容的解析与地图自动生成
2017-11-04 21:59
441 查看
想在游戏中使用瓦片地图,但发现手动拼地图确实很麻烦,于是就想能不能自动生成地图。打开一个我编辑好的地图:
保存之后会是一个.tmx格式的文件,用文本编辑器打开这个文件,你会发现这个文件是一个xml文件。
既然是一个xml文件,那我们只要用程序生成这个文件不就可以生成地图了么。有了这个思路之后,现在的问题就是理解这个xml文件的格式。tmx文件有三部分组成,1.第一部分是用来编辑地图的图块。软件会对所有图块编号,在图块中的图块属性也会保存在这个xml文件中。比如
这个图块,我给图块设置了一个"floor_r"的属性,意思是这个图块是用来作地面的。2.第二部分是地图图层.每一个地图图层从左上角开始为编号1,使用从左向右从上向下的方式为图层上所有坐标设置图块编号,数值为0的图块表示图层的这个位置没有放置图块,图层数据有多种保存格式,一般常用的都是base64编码的zlib压缩数据。像下边这样。
我们可以看到"bg"这个层,使用的是"base64",压缩格式是"zlib".另外还有别的数据保存格式,可以在"地图"-->"地图属性"中进行设置。
其中,xml,csv都是未压缩可以直接读取的。代有压缩的格式有gzip和zlib两种格式,因为压缩后的数据是二进制数据流不方便作为文本传输和读取,所以对压缩数据又采用了base64编码。 3.第三部分,是地图中的对象层,如下图
对象层数据没有压缩,也没有用base64编码,是可以直接读取的xml格式。
知道了文件数据格式,接下来自然就可以生成相应地图了。只要你生的文件格式是按这个来的,你的生成的地图编辑器就可以解析。对与base64的解码以及zlib解压缩。我也是使用python进行的。import base64
import zlib
import struct
basezipstr = 'eJzt18ENAjEMAMFc/4JCoBCuLO7DM0h88D5mKrC8UhSvBQAAAMC027HW/Ziego/H1eKpR4YeLXq06NGiR4seLa+rxanHT9wIexO78absTexGjz09WvRo0aNFj5aJ3bgR9qq7Kd0opVmmlN600ixTSjsozTKltIPSLFNKOyjNMqW0g9IsU0o7KM0ypfQPL83Cd26TFm9Zix4terTo0aJHix4tbhMA4J/etYZAUQ=='
basezipout = base64.b64decode(basezipstr)
decompressed = zlib.decompress(basezipout)
datax = struct.unpack('4800i', decompressed)
print datax
输出结果:(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ...这个地图层里有有无数个空图块,所在大部分数值为0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 397, 398, 0, 0, ...地图大小是100X48,所以一共有4800个图块参数,这里省去若干个, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
代码说明:这里用到了,三个库,base64,zlib,struct,前两个大家都明白,第三个库struct 是python对C/C++语言结构体数据打包和解析的工具类库。使用这个库可以解析结构体类型的二进制数据包。常用在与C/C++类程序的socket二进制数据流通信中会经常用到。参考:http://blog.csdn.net/yingluowh/article/details/37903319
保存之后会是一个.tmx格式的文件,用文本编辑器打开这个文件,你会发现这个文件是一个xml文件。
既然是一个xml文件,那我们只要用程序生成这个文件不就可以生成地图了么。有了这个思路之后,现在的问题就是理解这个xml文件的格式。tmx文件有三部分组成,1.第一部分是用来编辑地图的图块。软件会对所有图块编号,在图块中的图块属性也会保存在这个xml文件中。比如
这个图块,我给图块设置了一个"floor_r"的属性,意思是这个图块是用来作地面的。2.第二部分是地图图层.每一个地图图层从左上角开始为编号1,使用从左向右从上向下的方式为图层上所有坐标设置图块编号,数值为0的图块表示图层的这个位置没有放置图块,图层数据有多种保存格式,一般常用的都是base64编码的zlib压缩数据。像下边这样。
我们可以看到"bg"这个层,使用的是"base64",压缩格式是"zlib".另外还有别的数据保存格式,可以在"地图"-->"地图属性"中进行设置。
其中,xml,csv都是未压缩可以直接读取的。代有压缩的格式有gzip和zlib两种格式,因为压缩后的数据是二进制数据流不方便作为文本传输和读取,所以对压缩数据又采用了base64编码。 3.第三部分,是地图中的对象层,如下图
对象层数据没有压缩,也没有用base64编码,是可以直接读取的xml格式。
知道了文件数据格式,接下来自然就可以生成相应地图了。只要你生的文件格式是按这个来的,你的生成的地图编辑器就可以解析。对与base64的解码以及zlib解压缩。我也是使用python进行的。import base64
import zlib
import struct
basezipstr = 'eJzt18ENAjEMAMFc/4JCoBCuLO7DM0h88D5mKrC8UhSvBQAAAMC027HW/Ziego/H1eKpR4YeLXq06NGiR4seLa+rxanHT9wIexO78absTexGjz09WvRo0aNFj5aJ3bgR9qq7Kd0opVmmlN600ixTSjsozTKltIPSLFNKOyjNMqW0g9IsU0o7KM0ypfQPL83Cd26TFm9Zix4terTo0aJHix4tbhMA4J/etYZAUQ=='
basezipout = base64.b64decode(basezipstr)
decompressed = zlib.decompress(basezipout)
datax = struct.unpack('4800i', decompressed)
print datax
输出结果:(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ...这个地图层里有有无数个空图块,所在大部分数值为0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 397, 398, 0, 0, ...地图大小是100X48,所以一共有4800个图块参数,这里省去若干个, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
代码说明:这里用到了,三个库,base64,zlib,struct,前两个大家都明白,第三个库struct 是python对C/C++语言结构体数据打包和解析的工具类库。使用这个库可以解析结构体类型的二进制数据包。常用在与C/C++类程序的socket二进制数据流通信中会经常用到。参考:http://blog.csdn.net/yingluowh/article/details/37903319
相关文章推荐
- 全面解析Unity3D自动生成的脚本工程文件
- 使用Tiled地图编辑器生成TMX地图文件
- 全面解析Unity3D自动生成的脚本工程文件
- 一个没有什么用的程序.自动替换文件内容,并生成复本.
- 全面解析Unity3D自动生成的脚本工程文件
- 如何让帝国CMS如何自动生成sitemap.xml网站地图文件
- HEW中RX62N工程自动生成文件的解析
- vs2010自动生成的文件解析
- JXL包大解析;Java程序生成excel文件和解析excel文件内容
- JXL包大解析;Java程序生成excel文件和解析excel文件内容
- 【转载】全面解析Unity3D自动生成的脚本工程文件
- 全面解析Unity3D自动生成的脚本工程文件
- XML布局文件在Activity自动生成代码(二)SAX 解析
- 基于linux-2.6.35的class_create,device_create解析 (可自动生成设备文件)
- (jfinal)数据库添加内容后,自动生成model下的Java文件方法
- VS 如何自动生成 aspx.designer.cs文件内容(解决"The base class includes the field ''"错误)
- 全面解析Unity3D自动生成的脚本工程文件
- Cocos2d-x tinyxml2用于xml的解析,自动生成xml文件和解析xml文件
- 全面解析Unity3D自动生成的脚本工程文件
- XML形式的配置文件解析框架以及自动代码生成(一)