その昔、何かの雑誌(MSXマガジン?)に載っていたMSXのゲームをリメイクしてみました。
オリジナルのゲームでは小惑星がそれなりに岩っぽい形をしていたのですが、今回面倒くさいのでただの円にしたら、小惑星というよりシャボン玉のようになってしまいました。
見た目はそれなりですが、結構自信作です。 ちなみに自機が爆発したときの演出はオリジナルです。
今後の変更予定としては、得点を作ることと、ちょっと処理が重いのでなるべく軽くすることです(どの程度軽くなるかは分かりませんが...)。
さっそくですが、多少処理を軽くして、得点も付け加えました。
更にいろいろ調整しました。
遊んでみると意外に中心でただ回転しながら遊びがちになってしまうことに気づき、強制的にスタート時から移動させるようにしました。
自分で言うのも何ですが、はっきり言って自信作です!
はまります。
このプログラムは自分なりに極力オブジェクト指向を意識したプログラム作りを目指しています。
まず、このゲームに登場する全てのもの(自機、小惑星、ビームなど)は全て同じ動きをすることに注目しました。
つまり「ある一定の速度で一定の方向に動き続け、画面の端に行くと反対側から出てくる」というものです。
そこでこの特性だけを抽出してOnjectというクラスを作りました。
自機(Ship)、小惑星(Rocks)、ビーム(Missile)などのクラスは全てこのObjectクラスを継承して作ってあります。
こうすることにより、共通の動きをする部分は自機、小惑星、ビームなどのクラス内で再びプログラムする必要は無くなりました。
また、共通の動きを記述したObjectクラスにバグがなければ、その部分に関しては自機、小惑星、ビームに関してもバグは無いということになります。
自機の特徴、回転して、進行方向に加速する、という特徴は、Shipクラス内に記述しました。
小惑星の特徴、ビームが当たると2つに分裂する、さらに当たると消滅する、などの特徴は、Rocksクラス内に記述しました。
ビームの特徴、ある一定の距離を進むと消滅する、などの特徴は、Missileクラス内に記述しました。
こうして元のObjectクラスを元にして、自機、小惑星、ビームというそれぞれ特徴を持った別のクラスができあがりました。
最終的に、Asteroidクラス(このゲームの本体)にて、これら自機、小惑星、ビーム・クラスを呼び出してインスタンスを生成し、ゲームとしてのルールを追加しています。
...とまあ、一応オブジェクト指向プログラミングの真似事はしていますが、自分ではまだまだだと思います。 その理由は、ここに作った各クラスはあくまでも最終生成物Asteroidクラスを作ることを目的として作られたクラスだからです。 今後別の似たようなゲームを作るときに、これらのクラスを修正無しに再利用するのは、恐らく不可能だと思います。 しかしそれこそがオブジェクト指向プログラムに求められていることです。 そのためには抽象化をもっとうまくやる必要がありそうです。 道はまだまだ遠い...。
さらに処理を軽くする工夫をしてみました。
またまた処理を軽くする工夫をしました。 今度のは効果大だと思います(ただし多少メモリを余計に消費してしまうかもしれませんが)。
久々に修正、というか大改造しました。
Javaをいろいろ勉強していく中で色々便利なクラスがあることが判りました。
その中でPoint2D.Floatというクラスがなかなか使えそうなことが判ったので、それを継承してMovalPointを作り、さらにそれを継承してShip、Rock、Missile、Lineというそれぞれのクラスを作りました。
更にインスタンス変数に配列が使えることも判ったので(今まではやり方がよく判らなくて断念してました)RockとLineはそれを使って1つ1つ別々のインスタンスにすることにしました。
そんなこんなでほぼ全面刷新です。
処理が軽いかどうかはよく分かりませんが、よりJavaのオブジェクトを有効活用するようになったと思います。