言語ゲーム

とあるエンジニアが嘘ばかり書く日記

Twitter: @propella

asc.jar だけを使って swf ファイルを作る方法

Flex3 SDK に付属する asc.jar は単体でも ActionScript コンパイラとして使える。普通使う mxmlc との違いは、abc ファイル(ActionScript バイトコードバイナリ)を生成出来る事と、asc.jar は純粋にコンパイラだけなので、標準ライブラリや Flex が提供するライブラリへのリンクを勝手にしない事だ。asc.jar を使う事で、mxmlc が裏でどのような機能を提供しているかがよく分かる。以下に実際の例を挙げる。

// simple.as
package {
    import flash.display.Sprite;
    import flash.text.TextField;
    public class simple extends Sprite {
        public function simple() {
	    var field : TextField = new TextField();
	    field.text = "Hello World!";
	    addChild(field);
        }
    }
}

このファイルをコンパイルして swf を作成してみる。まず、flash が提供する Sprite や TextField を利用するので、これらのクラスの定義が必要だ。flash.* 以下のクラスは Flash Player 自体が持っているので実装は不要だが、コンパイルを通すために C で言うとヘッダファイルのような宣言を用意する。

// flashglobal.as
package flash.display {
    public class Sprite {};
}

package flash.text {
    public class TextField {}
}

このように自分ででっちあげるのが嫌なら、代わりに Alchemy に含まれる playerglobal.abc を使ってもよい。

クラスの定義には、Object クラスの定義が必要だ。しかし Object 自身を ActionScript で定義出来ないので、Tamarin か Alchemy に含まれるライブラリを利用する。Tamarin では core/builtin.abc Alchemy では flashlibs/globals.abc という名前なのでコピーして使う。

ここまで準備が整ったら以下のコマンドラインコンパイルと swf の生成を行う。

$ java -jar ~/src/flex_sdk_3/lib/asc.jar -import builtin.abc flashglobal.as
$ java -jar ~/src/flex_sdk_3/lib/asc.jar -swf simple,100,100 -import builtin.abc -import flashglobal.abc simple.as

と、役に立たない情報ですが、後で忘れると嫌なのでメモしました。