2015/09/05(土) [n年前の日記]
#1 [cg_tools][dxruby] Tiledのjsonエクスポート仕様がまた変わってた
_Tiled Map Editor
というマップエディタを使って背景データ(BGデータ)を作成しているのだけど。0.13.0が公開されていたのでアップデートして作業したら、エクスポートしたjsonが、Ruby + DXRuby で処理できなくなっていて。
今まで、Tiled でエクスポートしたjsonは、レイヤーのタイルの並びがCSV形式のようになってたのだけど。
現在の Tiled は、jsonをエクスポートする際、.tmxファイルを保存する際の「タイルの出力形式」を引き継ぐ仕様になったようで。デフォルトでは「Base64 (zlib圧縮)」になってるから…。
一応、「タイルの出力形式」を「CSV」にしておけば、今まで通りのエクスポート結果になるようだけど。うっかり忘れそうだな…。
そういえば、いつの間にか json 中に含まれる画像ファイルのパスが、相対パスになっていたことにも気づいたり。以前は絶対パスで記述されちゃってたので、ディレクトリ部分を除外する処理を追加した記憶があるのだけど。まあ、どう考えても、絶対パスで記述するのは変だよな…。他の環境に移した時に画像ファイルが見つからなくてバグが出るし。相対パスで記述されてるほうが正解、だと思うわけで。
今まで、Tiled でエクスポートしたjsonは、レイヤーのタイルの並びがCSV形式のようになってたのだけど。
"data":[209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, (以下略
現在の Tiled は、jsonをエクスポートする際、.tmxファイルを保存する際の「タイルの出力形式」を引き継ぐ仕様になったようで。デフォルトでは「Base64 (zlib圧縮)」になってるから…。
"compression":"zlib", "data":"eJzt2bdRA0EcRvFVCRIgfCCcsAFOCEkE8tgM0wCmAUwDmAYw7fKCi26 (以下略 "encoding":"base64",こんな感じで、状況によっては、Base64のデコード?と、zipバイナリの展開が必要になってしまった模様。もちろん、圧縮されてる分、テキスト量はグンと少なくなるわけで、データファイルの容量削減という面ではありがたいのだけど。
一応、「タイルの出力形式」を「CSV」にしておけば、今まで通りのエクスポート結果になるようだけど。うっかり忘れそうだな…。
そういえば、いつの間にか json 中に含まれる画像ファイルのパスが、相対パスになっていたことにも気づいたり。以前は絶対パスで記述されちゃってたので、ディレクトリ部分を除外する処理を追加した記憶があるのだけど。まあ、どう考えても、絶対パスで記述するのは変だよな…。他の環境に移した時に画像ファイルが見つからなくてバグが出るし。相対パスで記述されてるほうが正解、だと思うわけで。
◎ Ruby側での対応。 :
Base64 のデコードは、'base64' を、zlib形式バイナリの展開は 'zlib' を使う。
デコードと展開をしてるところだけ抜き出してメモ。
require 'base64' require 'zlib'
デコードと展開をしてるところだけ抜き出してメモ。
if layer.has_key?("encoding") and layer["encoding"] == "base64" # base64で記録されてたら変換 bin_str = Base64.decode64(layer["data"]) else bin_str = layer["data"] end if layer.has_key?("compression") and layer["compression"] == "zlib" # zlibで記録されてたら展開して、unsigned int の配列に変換 bin_data = Zlib::Inflate.inflate(bin_str) lst = bin_data.unpack("I*") else # csvで記録されてる場合はそのまま lst = bin_str endlst に一次元配列が入るので、レイヤーのタイル横個数とタイル縦個数を使って二次元配列に変換すれば、DXRuby の Window.drawTile() でタイルBGが描画できる。
◎ Rubyのtmxライブラリ。 :
Tiled の保存形式、.tmx を直接読み込める tmxライブラリを使えば、わざわざjsonでエクスポートしなくても済むのだけど。
_tmx | RubyGems.org | your community gem host
_shawn42/tmx
tmx は Nokogiri を使ってるので、Nokogiri が Windows + Ruby 上でインストールできなくなってる時には、Nokogiri に依存してる tmx もインストールできなくて。*NIX環境ではすんなりインストールできても、Windows ではダメ、みたいな。
その点、jsonでエクスポートしてソレを使えば、Ruby に標準でついてるライブラリだけでも処理ができるから、tmx を使わなくても済むかなと思ってたけど。Tiled 側がこんな感じで、ちょこちょこ仕様を変えてくるなら、tmx を使ったほうが対応が楽かもしれないよなと…。
_tmx | RubyGems.org | your community gem host
_shawn42/tmx
tmx は Nokogiri を使ってるので、Nokogiri が Windows + Ruby 上でインストールできなくなってる時には、Nokogiri に依存してる tmx もインストールできなくて。*NIX環境ではすんなりインストールできても、Windows ではダメ、みたいな。
その点、jsonでエクスポートしてソレを使えば、Ruby に標準でついてるライブラリだけでも処理ができるから、tmx を使わなくても済むかなと思ってたけど。Tiled 側がこんな感じで、ちょこちょこ仕様を変えてくるなら、tmx を使ったほうが対応が楽かもしれないよなと…。
[ ツッコむ ]
以上、1 日分です。