swfassist

ソースコード / ASDoc

SWFファイルフォーマットメモ

Definition and control tags

Definition tags
Shape, Text, Bitmap, SoundといったSWFファイルの内容を定義する。いずれのdefinition tagもcharacter IDと呼ばれるユニークなIDを持つ。FlashPlayer?はそのIDをdictionaryと呼ばれるリポジトリに保持する。
Control tags
dictionary内のcharacterのinstanceの作成や操作、フロー制御を行う。

Tag odering in SWF files

  • FileAttributes?タグは必ず最初のタグ(SWF8以降)
  • あるタグはその前に出現したタグにのみ依存して良い。
  • definition tag はそれを参照する control tag よりも前に定義する。
  • Streaming sound tag は順番通りに現れる必要がある。(変な順番にするとその通り再生される)
  • End tag は必ず最後。

The dictionary

The process of buiding and using the dictionary is as follows:

  1. Definition tag が Shape, Font, Bitmap, Sound といったコンテンツを定義する
  2. Definition tag がそのコンテンツに対して CharacterId? を割り当てる
  3. そのコンテンツは CharacterId? の元、 dictionary に保存される
  4. Control tag は CharacterID を用いて dictionary からコンテンツを取得し、表示や再生といった動作を行う

CharacterId? はユニークであり、重複は許されない。最初の CharacterId? は 1 で始まり、次は 2 である。0 は特殊であり、 null character とみなされる。

Definition tag はより複雑な character を定義するために、 dictionary 内の character を利用することが出来る。例:DefineButton?, DefineSprite?, DefineText?

Processing a SWF file

FlashPlayer?ShowFrame? tag に出くわすまで全ての tag を処理する。

The Display List

フレームの表示は次のプロセスで行われる:

  1. DefineShape?, DefineSprite? といった Definition tag によってオブジェクトが定義される。いずれのオブジェクトも character というユニークなIDを与えられ、 dictionary と呼ばれるリポジトリに保持される。
  2. 選択された character は dictionary からコピーされ、次のフレームで表示される character のリストである display list に配置される。
  3. ShowFrame? によって display list の内容はスクリーンにレンダリングされる。

display list 上のいずれの character も、 depth 値が割り当てられる。depth は character のスタック順を表す。小さい depth 値の character はそれよりも大きい depth 値の character よりも下に表示される。depth 値が 1 の character は最も下に表示される。character は display list 中に何度も出現することが出来るが、depth 値は異ならなくてはならない。

SWF1 および 2 では、display list は常に表示されるオブジェクトのフラットなリストであった。SWF3 よりも後のバージョンでは、display list は階層的なリストである。(see DefineSprite?)

Display list を制御するために次の 6 つの tag が使用される:

PlaceObject?
display list への character の追加
PlaceObject?2 & PlaceObject?3
display list への character の追加、もしくは指定された depth の character の変更
RemoveObject?
display list から指定された character の削除
RemoveObject?2
指定された depth の character の削除
ShowFrame?
display list の内容をディスプレイに描画

Note: PlaceObject? および RemoveObject? は SWF3 以降のバージョンではめったに使用されない

Clipping layers

Flash Player は clipping layer と呼ばれる display list 内の特殊なオブジェクトをサポートする。clipping layer として配置された character は表示されず、その上に配置された character をクリップ(もしくはマスク)する。PlaceObject?2 の ClipDepth? フィールドは clipping layer がマスクする depth の最大値を定義する。

Using the display list

次の手順はアニメーションの作成と表示を行う:

  1. Definition tag を用いてそれぞれの character を定義する。それぞれの character はユニークな character ID を与えられ、 dictionary に追加される。
  2. PlaceObject?2 tag を用いて display list にそれぞれの character を追加する。それぞれの PlaceObject?2 tag は次のパラーメタと共に character の表示を指定する。
    1. Depth value - character の重ね順をコントロールする。
    2. Transformation matrix - character の位置、スケール、係数、回転角を決める。
    3. Color transform (オプション) - character のカラーエフェクトを定義する。透明度や着色など。
    4. Name string (オプション) - SetTarget? action のために character に名前をつける。
    5. ClipDepth? value (オプション) - clipping layer がマスクする character の depth の最大値を定義する。
    6. Ratio value (オプション) - morph character が配置されたときにどのように表示されるかを定義する。Ratio が 0 のときは morph のスタート時を表示し、Ratio が 65535 のときは morph の終了時を表示する。
  3. Display list の内容をスクリーンに表示するために ShowFrame? tag を使用する。
  4. Display list 上の character を変更するために PlaceObject?2 tag を使用する。それぞれの PlaceObject?2 は与えられた depth 上の character に新たな transformation matrix を割り当てる。それぞれの depth はひとつの character だけしか持てないため、Character ID は定義されない。
  5. 新たな位置になった character を表示するため、ShowFrame? tag を使用する。アニメーションの各フレームに対して 4. と 5. を繰り返す。(Note: フレームとフレームの間で character に変更が加えられないとき、そのフレーム間で character を置き換える必要は無い)
  6. Display list からそれぞれの character を削除するために RemoveObject?2 tag を使用する。削除される character を特定するために depth 値のみが必要とされる。