*目次 [#y067346b]
#contents

* gamelibとは何か [#s556f7a3]
2012年度のアドバンストプログラミングに向けて、
~
担当の森が開発した簡易的なゲームライブラリとアプリケーションのプログラムです。
~
ライブラリとアプリケーションを分ける事で、
~
統一されたシステムをベースにした柔軟なゲーム開発が可能になります(はず…)。
~
ゲームシステム(ヒットポイント管理、ゲームクリア・オーバー条件、ステージマップ管理、敵キャラ行動プログラム)等は
~
ライブラリに任せ、具体的なステージ構成はアプリケーション側にプログラムしましょう。
~
難易度の異なる複数のステージを作ったりする際には、ライブラリで構築した関数や構造体を使い、
~
使用する関数やパラメータ等を変更する事で実現します。
~
ライブラリに任せる部分とアプリケーションに任せる部分を切り分けてプログラムする設計が重要です。
~
最初は提供されているライブラリやアプリケーションのプログラムを修正する事で課題を達成し、
~
次にライブラリを本格的に変更して独自のゲームシステムを構築しましょう。

* Open Dynamics Engine (ODE)について [#tdb9b966]
ODEはこのゲームライブラリがベースにしている
~
オープンソースの物理シミュレーションライブラリです。
~
正確な物理シミュレーションより速度を重視した設計でゲーム用途に向いています。
~
今回はスクリプトファイルを実行する事で、自動的にインストールされます。

ODEは物理シミュレーションを行う部分と表示を行う部分に分かれています。
~
表示プログラムは自分でOpenGL等を用いて作成することも可能ですが、
~
ODEには予めdrawstuffという簡易的な表示ライブラリが付属しています。
~
内部でOpenGLを用いてますが、特に意識する事はありません。


* 開発方法 [#sa09ce3d]

大規模なプログラム開発では、デバッグの容易さやコンパイル時間の短縮のために、
~
プログラムの要素毎にファイルを作成し、それぞれ分割コンパイルを行い、最後に結合します。
~
また、頻繁に使用する関数等は共有ライブラリとしてまとめ、
~
複数のアプリケーションプログラムから呼び出して使用します。
~
さらに、コンパイルする際に一々コマンドを入力するのは面倒なので、
~
makeによってコンパイルを自動化します。

以下では、大規模なプログラム開発で常識的に行われている以上の3点について解説します。

**分割コンパイル [#uc776c7f]
一つのアプリケーションプログラムを開発するために
~
複数のファイルでプログラムソースを管理し、それぞれを別々にコンパイルして、
~
最後に結合します。
~
- 分割コンパイル例

以下の.cファイルがあるとします。
 main.c
 func.c
以上のファイルの中にはただ一つmain関数があるものとします。

まず、ぞれぞれを"-c"オプションをつけてコンパイルします。
 $ gcc -c main.c
 $ gcc -c func.c
 $ ls
 main.o func.o
"gcc -c"により.oファイルが生成されました。
最後に以下のように実行ファイルを生成します。
 $ gcc -o test_func main.o func.o
ただし、"-o"オプションは実行ファイルの名前を指定しています。


** 共有ライブラリ開発 [#se80496f]
ライブラリを用意する事、はアプリケーションプログラムで頻繁に使用する関数等を予め開発して、
~
アプリケーション開発時に何度も同じプログラムを開発する手間を省いたり、
~
予め十分に構造を設計しておく事でバグの発生を防ぐ狙いがあります。
~
試しに普段使用しているコンピュータで使われている共有ライブラリを以下のコマンドで見てみましょう。
 $ ls /usr/lib
 $ ls /usr/local/lib
アプリケーションプログラム開発時には、そのライブラリの思想を十分汲み取る事で、
~
効率の良いプログラム開発ができ、アプリケーションプログラムのアイディア実現に集中する事ができます。

- MacOS Xの例

MacOS Xの場合、共有ライブラリのファイルは"lib"で始まり.dylibで終わる事になっており
~
今回はlibfunc.dylibを作成するものとします。
~
まず、以下の.cファイルがあるとします。
 func1.c
 func2.c
以上のファイルの中にはmain関数があってはいけません。

まず、ぞれぞれを"-c"オプションをつけてコンパイルします。
 $ gcc -c func1.c
 $ gcc -c func2.c
 $ ls
 main.o func.o
"gcc -c"により.oファイルが生成されました。
最後に以下のように共有ファイルを作成します。
 $ gcc -dynamiclib -o libfunc.dylib func1.o func2.o
 $ ls
 func1.c func1.o func2.c func2.o libfunc.dylib
ただし、"-o"オプションは共有ファイルの名前を指定している。

- linuxの例

linuxの場合、共有ライブラリのファイルは"lib"で始まり.soで終わる事になっており
~
今回はlibfunc.soを作成するものとします。
~
まず、以下の.cファイルがあるとします。
 func1.c
 func2.c
以上のファイルの中にはmain関数があってはいけません。

まず、ぞれぞれを"-c"オプションをつけてコンパイルします。
 $ gcc -c func1.c
 $ gcc -c func2.c
 $ ls
 main.o func.o
"gcc -c"により.oファイルが生成されました。
最後に以下のように共有ファイルを作成します。
 $ gcc -shared -o libfunc.so func1.o func2.o
 $ ls
 func1.c func1.o func2.c func2.o libfunc.so
ただし、"-o"オプションは共有ファイルの名前を指定している。

** 共有ライブラリの使用方法 [#l5ca86a5]

** makeによるコンパイルの自動化 [#s5ab3edc]



* gamelibのディレクトリ構造 [#ic9a84e2]
** application [#e02faab1]
具体的なゲームアプリケーションはここに作成します。
~
shooting_gameディレクトリにサンプルとなる以下の基本ファイルが保存されています。
~
 main.c
 shooting_game.c
 shooting_game.h
 Makefile
 exec.sh


** include [#w7fb3b1b]
- include/gamelib/

gamelibのヘッダファイルのディレクトリです。
以下のファイルが含まれています。
 gamelib.h
 game_map.h
 self_agent.h
 enemy_agent.h
 interaction.h


- include/ode/

Open Dynamics Engine(ODE)のヘッダファイルのディレクトリです。

- include/drawstuff/

ODEに付属しているODEを簡易に実行し、表示する環境のヘッダファイルのディレクトリです。

~

** src [#zf884f51]
ソースファイルのディレクトリです。
- src/ode-0.12/ あるいは src/ode-0.11.1/
- src/gamelib/


* プログラム説明 [#afb835ca]
** アプリーケーションソースコード [#ode9390b]
- Makefile

makeを行う際の情報を書き込む。

- メイン関数を記述するファイル
 application/shooting_game/main.c

--drawstuffへの関数等の登録
 dsFunctions fn; // drawstuffに登録する情報を格納する構造体を宣言
 fn.version = DS_VERSION; // drawstuffのバージョンを登録する。
 fn.start = &start; //物理シミュレーション開始時に実行される関数(start)を登録する。
 fn.step = &simLoop;//各ステップ毎に実行される関数(simLoop)を登録する。
 fn.command = &command;//キーボードのキーが押された時に実行される関数(command)を登録する。
 fn.stop = &stop;//シミュレーション終了時に実行される関数(stop)を登録する。
 fn.path_to_textures = "./textures/";//テクスチャの画像ファイルを保存しているディレクトリの場所(./textures)を登録する。
-- ODEによる物理シミュレーションの実行
 dInitODE2(0); // ODEの初期化
 dsSimulationLoop (argc,argv,600,500,&fn); //物理シミュレーション開始
 dCloseODE(); // ODEの修了処理


- ステージ定義等を記述するファイル
 application/shooting_game/shooting_game.c
 application/shooting_game/shooting_game.h
ODEを簡易に実行するdrawstuffに登録するコールバック関数を定義する。
~
定義された関数はmain関数の中で登録している。



**ライブラリソースコード [#rb97bf25]
- ゲームシステム全体を管理する関数を記述するファイル
 include/gamelib/gamelib.h
 src/gamelib/gamelib.c

- 自機エージェント構造体定義と関数を記述するファイル
 include/gamelib/self_agent.h
 src/gamelib/self_agent.c


- 敵エージェント構造体定義と関数を記述するファイル
 include/gamelib/enemy_agent.h
 src/gamelib/enemy_agent.c


- ゲームマップの構造体定義と関数を記述するファイル
 include/gamelib/game_map.h
 src/gamelib/game_map.c


- インタラクションのための関数を記述するファイル
 include/gamelib/interaction.h
 src/gamelib/interaction.c
自機と敵、弾と敵がぶつかった時の処理プログラム。

*参考になる情報 [#v3647a89]
-公式ホームページ http://www.ode.org/

-demura.net: ロボットの開発と教育 http://demura.net/ode
~
金沢工業大学の出村先生のページ
~
非常に分かりやすい解説

-簡単!実践!ロボットシミュレーション - Open Dynamics Engineによるロボットプログラミング
~
http://www.amazon.co.jp/dp/4627846916
~
出村先生が執筆されたODEの解説本

-『Open Dynamics Engine(ODE)』のオリジナルマニュアル
~
http://www.koj-m.sakura.ne.jp/ode/
~
大阪大学の松下先生のページ

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS