前回、作成した戦車から砲弾を発射させます。

スペースキーをおせば砲弾が発射されます。

次にTankクラスのShot()メソッドですが、Bulletオブジェクトをつくってリストのなかに格納しているだけです。

ではBulletクラスはどのようになっているのでしょうか?

砲弾は戦車の砲身の先からでてきます。砲身の先の座標は戦車が原点から動いていないのであれば(0,0.6,0.5)です。そこで戦車の位置を回転角度がわかれば砲身先の座標もわかります。砲弾の初期座標とX軸方向とZ軸方向の移動速度をコンストラクタ内で求めています。

それからBulletクラスのコンストラクタにはTank型の引数を渡します。砲弾がどの戦車から発射されたかわかるようにするためです。

初速がわかればMove()メソッドで発射後の砲弾の位置も計算できるようになります。また砲弾はどこまでも飛びません。重力の影響をうけます。やや水平ではなくやや上方に向けて発射しています。s = v0t – (1/2)gt^2の公式をつかって砲弾が着弾したらそれ以上は進まないようにしています。砲弾はだいたいフィールドの半分くらいまで飛びます(実際の戦車の射程はもっと長いと思うが・・・)。

物体を動かすのでタイマーを使います。

Tank.Bulletsのなかにオブジェクトがある場合は描画の処理をおこないます。