ActionScriptテックラボ

Flash Lite1.1用にSWFファイルを合成する

モバイルのFlashといえばFlash Lite1.1が主流と思うのですが、Flash Lite1.1はセキュリティ上の問題や単純に古いバージョン(Flash 4 スクリプトに相当)ということでいろいろな制限があります。

今回は、外部ファイル読み込み制限について一つの解決策をご紹介したいと思います。

Flash Lite1.1の仕様では、SWFファイルなど外部ファイルの読み込みはユーザのキー操作がないと行えないという制限があります。キー操作後に、loadMovie() /loadVariables()といった関数を使って外部ファイルを読み込みます。

※再生中のFlashファイルに読み込むことが出来るファイルはFlashファイルのみであり、JPEGには対応していません。

いくつもの外部ファイルを読み込みたいといった際は、ユーザに何度もキー操作をしてもらうことになり、あまり現実的ではりありません。そこで、外部SWFファイルを読み込みたい場合、サーバ側で外部SWFファイルを合成する方法が使われるようになりました。

SWFファイルを合成したい場合、だいだい以下のツールがよく使われているようです。

swfmill
swfmillは、SWFファイルとXMLファイルを相互変換することができます。そのため、SWFファイルをXMLに変換し、必要な変更を行った後、再度SWFファイルとして出力することが可能です。

  • 外部画像をシンボル化し、AS2からアタッチムービーすることができる。
  • 外部SWFをシンボル化し、AS2からアタッチムービーすることができ、子要素のムービークリップもアクセスできる。
  • 外部音声データをシンボル化できる。
  • MCを生成できる。
  • タイムラインを生成できる。
  • フォントを埋め込める。
  • テキストフィールドを生成できる。
ming
PHPファイルからswfファイルを生成することができます。
SWFTOOLS
SWFTOOLSというFlash用ユーティリティに含まれるswfcombineを使い、コマンドラインからSWFファイルを合成します。

サーバ上でコマンドを発行することが可能であれば、swfcombineが便利です。

SWFTOOLSがインストールされている環境であれば、次のようなコマンドで簡単にFlashファイルを合成することができます。

swfcombine stage.swf mc=mc1.swf -o main.swf

上記コマンドでは、stage.swfのMCという名称のムービークリップに、mc1.swfを挿入し、main.swfという名称で出力しています。これだけで、複数のSWFファイルを合成することができます。

それでは、クエリの情報をもとに、合成するSWFを変更し、出力するところまでを追ってみましょう。

まず、クエリを受け取ってswfcombineを実行するために、ここではPerlを使ってCGIプログラムを作成します。

以下の内容でswf.cgiというファイルを作成します。

#!/usr/bin/perl -w
use CGI;
my $q = new CGI;
my $no = $q->param('no') || 1;
# swfcombineの発行
system "/usr/local/bin/swfcombine stage.swf mc=mc$no.swf -o main.swf";
# swfの出力
print "Content-type: application/x-shockwave-flash\n\n";
open FL, "){
$line	.= $_;
}
close FL;
print $line;

上記のCGIプログラムは、swf.cgi?no=1、swf.cgi?no=2のように、noに指定した値を受け取って、その値を元に合成するSWFファイルを選び、新しいSWFファイルを出力します。このプログラムファイルをウェブサーバにアップし、CGIプログラムとして実行すると合成したSWFファイルが表示されます。

ここでは、noの値が1の場合はmc1.swf、2の場合はmc2.swfをstage.swfと合成しています。

swf.cgiは下記のようなHTMLファイルから呼び出すことができます。

<html>
<body>
<object data='swf.cgi?no=1' type="application/x-shockwave-flash" width="240" height="268">
<param name="loop" value="on">
<param name="quality" value="high">
</object>
</body>
</html>

関連記事