- お一人様レーシング(仮) - Ver0.01 技術資料 ○はじめに 本ドキュメントは、お一人様レーシング(仮)で使っている主要な技術について 概説したものである。具体的には、以下について述べる。 ・各種スケーリング ・二進角度 ・回転する見下ろし型画面 ・コース生成 ○各種スケーリング 技術ではないが、最初に本ゲームでのスケーリングパラメータについて述べる。 1秒は(処理速度が追い付けば)25フレームである。 また、マップ上の一単位は50cmであり、コースデータは50x50cmの地形を敷き詰める 形で作成されている。ただし、自車の座標はdouble型なので、 一単位より細かい動きが可能である。 タイム測定や時速のスケーリングは、これらの値を元に計算している。 ○2進角度 コースの回転表示や車の移動計算などで三角関数を多用する。 標準ライブラリ関数のものはかなり計算が重いため、高速な三角関数ライブラリを 実装している。 基本的な考え方は、テーブル化と2進角度(binary degree)である。 三角関数は、あらかじめ一度単位で計算した値を配列に格納し、 後で必要になった際には、角度を配列のインデックスとして参照する。 これにより、定数時間で三角関数の値を得ることができるが、 一度単位の精度しか得られない。 たとえば1/10度単位で計算しておく、といった方法で精度を上げられるが、 テーブルサイズの肥大化とのトレードオフとなる。 しかし、ゲームのように一定の精度で十分な場合は有効な手段である。 ただし、標準ライブラリ関数は角度の単位にラジアンを用いており、 角度の値を実数にする必要がある。全方位を360度とする度数法は テーブル化に向くが、任意の角度を0〜360度に正規化する場合などに 除算が必要となり、処理が重くなる。 ゲーム内の角度計算であれば通常の単位に執着する必要はないので、 全方位を2のべき乗数に等分する角度単位を採用することで、正規化などの 計算をビット演算で行うことができ、処理を軽くすることができる。 bin_deg.h, bin_deg.cで実装しているのが、この考え方に基づく 2進角度型と三角関数群である。全方位を1024に分割しているが、 車体の方向についてはより細かい単位を用いないと細かい方向転換が 実現できないため、より解像度の高い単位も併用している。 ○回転する見下ろし型画面 本ゲームでは車の位置・向きが固定のため、コースの方がスクロール・回転する。 コースデータは二次元配列上に格納されており、 ここから車の周囲のデータを読み出して一単位ずつ正方形を描画している。 単なるスクロールゲームなら車を中心とする一定範囲の矩形を読み出せばよいが、 このゲームでは回転するため、画面上の一行を描画するためには車の向きに従って、 配列上を斜めに読み出す必要がある。ナイーブには、回転しないとしたときの 描画範囲の各マス目に対して、回転後の座標を計算し、 その座標の内容を読み出せばよい。 しかしこの方法だと描画する正方形の数に比例して三角関数の計算が必要となる。 そこで、描画範囲の左上座標だけ三角関数により計算しておき、 あとは実数加算により斜めに舐めていくときの座標を計算している。 また、このコースデータは当たり判定マップとしても使用している。 車の座標の地形が路肩やコース外だった場合には、減速・停止処理を行う。 また、スタートラインやチェックポイントは それぞれ専用の値をデータ上に書き込んでおき、車がそれを踏むことにより 周回チェックを行えるようにしている。とくにチェックポイントは画面上は 視認できないが、実際はコースの一部に「チェックポイント1番」のような 地形が設定されており、順番に通過することで正しく周回しているか確認できるように なっている。 ○コース生成 二次元配列内にビットマップ方式でコースデータを用意できれば、 上記の表示システムが使用できる。したがって、たとえばグラフィックツールで 描いたコース画像を読み込み、コースデータに変換する方法も考えられる。 しかし、考えたコースをグラフィックツールで正確に描くのも手間がかかるし、 チェックポイントなどシステムが利用する情報を画像データ内に色情報などの 形で埋め込まなければならない。また、将来的にライバル車のAIを作成したり、 コースの壁で適切な跳ね返りを行ったりするには、単なるビットマップではなく コース形状のベクトルデータがあった方が都合が良い。 そこで、ベクトル型のコースデータを用意し、そこからビットマップ型の データを自動生成するようにした。具体的には、座標をいくつか指定するだけで、 それらを順に繋いだコースを生成する。また、各座標にカーブの曲率を指定することで、 座標間を繋ぐ際に様々な大きさのカーブを作れるようにした。 さらにチェックポイントやスタートラインについても、座標に対して指定することで、 自動的にビットマップ型データ中に展開するようにした。