<戻る

STGつくろー!
NO12 ここまで作っておいてなんですが・・・


@ 仕様に見合ったテストをしているか?

 ここまで、TDDとYAGNIの原則で開発をしてきましたが、ちょっと立ち返りたいと思います。この開発方法で大切な「仕様」がちょっとおろそかになっている気がするからです。ここまでに出てきているオブジェクトの機能を仕様の面から一度整理したいと思います。



A 自機(プレイヤー)

 今の段階で決めている自機の主な仕様を列挙します。

自機仕様
○ 移動に関して
 ・ 空間は3次元座標で表現する。自機はXY平面上にあり、Y軸方向を向く。
 ・ 自機はコントローラで操作される。
 ・ 自機はXY平面を8方向に動く。
 ・ 1単位で動く距離は6で、どの方向にも等しい長さだけ動く。例えば左上の場合も、左上45度に6だけ動く。

○ ショット・ボム
 ・ ショットボタンを押すと、通常弾とサブウェポンを発射。
 ・ ボムボタンを押すとボムを発射。
 ・ 通常弾とサブウェポンはパワーアップアイテムにより5段階にパワーアップ。ボムは変化しない。

○ ロール
 ・ 左右に移動するときに、2/3度単位でロール。逆回しの時には、その時の角度から開始。これを「通常旋回」と呼ぶことにする。
 ・ 通常旋回は+20度及び-20度でストップ。このストップした状態を「ホールド」、その角度を「ホールド角度」と呼ぶことにする。
 ・ ホールドが1秒以上続いた段階で、逆方向に入れると12度単位で1回転し、入れた方向のホールド角度で固定。たとえば、+20度でホールドしている機体を右に旋回させると、最大-400度(1回転+40度)まで旋回してホールド。このホールドするまでの間を「急旋回」と呼ぶ。
 ・ 急旋回の最中はホールド角度に達するまで12度単位で高速旋回。
 ・ 急旋回してホールド状態になり、1秒以内に切り返しが起きた場合は、通常旋回。
 ・ 急旋回してホールド状態になり、1秒以上立てば、また急旋回状態。
 ・ 通常旋回および急旋回中にニュートラル(コントローラを入れていない)状態になった場合、3度単位でロール角度が今の角度から0度に戻る。

 細かく決めていますが、現在テストはこの仕様どおりに作成されていません。それはTDDとしてはまずいのです。そこで次の章でもう一度ToDoリストを整理して、不適切なテストはやり直すことにしました。



B 敵

 敵の仕様はまだ詳しくは決まっていませんが、TDD用に具体化するため、「Gardian」というザコ敵を設けましょう。Gardianは次のような仕様とします。

敵Gardian仕様
・ 空間は3次元座標で表現する。GardianはXY平面上にあり、Y軸方向を向く。
・ GardianはXY平面を任意の方向に動く。
・ 1単位で動く距離は3で、どの方向にも等しい長さだけ動く。
・ 上から出現して、120単位分下(Y軸と逆方向)に移動した後、180度回転して120単位上に自動で移動。
・ 出現して120単位で弾を自機に向けて1発発射。

 この仕様に沿った敵の動きをさせるテストを以降の章で作っていきます。



C 弾

 弾の実例として敵の通常弾の仕様を挙げます。

敵の通常弾
・ 通常弾は威力1。
・ 通常弾は1単位で距離3だけ移動する。
・ 弾は決められた方向に自動的に直進する。

弾の仕様は簡単ですね。これについても以降の章でテストから作成していきます。



D ステージ

 自機、敵、弾、当たり判定を管理するためには、それらを知っているステージが必要です。なるべく具体的な数字を挙げて、ステージを構成してみます。ステージ1の簡単な仕様は次のとおりです。

ステージ1仕様
・ ステージは横幅480、縦幅64000の配置マップを持つ。
・ ステージは横幅480、縦幅640のビューを上に1単位で2だけ移動させる(1Flipが60分の1秒だとすると、1秒で120移動する)。これは「タイムテーブル」となる。
・ ステージは自機を3機持つ。
・ 自機は常にビュー内にいる。初期の位置は(240, 100, 0)とする。
・ Gardianを(240, 1000, 0)、(400, 1010, 0)、(80, 1020, 0)に配置し、ビューに入ってきたら行動を開始させる事ができる。
・ ステージ上でのコントローラによる操作を自機に伝える。
・ 自機が発射した弾を動かす。
・ 敵が発射した弾を動かす。
・ 自機の弾が敵に当たったら、弾の威力分敵の耐久力を減らす。
・ 敵の弾が自機に当たったら、自機を1機減らす。

 ステージの仕事は非常に多岐に渡ります。上の仕様もまだ極一部に過ぎません。TDDでは変更は当たり前と考えるので、まずは上の仕様を満たす最小の実装をするだけです。しかし、かなり大変なのは間違いありません。クラス分割もあるでしょう。この段階ではまだ背景をどうするかなども考えていません。


E 弾を撃つ仕様

 前章までで弾を撃つことを色々と考え、何だか面倒なことになっていました。もっと単純に考えてみます。弾を撃つのは誰か?これは弾を持っているオブジェクトです。一方、弾を撃てと命令するのは誰か?これは誰が弾を撃つか知っているオブジェクト、つまりDまでの話からしてステージがそれを担います。弾の生成責任はやはり撃つ側にあるべきだろうと思います。生成された弾を動かし、またそれが当たったかどうかを判定するのは使う側の責任ですから、ステージが担当する事になります。

 他にも仕様はどんどん詳細になっていくでしょうが、今のところの仕様を元に、改めて現在の実装を改変していきたいと思います。