こんにちは!のりです。
ドラクエ10のアップデートバージョン3.2が出るそうです。今回は氷の世界が舞台ですね。新しく邪神の宮殿というダンジョンも追加されるようです。公式動画では、エスタークとダークドレアムが2体同時に出ていましたが、ダークドレアム1体に苦戦している私にはまだ無理ゲーのようです。何はともあれドラクエ10のアップデートは早くていいです。アップデート予定日は、12月24日(木)だそうです。
さて、今回はゲームプログラマーへの道の第6回目です。
前回は、大学2年生と大学3年生の間の春休みの1ヶ月間で、友人と2人で3Dアクションゲームを作ることになり、Xファイルを描画するところまで、2週間かかったという話を書きました。今回はその続きを書いていきます。
3週目の作業は、当たり判定(コリジョンとも呼ばれます。)です。その時点では、Xファイルで描画されたキャラクターが動くだけで、攻撃やジャンプもできなければ、壁などもありません。しかし、私は3Dゲームの当たり判定などの知識は一切なく、その頃はどうしていいか検討もつきませんでした。
一般的に3Dゲームの当たり判定は、球や円柱、直方体などの空間を作り、その空間同士が触れ合ったら、接触しているという判断しています。キャラクターを中心に見えない球を作り、キャラクター2体の互いの球が接触したら、アクションを起こしたり、壁に見えない直方体を作り、壁の直方体とキャラクターの球が接触したら、壁と認識してそれ以上移動できないようにするといった処理となります。
この処理には、基本的にベクトルや行列といった数学の知識を使うのですが、当時の私には、ベクトルや行列を使うという考えが全くありませんでした。
そこで、私の取った行動は、なんと二次関数を使ったのです。y=x+5などの中学生で習う数学です。また、二次関数だけでは、さすがに3Dゲームの当たり判定を作ることが難しかったので、三角関数も使いました。sin、cos、tanというやつですね。
二次関数と三角関数で当たり判定を取ることは、2Dゲームではよくあることです。2Dシューティングや2Dアクションを、大学2年の時に作ったため、その方法はすぐ思いつきました。
結局どうしたかというと、二次関数と三角関数による当たり判定を、XY軸とXZ軸で行い無理やり、3次元の当たり判定を行いました。それだけを聞くと、なんだそんなことかと思うかもしれませんが、問題はプログラムコードです。二次関数と三角関数の公式がびっしり書かれ、XY軸、XZ軸それぞれに対して計算するだけでなく、球や円柱や直方体の計算までを、全て数式で書いたのです。
ここまで、数式だらけだとこれはプログラムコードなのか?と疑問に思うレベルです。今の私が当時のプログラムコードを見たら、読みたくないですね。(笑)
その後、少し先になりますが、ベクトルと行列で当たり判定ができるということを知った時は、プログラムコードがものすごくすっきりして、シンプルなコードになり、感動しました。その時も、相変わらず、最初はベクトルと行列の数式を直接プログラムコードに書き連ねていましたが、その後、ベクトルと行列のライブラリを使えばいいと知ってさらに感動します。
また、3週目で作ったものは、当たり判定の他にもあり、キャラクターのジャンプや加速などの挙動です。
こちらは、物理の公式を使うことになります。重力加速度や等速運動、加速度運動などですね。また、数学の三角関数のsin波やcos波の動きなども動く床などに活用できます。キャラクターの挙動は、当たり判定に比べれば、そこまで難しいものではなく、意外と簡単に作ることができました。
また、3Dのステージ(背景物)も、Xファイルで友人に作ってもらい、そこに当たり判定を実装しました。
ここまでの3週間で、3Dのステージでキャラクターが動き、ジャンプやダッシュ、床や壁との当たり判定、キャラクター同士の当たり判定などを組み込みました。
ぱっと見は、ゲームとしてだいぶできてきたように思えます。
しかし、まだゲームとして成立していません。キャラクターを操作できるだけで、何をするゲームなのか分からない状態です。
果たして、残り1週間で遊べるゲームになるのでしょうか?
今回はここまでにして、次回に続きを書きたいと思います。
以上、ゲームプログラマーへの道6 ~大学時代のゲーム制作編 3Dゲームの当たり判定~ でした!