天天看點

tmx瓦片地圖檔案内容的解析與地圖自動生成

想在遊戲中使用瓦片地圖,但發現手動拼地圖确實很麻煩,于是就想能不能自動生成地圖。打開一個我編輯好的地圖:

 儲存之後會是一個.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
import zlib
import
basezipstr = 'eJzt18ENAjEMAMFc/4JCoBCuLO7DM0h88D5mKrC8UhSvBQAAAMC027HW/Ziego/H1eKpR4YeLXq06NGiR4seLa+rxanHT9wIexO78absTexGjz09WvRo0aNFj5aJ3bgR9qq7Kd0opVmmlN600ixTSjsozTKltIPSLFNKOyjNMqW0g9IsU0o7KM0ypfQPL83Cd26TFm9Zix4terTo0aJHix4tbhMA4J/etYZAUQ=='
basezipout = base64.b64decode(basezipstr)
decompressed = zlib.decompress(basezipout)
datax = struct.unpack('4800i', decompressed)  
print      

輸出結果:

(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二進制資料流通信中會經常用到。