まず、ゲームのプログラムを解説する前に、自分が伝えたいことから書きたいと思います。
よく、ゲームのプログラムに数学が必要だといわれますが、
決して必須ではありません。しかし、あったほうがいいのは確かですけどね。
ただし、中学校程度まではプログラミング言語を習得する上では必須レベルです。
場合によっては、高校レベルの三角関数のみ、多少は理解しないといけません。
好ましいわけではないですけど、科学技術計算などとは異なり、
厳密に物理や数学にそっていなくても、実際にゲームとして出来上がっていれば、
悪い言い方をすれば、無理やりごまかして表現してもいいわけです。
ただし、あくまでも違和感を感じないとか、そういった条件は出てきますけどね。
逆に科学技術計算や一般的な事務処理と比較して、ゲームプログラムの方が、
重要とされる部分も存在します。それは処理速度です。
プレイヤー側の視点で考えてください。実行速度が遅いゲームになると、
処理落ちばかりしてレスポンスが悪いゲームになりますよね?
それをプレイしてどう思うでしょうか?とてもストレスになりやる気が無くなるでしょう。
それは、商品としてゲームを考えるには、あまりに致命的な欠陥となります。
また、一部のゲーム機のハードウェア環境は、浮動少数変数が使用できない場合もあります。
そんな環境の中では、数学の公式をそのまま利用することは不可能な場合もありますね。
可能な場合でも、負荷がかかり、実行速度を猛烈に遅くする場合もあります。
そこで、ゲームプログラム独特の手法が必要になる場合があります。
それは、数学の公式の計算結果を、あらかじめ配列データなどで用意して、
結果の数値を整数に変換して、利用するという工夫が必要になってきます。
例えば、厳密な距離を移動するためのアルゴリズムの場合には、
それぞれの角度に対しての移動量として、三角関数の値を整数化したテーブルを作成するということになります。
例えば移動量を5の単位の整数として、制御することにしましょう。
そして角度0度、10度、20度、30度までのテーブルの値を実際に求めて見ましょう。
X方向の移動量は三角関数余弦を用い公式"X=cos(θ)"で、
Y方向の移動量は三角関数正弦を用い公式"Y=sin(θ)"で求めます。
さらに、C言語の三角関数の単位はラジアンなので、この公式で角度を求めます。
"θ=(π×2)×(rad÷360)"でも、実際には数学の公式を当てはめるだけなので、
擬似整数を求めたい今ではこれは使わないですね。
そしてそれぞれの角度の値を求めて割り当てましょう。小数点第三位以下四捨五入にて。
cos(0)=1、cos(10)=0.98、cos(20)=0.93、cos(30)=0.87、
sin(0)=0、sin(10)=0.17、sin(20)=0.34、sin(30)=0.5と、以上になります。
そして、それぞれの値に対して5で乗算して、四捨五入して整数にします。
そうすると、角度0は(x=5,y=0)、角度10は(x=5,y=1)、角度20は(x=5,y=2)、角度30は(x=4,y=3)
という感じになりました。このデータを下に配列を作成しましょう。以下のようになります。
多次元配列の最初の次元要素が移動毎の移動量を表し、タイマーを使って参照させます。
その次の次元要素が座標系、最後の次元要素が角度を表します。
数値の割り振り方を平均的に振り分けている点に注目してください。
実際にこの配列を用いる処理の使い方については、次回で紹介いたします。
このやり方は、実際に制約の多い携帯アプリで現在公開している、
スペースストライカーにて、正確な移動制御による弾幕を制御したり、
花火を表示するスクリーンセーバーにて、使用しているプログラミング手法です。
static const int direct_tbl[][][]={
// X座標 Y座標
{+1,+1,+1,+1,+1},{+0,+0,+0,+0,+0}, // 0度
{+1,+1,+1,+1,+1},{+0,+0,+0,+0,+1}, // 10度
{+1,+1,+1,+1,+1},{+1,+0,+0,+0,+1}, // 20度
{+1,+0,+1,+1,+1},{+1,+0,+1,+0,+1}, // 30度
// このような手順で360-10度まで記述する
};