グレインの備忘録

プログラミング関係とかをつらつらと。

OOP初心者がブロック崩しを作ってみる その1

オブジェクト指向の設計やコーディングについて自分なりに情報を集め始めてからかなり経って、自分なりに手法というものがある程度見えてきた。

ということで、それの実践としてひとつ簡単なゲームを制作してみたいと思う。

概要

今回作るのはよくある美少女を剥ぐ感じのブロック崩しである。

理由は友人にもらったネタがこれだったからだけであって、それ以上の理由はない。

設計の指針

まずオブジェクト指向の原則として

  • クラスはなるべく疎結合にする
  • 小さなクラスを多数組み合わせる
  • データを求めるのではなくメッセージをやり取りする

などの原則があるのでそれを意識する。

さらに、GoFデザインパターンの中でも有用なものは積極的に取り入れていく。

※主に以下のサイトの影響を受けている

オブジェクト指向の設計と実装の学び方のコツ - SlideShare

オブジェクト指向できていますか? - SlideShare

再考: GoF デザインパターン - Qiita

その1:要求分析

今回はブロック崩しがどんなソフトであるか具体的に分析しながら設計を考えてみる。

実際のゲームではメニューやら設定やらもあるのだが今回はコア部分のみに注目する。

f:id:grainrigi:20170830231955p:plain

非常に簡略だが図を書いてみた。

ブロックがメッシュ状になっているのは画像を分割した図を想定しているからだ。

ここでボールの動きに注目すれば、

  • 普段は一定速度で動き続ける
  • 壁やパドルにぶつかったら跳ね返る
  • ブロックにぶつかったらブロックを壊して跳ね返る

ということになる。

つまり、ボールは「移動するか」「跳ね返るか」のどちらかの動きをする。

そうすれば、とりあえず「壁」「パドル」「ブロック」はすべて「ボールを跳ね返らせるもの」として抽象化できそうだ。

とりあえず跳ね返らせるものなのでReflectorという名前でくくっておくことにする。

ボール関係の処理

ボールに関する処理を簡単にまとめてみる。

とりあえず1フレーム分の処理。

f:id:grainrigi:20170830235007p:plain

ボールを移動した後、各オブジェクトと衝突判定を行う。

とりあえず正しく動くようにするため、衝突判定は全オブジェクトに対して行うことにした。

「壁」「パドル」「ブロック」といった衝突対象の違いを考慮しなくて良くなったので、割と簡単な処理になった。

パドル関係の処理

パドルもReflectorの一つで、衝突判定はよそで勝手にやってくれる。

したがって、パドルが関心を持つ必要があるのは自身の移動のみである。

とりあえず、左キー、右キーで左右に移動できるようにしてみよう。

f:id:grainrigi:20170831001201p:plain

衝突を考えなくて良いのでかなりシンプル。

ブロック関係の処理

ブロックもReflectorの一つで、衝突判定自体を自身でする必要はない。

しかし、衝突された時には自身を消さなければならない。

ということで、こんな感じになるだろうか。

f:id:grainrigi:20170831001912p:plain

衝突したかどうかを情報として使うので、ブロックの処理はボールの処理より後になるだろう。

処理のまとめ

各々のオブジェクトが担当する処理は概ね明確になったので、これらの組み合わせ方を考える。

フロー図ではこんな感じだろうか。

f:id:grainrigi:20170831002328p:plain

これでコア部分で必要な処理が明確になった。

無論、この構造が最後まで完璧に通るとは思わないが。

次回予告

次回 「OOP初心者がブロック崩しを作ってみる その2」ではコア部分の処理のクラス化について考えていく。