2D横スクロールアクションゲームのクラス構成を考える

2018年7月16日

今回は的当てゲームの時よりも複雑なプログラムになることが予想されますので、少しだけクラス分割を考えてみます。プログラム設計てきなあれですね。

アクションゲームの簡易版のようなものを目指すわけですが、このプログラムを組むうえでやはり面倒になってくるのが、敵やアイテムの出現処理、ブロックとの判定処理、後はスクロール処理なども面倒になりそうですね。

これらを処理するオブジェクトをある程度分割することによってちょっとでもわかりやすいプログラムにしていきたいです。


ゲームの処理を構築するためのクラス構成を考える

まずはゲームの処理部分に該当するクラス構成を考えてみました。


GameManager

 ゲーム進行と各オブジェクトに処理要求を行うクラス
 配置済みオブジェクトに対し動作要求、当たり判定要求させる役割を担当
 ゲーム内の全情報にアクセスできる手段を持たせる
 processメソッドでゲームのメイン処理を実行する

FieldObjectAppearanceObserverFactory

 オブジェクトの生成、配置監視クラス
 ゲームフィールド内にあらかじめ準備されたオブジェクトを生成し、配置を要求する役割を担当
 カメラの位置を監視し、オブジェクトを出現させるかを判断
 initメソッドで初期化配置
 executeメソッドでゲーム実行中の監視+配置
 ※生成役と監視役に分けたほうがいいかもしれませんね。

FieldObjectManager

 ゲーム内に配置されるオブジェクトを集約したクラス
 オブジェクトをフィールドに配置する場合はこのクラスに配置要求することで追加可能とする
 配置済みオブジェクトの取得もこのクラスへ取得要求する
 各種addメソッドで追加、getメソッドでオブジェクト一覧の取得

FieldObject(列挙型)

 ゲーム内に配置されるオブジェクトのタイプを表す定数


実際はもう少し変更があるかもしれませんが、メインの処理としてはこのクラス構成で進めていきます。

ゲームフィールドに個々で配置されるオブジェクトのクラス構成を考える

次にゲームフィールドに配置されるキャラやブロックを表すフィールドオブジェクト群の構成です。


GameObject

 ゲーム中の全ての個別オブジェクトのスーパークラス
 updateメソッドは常に呼び出され、サブクラスでオーバーライドしてオブジェクト個々の移動処理などを記述する
 また、矩形同士の当たり判定を行うための機能を実装する
 カメラの有効領域にオブジェクトが存在するか判定するメソッドも定義しておく

Field

 フィールドを構成する要素であり、草など当たり判定がない装飾オブジェクトを表す
 オーバーライド用にsinkingReviseメソッドを定義する

Block

 フィールドを構成する要素。Fieldクラスを継承させる
 キャラクターが上に乗れる足場を表すクラス。壁としての役割もある
 sinkingReviseメソッドにキャラクターがめり込んだときに、押し戻す機能を実装する
 この時の判定により、キャラが空中にいるか、地上にいるかなどのフラグをキャラに設定する

GameField

 すべてのFieldオブジェクトを50×50の二次元配列構成で保持した、ゲームステージを表すクラス
 fieldCheckメソッドでキャラクターとステージを判定させ、必要であればCharaDataを押し戻すようにBlockクラスへ要求を行う
 判定対象を全ブロックとするのではなく、キャラ座標と配列の付近のみを判定させるように実装する

CharaObject

 すべてのキャラクタークラスが継承するクラス
 updateメソッドは移動前座標を記録しておき、新たに抽象メソッド、moveを定義する

Player

 CharaObjectクラスを継承したプレイヤークラス
 プレイヤーキャラは1体のみの固定とするため、このクラスにすべてのプレイヤー処理を記述する

Enemy

 CharaObjectクラスを継承した敵クラス
 敵クラスは個々の動きを記述したいので、さらにこのクラスを派生させて実装する

Item

 アイテムを表すクラス
 アイテムも一つしか用意していないため、このクラスに内容を記述する

Effect

 ゲーム内のエフェクトを表すクラス
 アニメーション処理を実装し、当たり判定は無効とする


とりあえずこんなところでしょうか・・・

こちらもあくまで予定のため実際の実装とは少し変わると思いますが、大まかな構成としてはこんな感じで進めていきます。