9 月 06 2008
PV3Dでレースゲーム制作 13 - 周回カウント作成
ちょっとでも遊べる要素をまず作ろう、ということで、タイムアタック機能を実装してみたいと思います。
タイムを計測するには正しく周回をカウントしないといけなく、カウントするにはそのためのロジックが必要、と。結構長くなりそうなので、3回くらいに分けて書きます。(またしてもデモはしばらくお預けの予感…!)
周回の判定
まず最初は周回をカウントする方法について。
プレイヤーが逆走したり、途中で折り返してきても正しく判定できるようにするには、やっぱりチェックポイントを順走 or 逆走のどちらで通過したのかを、調べてやるのが手っ取り早そうです。
今作っているコースのように輪っか状に閉じたコースなら、チェックポイントはスタート(ゴール)地点に一カ所、コースを横切るように設置しておけばコトは足ります。そこを順走で通過したら1周カウント、というわけです。
でもこれだとチェックポイント上を往復しているだけでどんどんカウントされてしまいます。そこで、たとえば初期状態が「0」のカウンタを用意して、
◆ 「0」のまま順走通過したら1周したことにする。
◆ 逆走通過したらカウンタを「-1」減らす。
◆ 「0」以外の状態で順走通過したら「+1」増やす。
…という処理をしてあげれば、ちゃんと1周してこないとカウントされないし、ひねくれたプレイヤーが何周も逆走した場合には、その分何周も順走しないと次の周回に進めないようになります。
結局私はコースの中間地点にもチェックポイントを作って、2カ所で判定することにしましたが、基本的な考え方は同じです。チェックポイントを増やしたのは、セクションとかあった方がサーキットっぽくね?と思ったからです(笑)。
順走/逆走通過の判定
やりかたはいろいろありそうですが、私の場合は路面判定のときと同様、コースデータを記録した画像を使ってやっていこうと思います。
画像をもとに巨大な配列を作って、車の座標から今どういうエリアにいるのか割り出す方法です。(→割り出し方の具体例はこちらのエントリ)
2枚の接するエリアを作れば、その境界を順走/逆走通過したかを調べることができます。
具体的には、たとえば2つのエリアをそれぞれA、Bとしたとすると、
◆ A上にいるときは、変数に「1」を代入する。
◆ B上にいるときは、変数に「2」を代入する。
◆ それ以外の場所では、変数に「0」を代入する。
とした上で、
◆ A上にいるとき、もし代入前に変数が「2」だったら、逆走している。
◆ B上にいるとき、もし代入前に変数が「1」だったら、順走している。
というふうに判定できるわけです。
つづく。