列挙型enumを理解する

前章までで、自機と弾と敵が出る、ごくシンプルなシューティングを作ることはできました。

しかし実は、先ほど作ってもらったプログラムには、致命的なバグがあります。

objects内でBulletやEnemyの区別を行っていないため、もしBullet同士、Enemy同士がぶつかり合うことがあれば、衝突判定を行って相殺してしまうのです。

これを防ぐには、どうすればよいのでしょうか。

1つの方法は4章のように、BulletとEnemyを別のListに格納することです。

シューティングを作るうえでは、どちらかというとこちらの方が賢いやり方かもしれません。

もう1つの方法が、Player、Bullet、Enemyにそれぞれ「Playerサイド」「Enemyサイド」という属性を付けて、同属性のオブジェクトとは衝突判定を行わないようにすることです。

この属性を付けるときに便利なのが、列挙型enumというものです。

列挙型と聞いてピンと来ない方もいると思いますが、実はみなさんはすでに列挙型を使っています。

FieldクラスのpaintComponent()メソッドにある以下の1文です。

このColor.redというのが列挙型の要素です。

列挙型は、ある特定の値を示す定数のように使うことができます。

Javaにおける列挙型は、以下のように宣言します。

これを使って、GameObjectクラスにtype変数およびアクセサを導入してみましょう。

あわせて、衝突判定のメソッドも、同属性との衝突判定を行わないように書き換えます。

最後に、Enemyなどの各クラスで、自分の属性を設定するようにすれば完了です。

列挙型を用いるメリットとしては、名前が付けられるので読んだときに意味が分かりやすいことや、単に定数変数を用いるのと違い、自分で型を作れるので予期せぬ動作を減らせること、などがあります。

まとめ

いかがだったでしょうか。

オブジェクト指向(とイベントリスナーの続きと列挙型)の説明は以上になります。

しかし、残念ながら今回の記事では、オブジェクト指向、特に多態性(ポリモーフィズム)の素晴らしさを伝えきることはできていません。

オブジェクト指向の便利さを体感するには、Enemyクラスを継承していろいろな種類の敵を作って、それぞれのメソッドを書き換えてみてください。

今回は時間計測にActionListenerを使ってしまったので、あまり複雑な動きを指定することはできませんが、挙動の変更はupdate()メソッド、見た目の変更はdraw()メソッドを書き換えることで、非常にシンプルに実装できることが分かるはずです。

たとえば「playerをホーミングする敵」を作りたかったら、以下のように書き換えます。

インスタンスの生成も、Fieldクラスのコンストラクタに、以下の1文を加えれば完了です。

 

homing

ちなみに、super()というのは、親クラスのコンストラクタを呼び出すという意味で、この場合はnew Enemy(x,y)が使われています。

こんな感じで、皆さんもぜひ多態性を応用していろいろ遊んでみてください!

ひとまず、これでオブジェクト指向の説明を終わります。

お疲れさまでした。

 

 

[転職率95.1%]最短22日で未経験からプログラマーへ『GEEK JOB 転職コース』
geekjob_to_gol_banner_sp_06

『GEEKJOB 転職コース』では未経験からでもプログラミングや仕事の進め方を学習でき、プログラマーとして転職/就職できるまでサポートします。

  • 短期集中のプログラミング学習で未経験から最短22日での転職/就職ができる

  • IT業界の採用を熟知したメンターが就活サポート

  • わからないことは現役プログラマに質問できる

  • オフィスで働く上で必要なスキルを身に付けられる

  • 紹介可能企業は500社以上


文系出身だから、全くプログラミング経験がないから、プログラミングの学習に挫折してしまったから、といった方も関係ありません。

未経験からプログラマーを目指せる環境を用意しています。

詳しく見る

この記事の内容について報告する