企業や研究でのプログラム開発では、開発の効率化やバグ等を減らすため同じような処理は関数等にまとめて、ライブラリ化する事が良く行われます。そこで今回はゲーム開発を題材にライブラリ開発の意義や方法について学びます。Engineを使用して、ライブラリの使用と開発の両方を経験する事によって、使いやすいライブラリや開発やメンテナンスしやすいライブラリはどのようなものかを実際に作る事で考えてもらいます。†ODEはこのゲームライブラリがベースにしているオープンソースの物理シミュレーションライブラリです。正確な物理シミュレーションより速度を重視した設計でゲーム用途に向いています。今回はスクリプトファイルを実行する事で、自動的にインストールされます。ODEは物理シミュレーションを行う部分と表示を行う部分に分かれています。表示プログラムは自分でOpenGL等を用いて作成することも可能ですが、ODEにはあらかじめdrawstuffという簡易的な表示ライブラリが付属しています。内部でOpenGLを用いていますが、特に意識する必要はありません。スクリプトによりODEの解凍、コンパイル、インストールと今回の課題のサンプルプログラムのコンパイルとインストールが行われます。Linuxにて動作確認しています。OSXや最新のlinuxで行いたい場合は以下のファイルをダウンロードしてインストールして下さい。スクリプトによりODEの解凍、コンパイル、インストールと今回の課題のサンプルプログラムのコンパイルとインストールが行われます。ODEの最新版を使っています。Linuxの場合と同じコマンドを実行しますが、ODEをコンパイルするためには予めMacPorts?やHomeBrew?等を用いて、freeglut等のOpenGL関係のライブラリをインストールしておく必要があります。./start.shでやってみる。†インストールしたライブラリ等の解説は次のページに詳しく書いてあります。gamelibの解説ライブラリの開発方法を次のページにまとめています。今回のサンプルプログラムでは、start.shやexec.sh、Makefileを使うことで、これらを意識せずに簡単にライブラリとアプリケーションをコンパイルできます。./exec.shのコマンドを打ってから実行しましょう。弾を撃って当てるとhit_pointが減少し、0になると消滅します。Clearが表示され、ゲームが終了されます。Overが表示され、ゲームが終了されます。全てのファイルをエディタで見てみよう。application/shooting_gameディレクトリ内にはゲームアプリケーションのソースコードが入っています。ゲームアプリケーションはライブラリを使用して具体的なゲームを構成します。src/gamelibにはライブラリのソースコードが入っています。中身を確認してください。main.cに、drawstuffによるシミュレーション管理のための構造体や関数が書かれており。shooting_game.cに、実際のゲームのロジックが書かれています。様々なアプリケーションを作成する事を可能にするのがライブラリ開発の醍醐味です。マップの変更はその1つなので、まず始めに挑戦してみてください。現在のマップは下図のようになっています。3×3のブロックに、マップ要素が配置されています。3はマップの大きさを定義しています。今、3×3のサイズになっていますので、これを4×4に変更してみましょう。start()という関数があり、ゲーム環境の初期化を行っています。そこにマップを構成するための関数が書かれているので、関数を修正してマップを変更してみましょう。map_y)に行き止まりの通路(壁)を生成する関数です。directionは行き止まりの方向を決めます。同様に,他のmake_*_walls関数も通路(壁)を生成する関数です。現状だと3×3のサイズになっていますので、4×4のサイズを埋めるように関数を追加して、マップを構成してください。../../lib/までを#でコメントアウトしてください。gamelib/に書き換えてください。†マップに関するライブラリのヘッダファイルはinclude/gamelib/map.hです。マップ関数を追加したいときはこのヘッダファイルにその関数を宣言してください。マップに関するライブラリのソースコードはsrc/gamelib/map.cです。追加したいマップ関数の中身をここに書き加えてください。マップライブラリの関数では、どのような壁の配置にするかを設定した後に、make_wall関数により実際に壁を生成します。);引数はそれぞれ、壁の中心座標、壁の方向を示す座標、壁の長さ、物体情報です。この物体情報は実質的にはWallData?構造体になっており、物体のIDや壁を固定するためのジョイントのIDが格納されています。†ODEでは、動力学計算と衝突検出計算が独立に実装されています。動力学計算の対象は、ワールド内にボディ(剛体)として生成されます。衝突検出計算の対象は、スペース内にジオメトリ(形状)として生成されます。最終的に、ボディとジオメトリの対応付けをすることで、物体を生成することができます。make_wall関数での物体の生成法を解説します。world);ボディをワールドworld内に生成し、ボディIDを返します。lz)のボックスとして設定します。newmass);質量パラメータmassの質量がnewmassになるように設定します。bodyに上記の質量パラメータmassに設定します。az)まわりにangleラジアン回転したときのクオータニオンqを求めます。bodyをクオータニオンqに従って回転させます。dJointGroupID);ワールドworld内にジョイントを生成して、そのジョイントIDを返します。jointを取り付けます。jointを固定します。lz)のボックスを生成し、そのジオメトリIDを返します。bodyを対応付けます。†マップに関するライブラリを書き換え、ゲームシステムを更新し、をれを反映したアプリケーションを作ってください。自分なりのアイディアを実現して良いですが、思いつかなければ(例)の一つを実現してください。†サンプルコードにバグがある可能性や、課題が分かりづらい等の問題点がある可能性もあります。何か気がついた事があれば担当教員やTAに連絡をお願いします。適宜コメントを入れたり、関数化したりして、他人にもわかりやすいプログラムになるように心がけてください。コメントのないものは減点します。他人のプログラムを写したことが判明した場合は、両者とも0点になります。課題内容に対応していないプログラムには点をつけられません。第7回(5/31)の講義中に課題プログラムのコンパイルと実行を正しくできるかを提出者の環境で確認します。下記の提出物を第7回講義日(5/31)24:00までにCLEで提出してください。提出物一式を入れるフォルダの名前は学生番号(ログインIDではない!)にし、zipファイルに圧縮してください。