Sunflat のブログ

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

ocamljsで簡単なシューティングゲームを作ってみた

名古屋Reject会議02で話を聞いたocamljsが面白そうだったので、OCamlよく分からないけど、ocamljsを使ってみた。なんか、シューティングゲームっぽいものが出来た。

[ゲームを起動] (Firefox, Chrome, Safariで動作。IE不可)

遊び方:クリックでゲーム開始。上から敵(水色の四角形)が降ってくるので、マウスで宇宙船(緑色の四角)を動かして、クリックで弾を撃って倒す。敵に当たるとゲームオーバーなので、ブラウザをリロードしてリプレイ。5点ごとにスピードが速くなるよ!

追加仕様:150点以上取るとエラーが出るかもしれませんが(未確認)、それがゲームクリアということでw

ソースコード(game1.ml)

ocamljsとは

OCamlのプログラムを、Webブラウザで動作するJavascriptに変換してくれる。
id:keigoiさんの記事が詳しい:
http://d.hatena.ne.jp/keigoi/20101101/1288584308

OCaml入門

OCaml.jpのチュートリアルで勉強した: http://ocaml.jp/
あとは、ocamljsについているexamplesを眺めたりすると良さげ

使ってみた感想

  • 良かった点
    • mutableな変数を定義すれば、普通にjavascriptと同じような感覚でコードが書ける。関数型言語的にはあまり良くないらしいが
    • 型推論が強力なので、静的型付け言語にもかかわらず、ActionScript3みたいに型名だらけにならない
    • コンパイルエラーと戦う必要があるが、コンパイルが通った後は、ランタイムエラーはめったに発生しない(コンパイル時に多くのエラーを見つけられる)
    • onMouseMoveメソッドでの return false; のし忘れとかを、自動検出できた
    • 関数の部分適用が結構便利。引数の一部のみを指定した関数(残りの引数を取る)を作って、別の関数に渡したり
    • バリアント型やパターンマッチが便利そう!
  • 困った点、気になった点
    • OCamlの構文に慣れるのが結構大変。セミコロンの有無を間違えたり、演算子の優先順位を勘違いしたり、負の数を括弧で囲み忘れたり
    • 複数のレコード型に、同じ名前の要素を定義してしまうと、型推論がうまくいかない(ship_t, bullet_t, enemy_t に、同じ変数 x,y を定義した場合など)。id:mzpさんによると、shipX, bulletX, enemyX のように、別々の名前をつけるのが良いらしい
    • ocamljsで生成されるJavascriptのコードには、LGPLのコードが含まれているようだけど、静的にリンクされちゃっているので元のOCamlのソースも公開が必須になるのかな?ライブラリ部分を別のjsファイルに分ければ大丈夫?