ocamljsで簡単なシューティングゲームを作ってみた
名古屋Reject会議02で話を聞いたocamljsが面白そうだったので、OCamlよく分からないけど、ocamljsを使ってみた。なんか、シューティングゲームっぽいものが出来た。
[ゲームを起動] (Firefox, Chrome, Safariで動作。IE不可)
遊び方:クリックでゲーム開始。上から敵(水色の四角形)が降ってくるので、マウスで宇宙船(緑色の四角)を動かして、クリックで弾を撃って倒す。敵に当たるとゲームオーバーなので、ブラウザをリロードしてリプレイ。5点ごとにスピードが速くなるよ!
追加仕様:150点以上取るとエラーが出るかもしれませんが(未確認)、それがゲームクリアということでw
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ファイルに分ければ大丈夫?
名古屋Reject会議02
色々濃い話が聞けて面白かったです。
Amazon EC2の話をしたので、スライドを貼っておきます。
Android 1.5/1.6 のsampleのビルドエラー
Android 1.5/1.6 のsample(ApiDemo)を、最新のAndroidSDKでビルドするとエラーが出るようだ。
以下のように、res/values/strings.xml のアポストロフィー(')の前に、バックスラッシュ(/)を入れれば解決するっぽい。
例:
変更前: <string name="summary_on_advanced_toggle_preference">I'm on! :)</string> 変更後: <string name="summary_on_advanced_toggle_preference">I\'m on! :)</string>
まだまだAndroid1.5端末は生き残ってるので、当分は対応が必要そうだなぁ
http://developer.android.com/resources/dashboard/platform-versions.html
スマートフォンまみれ
ふと気づけば、机の上がスマートフォンまみれだ。(iPod touch含む)
ほんの2〜3年前までは、ガラケーまみれの環境でFlash Lite開発の日々だったのになぁ。
(2007年に撮った写真)
今から3年後は、どんな環境で開発してるんだろうか。
とりあえず、iPhone7には3D液晶と指紋センサと心拍計ぐらいはついてそうだな。
CPUは32コアぐらいになって、並列処理向け言語のErlangやgoとかでソフト開発してたりするのかな。