Rally-Xは敵の追尾を振り切るために煙幕(スモークスクリーン)が使えます。スモークスクリーンがある場所をレッドカーは通過することができません。

ラリーX – Wikipediaによると、

マイカーは、基本的に攻撃方法は無く、レッドカーから逃げるしかないが、ボタンで煙幕(スモークスクリーン)を発生させ、レッドカーを一定時間足止めすることができる。ただし足止めされたレッドカーにも当たり判定は残っているため、使い方を誤ると逆に追い込まれることもある。

とあります。今回はスモークスクリーンを発生させ追尾を妨害します。

最初にスモークスクリーンを描画する位置を管理するクラスを作成します。スペースキーが押されたときにマイカーが存在する位置に生成すればいいのですが、マイカーの後ろではなく前に発生するのはおかしいので、マイカーの方向で場所を調整しています。

スモークスクリーンは時間が経過すると消滅します。3秒後に消滅するようにしています(実際はもっと長かったような気が・・・)。

スモークスクリーンはスペースキーを押すと発生します。スモークスクリーンを発生させるメソッドとそれらを格納するリストを示します。

発生させたスモークスクリーンのなかで寿命が尽きていないものを描画するのであればDrawSmokes()メソッドを呼び出せばいいのですが、実際に描画するためにはテクスチャをつくる必要があります。

以下はスモークスクリーンのテクスチャを生成するためのメソッドです。スモークスクリーンのビットマップイメージは背景を赤で塗りつぶしていますが、この部分は道路と同じ色にしなければなりません。

GetSmokeTexture()メソッドはGlControlがロードされたときに呼び出します。

実際にスモークスクリーンを描画します。

さてスモークスクリーンを生成するとその場所をレッドカーは通ることはできません。スモークスクリーンがある場所を通れなくするためにはRedCarクラスからSmokesが見えるようにする必要があります。そこで静的メソッド GetSmoles()を作成しました。Smokesの内容が改ざんされないようにコピーを返します。

レッドカーはスモークスクリーンに接触するとスピンします。そこでスピンしている時間とそのときの回転角度を管理するプロパティを作成します。

既存のMoveCar()メソッドにスモークスクリーンに接触したときの処理を追加します。移動しようとした場所にスモークスクリーンがあるときは0.5秒間、その場でスピンさせます。そしてスピンが終わったときの進行方向を逆方向にセットします。

次回の呼び出しでSpinTimeプロパティが0よりも大きいときは、Timer.Tickイベント1回につき60度回転させ、SpinTimeプロパティを60ミリ秒分減らします。

レッドカーが進行できる方向を取得するメソッドです。原則的にこれまで来た道を引き返す動きはしませんが、袋小路に入ったときに出られるようにしています。

レッドカーを描画する既存のメソッドDrawRedCars()を修正しています。スピンしているときの処理を追加しています。

ミス時とクリア時はスモークスクリーンをクリアします。