tmx瓦片地图文件内容的解析与地图自动生成

本文介绍如何通过程序自动生成游戏中的瓦片地图,重点解析了.tmx文件的XML格式结构,包括图块、地图图层及对象层,并提供了解码base64和zlib压缩数据的具体Python代码。
部署运行你感兴趣的模型镜像

想在游戏中使用瓦片地图,但发现手动拼地图确实很麻烦,于是就想能不能自动生成地图。打开一个我编辑好的地图:

tmx瓦片地图文件内容的解析与地图自动生成 - ♂苹果 - 眼睛想旅行

 保存之后会是一个.tmx格式的文件,用文本编辑器打开这个文件,你会发现这个文件是一个xml文件。

tmx瓦片地图文件内容的解析与地图自动生成 - ♂苹果 - 眼睛想旅行

 既然是一个xml文件,那我们只要用程序生成这个文件不就可以生成地图了么。有了这个思路之后,现在的问题就是理解这个xml文件的格式。

tmx文件有三部分组成,

1.第一部分是用来编辑地图的图块

软件会对所有图块编号,在图块中的图块属性也会保存在这个xml文件中。比如

tmx瓦片地图文件内容的解析与地图自动生成 - ♂苹果 - 眼睛想旅行

这个图块,我给图块设置了一个"floor_r"的属性,意思是这个图块是用来作地面的。

2.第二部分是地图图层.

每一个地图图层从左上角开始为编号1,使用从左向右从上向下的方式为图层上所有坐标设置图块编号,数值为0的图块表示图层的这个位置没有放置图块,图层数据有多种保存格式,一般常用的都是base64编码的zlib压缩数据。像下边这样。

tmx瓦片地图文件内容的解析与地图自动生成 - ♂苹果 - 眼睛想旅行
我们可以看到"bg"这个层,使用的是"base64",压缩格式是"zlib".
另外还有别的数据保存格式,可以在"地图"-->"地图属性"中进行设置。
tmx瓦片地图文件内容的解析与地图自动生成 - ♂苹果 - 眼睛想旅行
 
其中,xml,csv都是未压缩可以直接读取的。代有压缩的格式有gzip和zlib两种格式,因为压缩后的数据是二进制数据流不方便作为文本传输和读取,所以对压缩数据又采用了base64编码。

 3.第三部分,是地图中的对象层如下图

tmx瓦片地图文件内容的解析与地图自动生成 - ♂苹果 - 眼睛想旅行

 对象层数据没有压缩,也没有用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.youkuaiyun.com/yingluowh/article/details/37903319


您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

tIDE是多国语言的免费软件,但是!竟然没有中文,关于它的介绍自己看就不说了,下面来创建第一张地图,用于我们的TD游戏。 你现在需要一张这样的tile图片,来做完地图的基本元件 在Explorer面板Map节点地下的Tile Sheets右键Add,然后浏览选择上面的或者你自己的tile文件。 OK弹出Tile Sheet Properties对话框设置一下Tile Size让Tile完美的切割。这里的值是60x60。 ok,然后会在Tile picher面板里就会出现一个个分割好的Tile。 有了这些tile的支持就可以在map上玩拼图了。在map Explorer面板下的Map节点的Layers上右键Add,在弹出的Layer Properties设置地图的大小Layer Size,因为我现在只打算做一个最简单的也就是一屏幕而且不能拖动所以这里设置14x8 (800/60 x 480/60),OK。 为了方便绘制在工具面板的右上角有一个显示网格的按钮,点下去它 右边的绘图工具栏上有一个很好使用的按钮区域绘制,它能把选择区域填充出当前选择的tile,下面就先在tile Picker选择一块浅色的草地区域绘制到整个地图。然后画上我们的路。 Save as为 tmx类型的文件 中间如果出现警告确定就好了 这里出现了最关键的一步,这里一定要选Base64(gzip compressed),ccx现在的版本还只支持这一种。 把生成的tmx文件以及tile图片加入我们的项目中。 这里可能需要调整一下tmx文件中的Image source的路径 在程序中显示TMX地图 先显示出来看看努力的效果,之后再慢慢完善。 把GameScreen构造函数中的说明Label删除,添加CCTMXTiledMap 代码很简单如下 private GameScreen() { CCTMXTiledMap tmxmap = CCTMXTiledMap.tiledMapWithTMXFile("Map/Level1"); addChild(tmxmap); }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值