前回、JavaScriptで『スペースウォー!』(Spacewar!)を完成させたので、次に対戦型の『スペースウォー!』を作ります。

スペースウォー!は1962年、当時マサチューセッツ工科大学(MIT)の学生であったスティーブ・ラッセルを中心に、DEC社のミニコンPDP-1上で稼動するデモンストレーションプログラムとして開発されました。世界初のシューティングゲームとされています。

特徴として、方向転換しただけでは進行方向を変えることはできません。また中心には太陽があり、プレイヤーの移動に影響を与えます。近づきすぎると重力に引き込まれてミスとなります。操作が難しいゲームといえます。

ではさっそくつくっていきましょう。名前空間はSpacewarAppとします。

定数の定義

ゲームで使う定数を定義します。

Bulletクラスの定義

発射された弾丸の状態を取得、更新するためのBulletクラスを定義します。弾丸はレーザーのように一定の長さの線状に伸びたものとし、先端部に当たり判定があるものとします。

以降は名前空間部分を省略して表記します。

フィールド変数とプロパティ

フィールド変数とプロパティを示します。

コンストラクタ

コンストラクタを示します。コンストラクタの引数をフィールド変数に代入し、リストに現在の座標を格納します。

更新時の処理

更新時におこなわれる処理を示します。

現在の座標をリストの先頭に追加し、リストの大きさが20を超えたらそれ以降は切り捨てます。これで弾丸の先頭部分と最後尾部分が取得できるようになります。

そのあと移動速度分だけ座標を変更します。もしLifeが0になったりフィールドの外に出た場合は死亡フラグをセットします。

Playerクラスの定義

プレーヤーの状態を取得、更新するためのPlayerクラスを定義します。

以降は名前空間部分を省略して表記します。

フィールド変数とプロパティ

フィールド変数とプロパティを示します。

コンストラクタ

コンストラクタを示します。

OuterPointsとInnerPointsに設定している座標は以下の部分です。

初期化の処理

ひとつのゲームが終わって次のゲームに移行するときにプレーヤーの状態を初期化するための処理を示します。

ここでやっていることはプレーヤーの座標と機体の方向を最初の状態に戻す、死亡フラグのクリア、移動速度のリセット、発射された弾丸のリストのクリアです。

更新処理

更新時におこなわれる処理を示します。

方向転換をするキーが押下されていたらその方向に機体を回転させます。そして移動速度分だけ座標を移動させます。このときフィールドの外に出てしまう場合は反対側にワープさせます。同時に弾丸の状態も更新し、死亡フラグがセットされている弾丸オブジェクトはリストから取り除きます。

弾丸発射時の処理

弾丸発射時におこなわれる処理を示します。

自機死亡時と射撃不能時はなにもおこなわれません。弾丸発射の処理をするときは自機の中心座標と同じ座標に新しい弾丸オブジェクトを生成します。弾丸の移動速度は自機の方向と三角関数から得られた値に機体の移動速度を合成したものとします。また弾丸を発射したら0.1秒間は射撃不能とします。

加速処理

加速時におこなわれる処理を示します。機体の方向を三角関数に渡してそのぶん加速させます。

Fireballクラスの定義

爆発時に発生する火球の状態を取得、更新するためのFireballクラスを定義します。

火球は一度生成されると中心座標は変えずに寿命が尽きるまで半径を1ずつ大きくしていきます。