今回はマッピー(MAPPY)をつくります。

マッピー(MAPPY)とは

マッピー(MAPPY)は1983年5月25日にナムコ(現・バンダイナムコエンターテインメント)よりリリースされたアーケードゲーム。 主人公であるネズミの警官・マッピーを操り、トランポリンやパワードアを使って泥棒猫・ニャームコとその手下の猫・ミューキーズを避けながら、ステージに点在する盗品の数々を取り返していく、アイテム回収型アクションゲームです。

下は本物のマッピーのプレイ動画です。

主な仕様

プレイヤーは黄色いひよこ、敵は青いひよことする。ニャームコとミューキーズの区別はない。
トランポリンで上昇降下しているときは当たり判定はない。
本物のマッピーでは同じアイテムを連続して回収すると得点が2倍になるルールがあるが、これは無視する。
本物のマッピーでは一定時間が経過すると “HURRY” の文字が画面を横切り、音楽のテンポが上がると同時に敵が増え、動きも早くなる。さらに一定時間経過するとご先祖様が登場するが、これも無視する。

ではさっそく作成することにします。名前空間はMappyとします。

マップをつくる

最初に画面上に表示する床やアイテムの位置を定義するためのマップをつくります。

Wは左側の壁、wは右側の壁、Fは床、Eは敵の初期位置、Pはプレイヤーの初期位置、Lは左に開くパワードア、lは左に開く普通のドア、Rは右に開くパワードア、rは右に開く普通のドア、Tはトランポリン、tはトランポリンで上下に移動できる場所、Cはトランポリンの天井、Aは左右に移動できる部分、Sは画面の外に飛ばされた敵が復活する場所です。

ステージの番号が奇数の場合はmappy-map1を使い、偶数の場合はmappy-map2を使います。

mappy-map1.txt

mappy-map2.txt

Cell列挙体

マップを構成するセルの列挙体を定義します。

Positionクラス

座標を格納するためのPositionクラスを定義します。

Itemクラス

アイテムの座標と状態を格納するためのItemクラスを定義します。

Trampolineクラス

トランポリンの座標と状態を格納するためのTrampolineクラスを定義します。

プレイヤーが同じトランポリンを連続で使用できる回数は4回までです。4回使用するとトランポリンは消滅し、5回目に着地するとミス時の処理がおこなわれます。

Doorクラス

ドアの座標と状態を格納するためのDoorクラスを定義します。プロパティは左右どちら側に開くドアなのか、現在の状態は開いているのか閉まっているのか、それはパワードアなのかどうかです。パワードアは一度開くと弾丸を発射し、そのあとは普通のドアになってしまいます。

Sparkクラス

キャラクタ死亡時に発生する火花の座標と状態を格納するSparkクラスを定義します。コンストラクタの引数は発生場所のX座標とY座標、初速のX成分とY成分です。

MappyGameクラスを定義する

ゲーム全体を管理するMappyGameクラスを定義します。

以降は名前空間を省略して以下のように書きます。

定数部分

キャラクターのサイズは32ピクセルとし、1秒あたりの更新回数は24回とします。残機制で最初は5機、残機が0になったらゲームオーバーです。TIME_TO_START_MAXはステージクリアや自機死亡などでゲームが中断される更新回数、CANT_MOVE_COUNT_MAXは開閉するドアに巻き込まれた敵が動けなくなる更新回数、TIME_TO_ENEMY_REVIVE_MAXは画面外に押し出された敵が復活するまでの更新回数、SPARK_LIFE_MAXは爆発時の描画を繰り返す更新回数です。

コンストラクタ

StageNumberはステージの番号、ColMaxとRowMaxはマップを構成する横の要素数と縦の要素数、Playerはプレイヤー、Enemies、Doors、Items、Trampolinesは敵、ドア、アイテム、トランポリンのリスト、EnemyRevivePositionは画面の外に飛ばれてた敵が復活する座標です。TimeToStartとTimeToPlayerReviveがゼロより大きいときは更新処理は行なわれません。MapArrayはマップの要素を格納する二次元配列です。

各プロパティ

マップの初期化

文字列をリソースから読み込みマップを初期化をする処理を示します。

StageNumberの初期値は0なので最初にインクリメントして1にします。ステージの番号が偶数か奇数かで読み取るリソースを変更します。そのあと読み取った文字列をCreateArrayメソッドとCreateObjectListメソッドに渡します。

CreateArrayメソッドは二次元配列に値をセットしているだけです。

CreateObjectListメソッドでは自機の初期座標の取得、敵、トランポリン、ドア、アイテムを生成してリストに格納しています。

GetTrampolineメソッドとGetDoorメソッド

GetTrampolineメソッドとGetDoorメソッドはマップの行番号と列番号からトランポリンやドアがあるかどうかを調べて、存在する場合はそのオブジェクトを返します。