SWFを書く
SWFを用意する
読み込んだり、弄ったり、作ったりして、予めSWFを用意しておきましょう。
SWFとして書く
まずは書き出し先のByteArray?を用意して、ByteArrayOutputStream?を作ります。
var bytes:ByteArray = new ByteArray(); var output:DataOutput = new ByteArrayOutputStream(bytes);
WritingContext?とSWFWriterを作ります。
var context:WritingContext = new WritingContext(); var writer:SWFWriter = new SWFWriter();
SWFWriterのwriteSWFメソッドで書かせます。書かせると、bytesにデータが出来上がります。
writer.writeSWF(output, context, swf);
データを書き出す
完成したSWFデータは、FileStream?で保存したり(AIRのみ)、
var file:FileStream = new FileStream();
file.open(new File('output.swf'), FileMode.WRITE);
file.writeBytes(bytes);
file.close();
Loaderで直接読み込んだり出来ます。
var loader:Loader = new Loader(); loader.loadBytes(bytes); addChild(loader);
コンテキストを使う
WritingContext?では、読み込みに関する設定を行うことが出来ます。
バージョンの強制
ignoreSWFVersionをtrueに設定してversionを任意の値にすると、SWF.header.versionに設定されているバージョンを無視してそのバージョンのSWFとして書き出します。
エラーハンドラ
ErrorHandler?の実装クラスをerrorHandlerプロパティに設定すると、エラーが起こったときに何かしらの処理を行えます。また、handleError/handleWarningメソッドでtrueを返すと、無理矢理読み込み処理を続行出来ます。falseを返すと例外がスローされます。デフォルトでは全て例外になります。
その他
のプロパティは内部的に使用している物なので気にしないでください。
巨大なSWFを書く
タグの数が多いSWFの場合、一気に全て書き出すことが出来ないので、少しずつ各必要があります。今のところ、context.offsetとcontext.lengthで書き出すタグの範囲を指定出来るので、それを利用してEnterFrame?か何かで回してあげましょう。
private function writeSWF():void
{
_output = new ByteArrayOutputStream(new ByteArray());
_wc = new WritingContext();
// 5000個ずつ書くように設定
_wc.length = 5000;
_writer.writeSWF(_output, _wc, _swf);
addEventListener(Event.ENTER_FRAME, writeHandler);
}
private function writeHandler(e:Event):void
{
// 書いたタグ数が総タグ数を上回ったら
if (_swf.tags.numTags < (_wc.offset + _wc.length)) {
// 完了!!
removeEventListener(Event.ENTER_FRAME, writeHandler);
return;
}
_wc.offset += 5000;
_writer.writeSWF(_output, _wc, _swf);
}
private var _output:ByteArrayOutputStream;
private var _wc:WritingContext;
private var _writer:SWFWriter = new SWFWriter();
