これからASP.NET Core版 対戦型Pengoをつくります。

『ペンゴ』(Pengo)とは

『ペンゴ』(Pengo)は、1982年9月にリリースされたセガ販売のアーケードゲームです。ペンギンのペンゴを操り、敵キャラクターであるスノービーを全滅させることが目的のアクションパズルゲームです。画面には氷が迷路状に配置されており、この氷を飛ばしてスノービーを押し潰して倒します。

作ろうとしているゲームの主な仕様

今回は対戦型のPengoをつくります。敵キャラであるスノービーは作らず、プレイヤー同士で氷を投げ飛ばしあってライバルのプレイヤーを倒します。原作では3つのダイヤモンドブロックがあり、これを並べることでボーナス点が加算されますが、これに関しては無視します。

フィールドは15×15とし、プレイヤーは8人とする。8人に満たない場合はNPCで不足分を補う。
プレイヤーが移動しようとした先に氷がある場合、キー入力で氷を投げたり破壊できる
氷を投げることができるのは、氷の向こうに壁や氷がない場合である
氷の向こうに壁または別の氷がある場合は氷は破壊される
ゲームの進行とともに投げることができる氷がなくなっていくので途中でランダムに追加する

これではPengoではないではないか!というツッコミもあるかもしれませんが、これでゲームをつくることにします。

迷路をつくる

最初にブロックで迷路をつくります。

以下はフィールド上における位置を管理するためのクラスです。

以下は迷路の分岐点になるクラスです。

以下は方向の列挙体です。

以下は迷路を生成するためのクラスです。

Gameクラスの定義

次にGameクラスを定義します。このなかでBlock型とPlayer型が出てきますが、次回の記事を参照してください。

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

まず定数とフィールド変数を示します。

プロパティ

Blocksプロパティはフィールド上に残っているブロックです。

プレイヤーが撃破されたときに火花を周囲に飛ばします。Sparksプロパティは消滅前の火花です。

AllPlayersプロパティはNPC(non player character)を含む全プレイヤーです。

初期化の処理

前述のMaseGeneratorクラスからアイスブロックで迷路をつくります。

ゲームが進行してブロックが少なくなるとブロックを追加します。まずGetAddBlockPositionsメソッドでブロックを追加する位置を決めます。追加する場所が決まったら一定時間経過後にブロックを追加します。このときプレイヤーが存在する場所とすでにブロックが存在する場所には追加しません。

火花の生成

プレイヤーが撃破されたら火花を周囲に飛ばしますが、そのための処理を示します。

まず火花の位置と状態を管理するクラスを示します。コンストラクタの引数は出現場所のXY座標とXY方向の初速です。

プレイヤーが撃破されたらその座標で24個のSparkオブジェクトを生成し、ランダムに初速を与えます。そして更新処理がおこなわれるたびに周囲に移動させます。