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