企業や研究でのプログラム開発では、開発の効率化やバグ等を減らすため
同じような処理は関数等にまとめて、ライブラリ化する事が良く行われます。
そこで今回はゲーム開発を題材にライブラリ開発の意義や方法について学びます。
ライブラリを開発するのにも別のライブラリを使用することは良く行われます.
今回の課題では、3次元物理シミュレータとしてOpen Dynamics Engineを使用して、
ライブラリの使用と開発の両方を経験する事によって、使いやすいライブラリや
開発やメンテナンスしやすいライブラリはどのようなものかを実際に作る事で考えてもらいます。
楽しいゲームを開発しやすくするゲームライブラリの開発
ODEはこのゲームライブラリがベースにしているオープンソースの物理シミュレーションライブラリです。
正確な物理シミュレーションより速度を重視した設計でゲーム用途に向いています。
今回はスクリプトファイルを実行する事で、自動的にインストールされます。
ODEは物理シミュレーションを行う部分と表示を行う部分に分かれています。
表示プログラムは自分でOpenGL等を用いて作成することも可能ですが、
ODEにはあらかじめdrawstuffという簡易的な表示ライブラリが付属しています。
内部でOpenGLを用いていますが、特に意識する必要はありません。
適当なディレクトリに移動して,以下のコマンドを実行します.
$ wget www.er.ams.eng.osaka-u.ac.jp/kawai/AP2017/ap2017_gamelib_linux_20170409.zip $ unzip ap2017_gamelib_linux_20170409.zip $ cd ap2017_gamelib_linux_20170409 $ ./start.sh
./start.sh スクリプトによりODEの解凍、コンパイル、インストールと
今回の課題のサンプルプログラムのコンパイルとインストールが行われます。
こちらからでもダウンロードできます(演習室 VineLinux? 用)。
演習室のVine Linuxにて動作確認しています。
Mac OSXや最新のlinuxで行いたい場合は以下のファイルをダウンロードしてインストールして下さい。
$ wget www.er.ams.eng.osaka-u.ac.jp/kawai/AP2017/ap2015_gamelib_mac_20150328.zip $ unzip ap2015_gamelib_mac_20150328.zip $ cd ap2015_gamelib_mac_20150328 $ ./start.sh
./start.sh スクリプトによりODEの解凍、コンパイル、インストールと
今回の課題のサンプルプログラムのコンパイルとインストールが行われます。
ODEの最新版を使っています。
Linuxの場合と同じコマンドを実行しますが、
ODEをコンパイルするためには予めMacPorts?やHomeBrew?等を用いて、
freeglut等のOpenGL関係のライブラリをインストールしておく必要があります。
(最新のODEは演習室の環境でコンパイルできず、古いODEはOSXで動作しません)
こちらからでもダウンロードできます(MacOS X 用)。
$ chmod 777 ./start.sh
でやってみる。
インストールしたライブラリ等の解説は次のページに詳しく書いてあります。
gamelibの解説
ライブラリの開発方法を次のページにまとめています。
ただし、今回のサンプルプログラムでは、start.shやexec.sh、Makefileを使うことで、
これらを意識せずに簡単にライブラリとアプリケーションをコンパイルできます。
ライブラリ開発方法
以下のディレクトリにはODEが解凍されています
src/ode-0.11.1 # または src/ode-0.13(最新ODEバージョン)
$ cd src/ode-0.11.1/ode/demo/ # または、src/ode-0.13/ode/demo/ $ ./demo_crash
$ cd bin $ ./exec.sh ./shooting_game
$ cd application/shooting_game $ ./exec.sh ./shooting_game
許可がないと怒られた場合は
$ chmod 777 ./exec.sh
のコマンドを打ってから実行しましょう。
サンプルプログラムでは、敵(enemy_agent)がランダムに動いており、
弾を撃って当てるとhit_pointが減少し、0になると消滅します。
全ての敵が消滅するとGame Clearが表示され、ゲームが終了されます。
自機(self_agent)と敵の本体が接触すると、
自機のhitpointが減少し、0になるとGame Overが表示され、ゲームが終了されます。
d: 前進 s: 後進 f: 右平行移動 a: 左平行移動 e: 右旋回 w: 左旋回 g: ジャンプ l: 弾を撃ち出す v: 視点切り替え(一人称視点と三人称視点.ゲームによってはどちらかに固定した方がよいかも) u: 敵キャラ 消滅/生成 (最終的なゲームでは無意味なので削除すべきだが、動作確認のため実装) h: 強制終了
application/shooting_game
ディレクトリ内にはゲームアプリケーションのソースコードが入っています。
ゲームアプリケーションはライブラリを使用して具体的なゲームを構成します。
src/gamelib
にはライブラリのソースコードが入っています。
アプリケーションとライブラリのディレクトリ内にあるファイルを全てエディタで開いて、
中身を確認してください。
main.c
に、drawstuffによるシミュレーション管理のための構造体や関数が書かれており。
shooting_game.c
に、実際のゲームのロジックが書かれています。
基本的な処理を行う関数を作成し、必要に応じて引数や組み合わせを変更して、
様々なアプリケーションを作成する事を可能にするのがライブラリ開発の醍醐味です。
マップの変更はその1つなので、まず始めに挑戦してみてください。
現在のマップは下図のようになっています。
3×3のブロックに、マップ要素が配置されています。
map.hの
#define MAP_X_SIZE 3 #define MAP_Y_SIZE 3
はマップの大きさを定義しています。
今、3×3のサイズになっていますので、これを4×4に変更してみましょう。
shootint_game.c には
void start()
という関数があり、ゲーム環境の初期化を行っています。
そこにマップを構成するための関数が書かれているので、関数を修正してマップを変更してみましょう。
int make_dead_end_walls(int map_x, int map_y, enum DIRECTION direction)
は,MAP_*_SIZEで定義されたマップの座標(map_x, map_y)に行き止まりの通路(壁)を生成する関数です。
directionは行き止まりの方向を決めます。
同様に,他のmake_*_walls関数も通路(壁)を生成する関数です。
現状だと3×3のサイズになっていますので、4×4のサイズを埋めるように関数を追加して、マップを構成してください。
コンパイルには
$ ./start.sh
をすればよいのですが、改めてODEをインストールする必要はないので、
start.sh
中の
tar zxvf ode-${ODE_VERSION}.tar.gz
から、
cp drawstuff/src/.libs/libdrawstuff.* ../../lib/
までを#でコメントアウトしてください。 それと、その下の
cd ../gamelib/
を
cd gamelib/
に書き換えてください。
マップに関するライブラリを書き換え、ゲームシステムを更新し、をれを反映したアプリケーションを作ってください。
自分なりのアイディアを実現して良いですが、思いつかなければ(例)の一つを実現してください。