静止したグラフィックシンボルは、ひとつのシェイプにまとめられる
SWF形式を勉強していて、難しいと思った点を記録します。
今回は、「静止したグラフィックシンボルは、ひとつのシェイプにまとめられる」です。
SWF形式のデータ構造は、画像データを直接画面に表示するのでなく、「シェイプ」という中間構造を介して画面に表示します。


一つのシェイプに、二つ以上の画像データを含めることもできます。
※シェイプには、画像データの他にベクトル図形も含められるのですが、簡単のために今回は画像データだけを考えることにします。

まず、Adobe Flashを使って、Flashムービーを作ってみました。(プロジェクトファイルはこちら)
アメリカ、ブラジル、イギリスの国旗を、画面に表示するだけの単純なFlashムービーです。

SWFファイルを作成すると、こうなります。
Adobe Flashのエディタ上では、レイヤーを三つ作ってそれぞれに国旗を置いただけです。グループ化などは行っていません。
だから、生成されたSWFファイルは、下図のような構造になっていると思いますよね。

ところが実際にはそうでなく、下図のような構造になっていました。

swfmillを使って、SWFファイルの構造を調べると、以下のようになっていました。
※見易さのために、swfmillが出力したテキストを少し変更してあります。変更する前のxmlファイルはこちら。

次に、Suzukaを使って、同じ内容のFlashムービーを作ってみました。(プロジェクトファイルはこちら)

SWFファイルを作成すると、こうなります。見た目は、Adobe Flashの場合と同じです。
Suzukaのエディタ上でも、レイヤーを三つ作ってそれぞれに国旗を置いただけです。
Suzukaの場合、生成されたSWFファイルは、直観どおりの下図のような構造になっていました。

swfmillを使って、SWFファイルの構造を調べると、以下のようになっていました。
※見易さのために、swfmillが出力したテキストを少し変更してあります。変更する前のxmlファイルはこちら。

以上のように、エディタ上で同じ手順でFlashムービーを作成しても、Adobe FlashとSuzukaとでは、生成されるSWFファイルの構造が違っていました。
Adobe Flashは、静止した画像が複数あると、自動的にそれらをまとめてひとつのシェイプに定義する特性があるようです。
一方、Suzukaは、個々の画像を別々のシェイプに定義して、判り易い構造のSWFファイルを生成します。
SWFファイルを読み込んで再生するプログラムを作るときに、Adobe Flashの特性はちょっとやっかいです。
「ひとつの画像=ひとつのシェイプ」と決め打って、プログラムを単純化するような、手抜きができないからです。
もし、グループ化の機能を使わなければ「ひとつの画像=ひとつのシェイプ」となるのだったら、Adobe Flash上でデータ作成時に気を付けることで済みます。
しかし実際には、グループ化の機能を使わなくても、Adobe Flashが自動的にシェイプをまとめてしまうので、プログラムはこの構造に対応せざるを得ません。
まあ、ブログラムでの対応が難しいというほどではないのですけれど、僕は最初手抜きプログラムを作っていて、正しく画像が表示できずに悩みました…(^^;
要注意です。
Sun Jun 21 05:50:10 JST 2009 Naoyuki Sawa (nsawa@piece-me.org)