Sunflat のブログ

ソフトウェア開発についての話題が多いかも

HaxeでJavaScriptゲームを作ってみた

最近、JSXやHaxeなどのJavaScriptを生成できる言語が流行っているみたいなので、Haxeを少し勉強してみた。
試しに、以前OCaml(ocamljs)で書いたシューティングゲームを、Haxeで書き直してみた。

Haxeの特徴と使い方

Haxeのインストール

  • Mac用のものもhomebrewにあったけど、現時点のバージョンではhaxelibがエラーが出て動かなかった。
    • 追記:@choplin さんが 解決法 を書かれています
  • 結局、Ubuntu 12.04 に入れた

実行したコマンド:

sudo add-apt-repository ppa:eyecreate/haxe
sudo apt-get update
sudo apt-get install haxe libneko0

html5ライブラリのインストール

  • haxelibをセットアップする前に、ライブラリ用のディレクトリ(/usr/lib/haxe/lib)を作っておく必要あり

実行したコマンド:

sudo mkdir -p /usr/lib/haxe/lib
sudo haxelib setup
sudo haxelib install html5

コンパイル方法

haxe -lib html5 -js game1.js -main Game1

または、ビルドファイルを使って: haxe compile.hxml

感想

  • 良さげな点
    • ActionScript3やJavaに近い文法なので、似たような感覚で書ける
    • 静的型チェックがあるので、メソッド名の間違いとかのエラーがコンパイル時に分かる
    • 生成されたJavaScriptのコードが読みやすい。インデントもされていて、そのままデバッグに使える
    • 型推論が強力なので、メソッドの引数/返り値の型を多くの場合省略出来る
    • インライン展開もできる
    • 他の言語(AS3/C++/PHP/C#)も出力できるらしい。Java出力も現在開発中らしいので、Androidアプリ開発にも使えそうで期待。
  • 気になった点(単に勉強不足なだけかも)
    • 整数の割り算や、整数用のmin, max, abs関数が、標準で用意されていない???
    • 無名クラスが書けないので、haxe.Timerを継承したクラスを作るために、別の場所に名前付きクラスを書く必要があった
    • インスタンスフィールドの宣言の場所に初期値を書けない。コンストラクタで代入する必要あり

MSXでプレゼン

MSXでプレゼンしてみました。


プレゼン生成に使ったツールも公開しています:
https://bitbucket.org/sunflat/mlnagoya/

こんな感じのScalaコードから、プチコンのBASIC風の中間形式を経て、こんな感じのMSX-BASICコード(UTF-8版)を生成します。

補足

  • MSX2以降なら、「SHIFT+かな」でローマ字入力できるそうです(Twitterで教えてもらいました)。昔使ってたのはMSX1だったので知らなかった…
  • MSXでは、こんな感じの文字コード(半角ひらがなやグラフィック文字がある)を使っているので、Unicodeからの変換テーブルを作って変換しています
  • 実は、DEF FN文を使って1つの式だけの簡単な関数なら定義できたりします。でも、条件式や再帰などが使えないので、共通の処理をまとめたりするのには使いづらい(代わりにサブルーチンコールを使う)

Macのサウンド出力先を切り替えるAppleScript

iMac用にHDMI出力コネクタを買ったのだが、音声の出力先をHDMI(外部ディスプレイ)と内蔵スピーカで切り替えたいことが良くあるので、AppleScriptにしてみた。
システム環境設定をUI操作しているので、「ユニバーサルアクセス>補助装置にアクセスできるようにする」にチェックする必要あり。AppleScriptスクリプトメニューに登録しておくと便利かも。
環境によって、row番号やラベル文字列が違うかもしれないので、適当に修正して。

tell application "System Preferences"
	activate
	set current pane to pane id "com.apple.preference.sound"
end tell

tell application "System Events"
	tell process "System Preferences"
		tell tab group 1 of window "サウンド"
			click radio button "出力"
			if (selected of row 1 of table 1 of scroll area 1) then
				set selected of row 2 of table 1 of scroll area 1 to true
			else
				set selected of row 1 of table 1 of scroll area 1 to true
			end if
		end tell
	end tell
end tell

quit application "System Preferences"

参考:http://www.oreillynet.com/mac/blog/2006/07/applescript_audio_output_switc.html

チート対策と、framework内のクラスのデバッグについて

Android用ゲームのチート対策と、Android framework内のクラスのデバッグについて話したので、スライドを貼っておきます

いにしえの開発環境

開発環境勉強会で、ひと昔前の開発環境(主にMSX)について話したので、スライドを貼っておきます

開発言語勉強会の感想

  • Vimって、sshターミナル上でサーバの設定ファイルをいじる時に使う、いまいち使いにくいエディタ程度に思っていたけど、結構奥が深いんだなー。いつもカーソルキーでVimを操作してますなんて、とても言い出せるような雰囲気ではなかった。