Javaでゲームプログラミング - LunaJava

作者のhikaruさんに了解を頂いたので、記事にしてみる。
Java用の2DゲームフレームワークLunaJava
http://www.kokeodoshi.net/hikaru/lunajava/
LunaJavaはJavaでゲームを作るのに使える、2D専用ゲームフレームワークだ。
名前が似ているがLuna(DirectXライブラリでAIMSなどが採用している)とは何の関係もないと思う。
現在のバージョンは1.00で、きちんと機能の揃ったフレームワークである。
音を出す機能が無いような気はするが、それはまた別の何かを併用して、ということになるのかもしれない。
DXRubyも音の標準サポートはしょぼいし。


俺はJavaで本格的なコードを書いたことは無いから、設計とかコーディングとかはたぶんまともにできない。
言語仕様は一応押さえているし、読んで理解することはできるから、LunaJavaのソースやドキュメントなどを眺めてみた。
そんな程度で記事を書くというのもなんだかオコガマシイとは思うが、googleで検索してもぜんぜんヒットしないから、さらっと特徴を述べたりして誰かの参考になれば、と思う次第である。


LunaJavaの特徴は、何と言ってもそのシンプルさ、コンパクトさ。
メインになるGameクラスと、モノを管理するSprite系のクラスと、入力のクラスという感じの構成だ。
とりあえず、キーワードはなんでもSprite。
つまりゲーム内のオブジェクトは全て上位にSprite系のクラスを置き、見えるものでも、見えないものでも、とりあえずSpriteになり、フレームワークから管理される。
Sprite関連のクラスは結構多く、用途に応じて選ぶという感じだ。
自動で動く機能や、衝突判定も、Sprite系の機能として組み込まれている。
LunaJavaにとってはSpriteこそがゲームの基本であり、それがすべてなのだ。
継承の階層が深いが、静的コンパイル言語だからその点は実行速度には影響しないだろう。
Rubyをメインに使う身としてはうらやましい限りだ。


さて、だいたいフレームワークというものであれば、得手不得手が存在するのは当たり前。
LunaJavaはそのコンパクトな仕組みから、おそらく簡単なアクションゲームやシューティングなどをターゲットとしているだろう。
そんなことどこにも書いてないけど。
単純に移動しつづけるスプライトのサポートや、アニメーションし終わったら勝手に消えるスプライトなど、そういうものを想定しているように見える。
誰が作っても同じようにしかならないものは、フレームワークとしてサポートされていると大変ラクだ。
DXRubyのようにメソッドベースのライブラリとしてしまうと、そういった部分はそれぞれのユーザーが自分で書かなくてはならない。
でもフレームワークはその動作をまず知る必要がある。
フレームワークとライブラリは一長一短ということだ。
LunaJavaぐらいシンプルなフレームワークなら、習得するコストはフレームワークじゃないライブラリみたいなものと、おそらくほぼ変わらないのだろうとは思う。


はじめてJavaでゲームを作る場合に使ったり、もしくはゲームの作り方の参考にしたり。
ある思想をもって開発されたフレームワークであるのだから、色々と勉強にもなるだろう。
とりあえず俺はフレームワークの一つの例として勉強させてもらっている。
ソースがコンパクトなのもいいよね。