###############
# SWFビューア #
###############

「SWF形式」のFlashムービーファイルを、P/ECE上で再生します。

================
インストール方法
================

1. 「swfview.pex」を、P/ECEに転送してください。
2. SWFファイルを、P/ECEに転送してください。
   SWFビューアは、ファイルの内容を見てSWFファイルかどうかを判断しているので、拡張子は何でも構いません。

========
操作方法
========

上下ボタン　　　　　　ファイルを選択します。
Ａボタン　　　　　　　ファイルを決定します。
Ｂボタン　　　　　　　メニューを消します。
ＳＥＬＥＣＴボタン　　プログラムを終了します。

========
あとがき
========

SWF形式の勉強をしながら、P/ECEでSWF形式のFlashムービーファイルを再生する、SWFビューアを作りました。
非常に限定した機能にしか対応できていなくて、以下のような制限があります。

・SWFバージョン4の、ごく基本的な機能までの対応です。
　ファイルの中に、対応していない機能のデータがあったら、読み飛ばして再生を続けるように作りました。
　SWFバージョン5以上のファイルでも一応再生しますが、機能不足で正しく再生できない可能性が高いです。

・テキストは、ダイナミックテキスト形式のみ対応しました。
　テキスト描画の、拡大・縮小・回転は、対応していません。
　フォントサイズは、P/ECEに特化した方法で、データを解釈するように作りました。

・グラフィック素材の描画だけに、対応しています。(ムービークリップでもokです。)
　ベクトル図形の描画は、対応していません。

・サウンドは対応していません。

・アクションスクリプトは、playとstop、および、ターゲット指定だけ対応しています。
　それ以外のアクションスクリプトは、すべて読み飛ばします。

制限が多すぎて、Webで公開されているSWFファイルを見るために使うのは、かなりキビシイです。
あらかじめ制限を意識してSWFファイルを作成して、ゲームの演出で再生するような使い方ならできそうです。

SWF形式の勉強をしていて難しいと感じたことは、Flashツールの違いによって、生成されるSWFの内容がかなり違うことです。
「ParaFla(http://www.geocities.jp/coa9999/)」や「Suzuka(http://www.cty-net.ne.jp/~uzgensho/)」などのフリーツールは、比較的素直で判り易い構造のSWFファイルを生成します。
一方、本家「Adobe Flash(http://www.adobe.com/jp/products/flash/)」は、ツール上の見た目の構造と対応しない、複雑なSWFファイルを生成する傾向があるようです。
たぶん、「Adobe Flash」の方が高度に最適化したSWFファイルを生成するために、複雑になってしまっているのだと思います。
また、「Flash MX」のような古いバージョンのFlashは、既知の不具合(仕様?)を含んだ画像データを生成してしまったりして、扱いづらいです。
SWF形式を勉強する場合は、理解しやすさのために、まずフリーツールでSWFファイルを作って見る方が良いと思いました。

まだまだSWF形式について理解不足なのですけれど、ここまでのところで特に難しいと思ったのは、以下の点でした。

・同じ深度に複数のオブジェクトを置くことができる。
　SWF仕様書の説明を読むと、ひとつの深度にはひとつのオブジェクトしか置けないように受け取られるのですが、実際には複数のオブジェクトを置けてしまいます。
　PlaceObject2タグの、PlaceFlagHasCharacter=1、かつ、PlaceFlagMove=1の組み合わせによるものですが、挙動が直観的でなくて理解しづらかったです。

・DefineBitsJPEG2タグやDefineBitsJPEG3タグのデータは、普通のJPEGファイルとは違う構造の場合がある。
　「Flash MX」のような古いバージョンのFlashでSWFファイルを生成すると、DefineBitsJPEG2(3)の中のJPEGデータが、分断された構造で格納されるようです。
　普通のJPEGファイルと同じようにデコードしようとすると展開できず、JPEGTablesタグ＋DefineShapeタグの場合と同様に考えて扱わないと正しく展開できません。

・静止したグラフィックシンボルは、ひとつのシェイプにまとめられる。
　「Adobe Flash」の特性として、複数のグラフィックシンボルが画面上で静止していると、それらをまとめてひとつのシェイプに定義してしまうようです。
　最適化のためだとは思うのですが、オブジェクトが動いているか動いていないかで、データの階層構造まで変わってしまうことに戸惑いました。

備忘録として、次回、それぞれの内容をもう少し詳しく記録しておこうと思います。

==================
Fri Jun 12 2009
Naoyuki Sawa
nsawa@piece-me.org
==================
