Linuxでフラッシュを作る 2

haXeというものを思い出した。調べてみると、SWF形式でも出力できるじゃないか。ということで使ってみた。
Ubuntuリポジトリにも入っているけど、少し古いから最新版を入手してコンパイルした。
haXeの文法はActionScriptに似ている。
wonderfl build flash online | 面白法人カヤックのコードを参考にして(というか丸パクリだけど)haXeのコードを書いてみた。

import flash.display.Sprite;
import flash.text.Font;
import flash.text.TextField;

class FlashTest0 extends Sprite {
    public function new() {
        super();
        var str = "★PCにインストールされているフォントの一覧★\n";
        
        var allFonts:Array<Dynamic> = Font.enumerateFonts(true);
        allFonts.sort(function(x,y){return Reflect.compare(x.fontName.toUpperCase(),y.fontName.toUpperCase());});
        for(i in 0...allFonts.length) {
            str += allFonts[i].fontName + "\n";
        }
        
        var textField = new TextField();
        textField.width = textField.height = 465;
        textField.text = str;
        
        addChild(textField);
    }
    public static function main() {
        flash.Lib.current.addChild(new FlashTest0());
    }
}

haxe -swf9 test0.swf -main FlashTest0 -swf-header 465:465:30:FFFFFF
コンストラクタの名前はnew()、親クラスのコンストラクタはsuper()。継承はextendsでできる。わざわざSpriteを継承する必要は無かったけど、元のActionScriptに似せて書くつもりで。新しいインスタンスはnew クラス名()で作成。
上のコードで目立つ違いはArray。haXeは静的型付け。ただし、Dynamic型も存在する。型推論を持つので型の指定は省略できる。配列は要素の型が決まっていて、一つの配列には同じ型の値しか入れられない。
フォント名順にソートしているところは、無名関数を渡している。文字列の比較方法に悩んだけれど、Reflectクラスのメソッドを使ったらできた。
for構文はfor(i in イテレータ)の形。
haXe言語レファレンス→http://haxe.org/ref/?lang=jp