2D横スクロールアクションゲームのクラス構成を考える
今回は的当てゲームの時よりも複雑なプログラムになることが予想されますので、少しだけクラス分割を考えてみます。プログラム設計てきなあれですね。
アクションゲームの簡易版のようなものを目指すわけですが、このプログラムを組むうえでやはり面倒になってくるのが、敵やアイテムの出現処理、ブロックとの判定処理、後はスクロール処理なども面倒になりそうですね。
これらを処理するオブジェクトをある程度分割することによってちょっとでもわかりやすいプログラムにしていきたいです。
ゲームの処理を構築するためのクラス構成を考える
まずはゲームの処理部分に該当するクラス構成を考えてみました。
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
ゲーム内のエフェクトを表すクラス
アニメーション処理を実装し、当たり判定は無効とする
とりあえずこんなところでしょうか・・・
こちらもあくまで予定のため実際の実装とは少し変わると思いますが、大まかな構成としてはこんな感じで進めていきます。
ディスカッション
コメント一覧
まだ、コメントがありません