swfmillの構造を理解する

swfmillで出来ること


まずはSWFをXMLに変換する

$ swfmill swf2xml main.swf main.xml

このままもどす

$ swfmill xml2swf main.xml main.swf

これが基本中の基本


XMLに変換して、swfに戻す前にXMLを弄れば色んな要素を書き換えられる。
xmlのフォーマットを覚えてswfmillテンプレートを自分で書くなんてことは僕には出来ません)

みんながやりたいこと

1.画像・音声の入れ替え

画像の入れ替えは至る所で情報がある

一番簡単な方法
元の画像ファイルと変更する画像ファイルを用意する


$search = base64_encode($befor_img);
$replace = base64_encode($after_img);
$xml_str = file_get_contents('main.xml');
$xml_str = str_replace($search, $replace, $xml_str);

  • 画像の抽出が上手く行かない場合

$search = base64_encode("\xFF\xD9\xFF\xD8".$befor_img);
$replace = base64_encode("\xFF\xD9\xFF\xD8".$after_img);


おまじないだと思ってこうすると上手く行く

基本的にテンプレートにあらかじめダミーを入れておいて、そっくり入れ替えるのが圧倒的に簡単。

よくある方法だと、DefineSoundやらDefineナントカやらをObjectIDと紐づけて入れ替えろって書いてあるけど、ダミーをまるっと入れ替えるのが1兆倍楽できる。

2.テキストフィールドの書き換え

TextFieldの文字の書き換えもやりたいことであるはず。
これも難しくない。
何度も言うがダミーを入れて置換するのが一番楽
でもそんなんダサイって場合は

  • tags->DefineEditText @ initialText = テキスト
  • tags->DefineEditText->color->Color @red @green @blue = 色

を書き換える


ただし、日本語でFlashLite1の場合は注意が必要Klabが公開しているこのパッチを使うと幸せになれる(http://dsas.blog.klab.org/archives/51174693.html


3.アクションスクリプトを書き換える

ActionScriptの処理の変更はさすがにむずかしい
ただし変数を弄ることは簡単。下のルールに従って各種サーバーサイド言語上で変数を書き換えれば良いだけ。
これもダミーを入れておくのが死ぬほど簡単。

○変数

  • tags->DoAction->actions->PushData->items->StackString @ value = 変数名
  • tags->DoAction->actions->PushData->items->StackString @ value = 値
  • tags->DoAction->actions->SetVariables


ActionScriptで可変の情報を変数にし、色や数値等の設定を変数を用いるようにすれば結構色んなことが出来る。

4.パスの色やムービークリップ等をそのままごっそり入れ替える

ココからが本番?です

さて、やはりパスで書いたFlashの色を変えたり、そもそもMovieClipをごっそり入れ替えたりしたくなるのが、健全な青少年です。

まずシンボル(インスタンス)がどのように、なっているかというと

  • tags->DefineShape2 -> グラフィックシンボル
  • tags->DefineSprite -> MovieClip (インスタンス化されている)

PlaceObjectがメインかな

ちょっとちがうかなぁ。。。
ActionScriptがあったり、フレームがあるのがDefineSpriteかな?

まぁでもそんなかんじ
DefineSpriteは内部にtagsを持っていてrootと同じような内容が中に書かれる
ただしDefine**はもっていないのかな

でobjectIdの順番なんだけど、これはどうやらレイヤーというかdepthの深いところから呼ばれている


*1
swfmillをさらに眺めていたら、ちゃんとインスタンス名もあることに気づいた
PlaceObjectのnameプロパティがインスタンス
つまり hoge.swf の "i_love_you" っていうインスタンスの中身を変えたければ

  • swfmill swf2xml hoge.swf hoge.xmlxmlを生成し
  • xmlを好きな方法でパース
  • 再起的にPlaceObjectを探すかxPathを探す
  • このPlaceObjectを出発点にobjectIdをたどっていき、mvieclip(モーション)を差し替えたい場合は、DefineSprite、graficを差し替えたい場合はDefineShapeやDefineShape2を差し替える

という流れで変更を行い
最終的にswfに戻せば中身を入れ替えることが出来る

*1:2008/11/17追記