Flash CS6のスプライトシート書き出し後 C/C++用UVテーブルを作成する

Flash CS6 でスプライトシートを書き出すという便利な機能があるが、

各スプライトのUVがXMLで吐き出されるため

スプライトシートを作ったはいいけど、iOSのOpenGLで使う時など

C/C++ でも使える形式に変換するものがないので Python で簡易スクリプトを書いてみた。

動作確認は Python2.7.2 Windows7 。 バッチ処理は Windows 向けだが

Python スクリプト自体は他の環境でも動くと思われる。

まずは以下の Python スクリプトをコピペして保存。

=====[ convert.py ]=====
# -*- coding: utf-8 -*-
import codecs
import sys, re

sys.stdout = codecs.lookup('utf-8')[-1](sys.stdout)

print u"open file.\n"

inname = sys.argv[1]
trimname= inname.split('\\')[-1].split('.xml')[0]

f = codecs.open (inname, 'r', 'utf-16')

data = f.read ()

print u"file size: " + unicode (len (data)) + u" byte(s).\n"

#print data

f.close ()

print u"replace text.\n"

xlist = re.findall (r'x="([0-9]+)"', data)
ylist = re.findall (r'y="([0-9]+)"', data)
wlist = re.findall (r'width="([0-9]+)"', data)
hlist = re.findall (r'height="([0-9]+)"', data)
nlist = re.findall (r'name="([a-zA-Z0-9_]+)"', data)

out = u"typedef struct{ int x, y, w, h } ssuv;\n\n"

if len (xlist) == len (ylist) and len (xlist) == len (wlist) and len (xlist) == len (hlist) and len (xlist) == len (nlist):

 i = 0
 
 out += u"enum {\n"
 
 for x in xlist: 
  
  print nlist[i]

  out += u"\t%(name)s,\n" % {'name' : nlist[i][:-4] }
  
  i += 1
 
 out += u"};\n\n"
 
 i = 0
 
 out += u"ssuv %(valuename)s_tex[] = {\n" % {'valuename':trimname}
 
 for x in xlist:
 
  out += u"\t{%(X)d, %(Y)d, %(W)d, %(H)d},\n" % { 'X':int (xlist[i]), 'Y':int (ylist[i]), 'W':int (wlist[i]), 'H':int (hlist[i])}
 
  i += 1

out += u"};\n"

print u"output file."

f = open (trimname + "_out.txt", 'w')

f.write (out)

f.close ()
========================

あとは引数に xml のファイルパスを渡してやれば

ファイル名_out.txt というファイルで enum とテーブルに変換したものを吐き出す。

適当にバッチ化してやると楽かも。

例えば、Windows ならさらに以下の様なバッチファイルを作成する。

=====[ convert.bat ]=====

echo off
python convert.py %1
pause

=========================

以後、このバッチに処理したい xml をドラッグするだけでコンバートされる。

ちなみに enum で定義される名前は、

シンボル名をそのまま使うのでシンボル名に全角を使わないような工夫が必要です。