フィーチャーフォン向けソーシャルゲームで必要な動的SWF生成 by swfmill

f:id:peroon:20120309134941p:image

■目的
swf内の画像書き換え

■流れ
swf0 -> xml0 -> (xml書き換え) -> xml1 -> swf1

■ツール
こちらから良さげに書き換えられたswfmillをDL.
http://d.hatena.ne.jp/haru-komugi/20090213/1234541317

■元となるswf作成
Flash Lite 1.1で original.swf を作成。
(card00.jpg, card01.jpgが回転するもの。
 これをcard02.jpg, card03.jpgに書き換えることが目的)

■補足知識
フィーチャーフォン向けFlashは以下の設定で作ります
Flash Lite 1.1,
Action Script 1.0,
Swf file size 100KB,
Memory 1MB

■基本動作確認
コマンドプロンプトから
swfmill swf2xml original.swf > original.xml
swfmill xml2swf original.xml > temp.swf
で相互変換ができることを確認。

■テンプレート作成
original.xmlでは、画像は文字列(Base64)で書かれています。

original.xmlの画像文字列部分をタグに書き換える。
今回は${IMG0000}, ${IMG0001}として
template.xmlとして保存。

■タグ部分を新しい画像に置き換える
今回はruby。↓

実行後、画像が書き換えられたswfができました。
#画像置き換え関数

def substitute(text, tag, imgPath)

  #置き換えるJPEGを読み込む
  filename = imgPath
  fd = open(filename, 'rb')
  fd.binmode
  ba = fd.read
  fd.close

  #EOIとSOIをつける(これをやらないとドコモで表示が真っ赤になる)
  ba = "\xFF\xD9\xFF\xD8" + ba # EOI + SOI
      
  #BASE64にする
  b64 = [ba].pack("m").gsub("\n","")      
      
  #置きかえる
  result = text.gsub(tag, b64)
  return result
end

#--------------------------
#Main
xml_template = './template.xml'
# テンプレートXMLを読み込む
f = open(xml_template)
xml = f.read
f.close()

#xmlを書き換える
temp = substitute(xml , "${IMG0000}", "./card02.jpg")
temp = substitute(temp, "${IMG0001}", "./card03.jpg")

#書き換えたXMLを保存する
xml_swf = './substituted_template.xml'
f = open(xml_swf, 'w')
f.write(temp)
f.close

#swf生成
system("./swfmill.exe xml2swf " + xml_swf + " > out.swf")
■おまけ JavaScript変換
Swiffy Extension for Flash Professional
http://www.google.com/doubleclick/studio/swiffy/extension.html

を使ってFlash Lite 1.1プロジェクトから
JavaScriptを含んだHTMLを生成。

swfと同様に動きました。
こちらも画像はBase64だったので
同様に置換すればスマートフォン対応ができます。