担当の森が開発した簡易的なゲームライブラリとアプリケーションのプログラムです。統一されたシステムをベースにした柔軟なゲーム開発が可能になります(はず...)。ゲームシステム(ヒットポイント管理、ゲームクリア・オーバー条件、ステージマップ管理、敵キャラ行動プログラム)等はライブラリに任せ、具体的なステージ構成はアプリケーション側にプログラムしましょう。使用する関数やパラメータ等を変更する事で実現します。ライブラリに任せる部分とアプリケーションに任せる部分を切り分けてプログラムする設計が重要です。次にライブラリを本格的に変更して独自のゲームシステムを構築しましょう。†ODEはこのゲームライブラリがベースにしているオープンソースの物理シミュレーションライブラリです。正確な物理シミュレーションより速度を重視した設計でゲーム用途に向いています。今回はスクリプトファイルを実行する事で、自動的にインストールされます。ODEは物理シミュレーションを行う部分と表示を行う部分に分かれています。表示プログラムは自分でOpenGL等を用いて作成することも可能ですが、ODEには予めdrawstuffという簡易的な表示ライブラリが付属しています。内部でOpenGLを用いてますが、特に意識する事はありません。今回の課題のサンプルプログラムのコンパイルとインストールが行われます。OSXや最新のlinuxで行いたい場合は以下のファイルをダウンロードしてください。jeap-res.ams.eng.osaka-u.ac.jp/~hiroki/AdvancedPrograming2012_gamelib_ode-0.12_20120515.tar.gzODEの最新版を使っています。上記と同じコマンドを実行しますが、ODEをコンパイルするためには予めMacPorts?やyum,apt-get等を用いて、freeglut等のOpenGL関係のライブラリをインストールしておく必要があります。大規模なプログラム開発では、デバッグの容易さやコンパイル時間の短縮のために、プログラムの要素毎にファイルを作成し、それぞれ分割コンパイルを行い、最後に結合します。複数のアプリケーションプログラムから呼び出して使用します。コンパイルする際に一々コマンドを入力するのは面倒なので、makeによってコンパイルを自動化します。以下では、大規模なプログラム開発で常識的に行われている以上の3点について解説します。(例ではコンパイルのためにgccを使っていますが、gamelibではodeを使用する関係でC++のコンパイラが必要なため、g++を用いてコンパイルしています。以下の.cファイルがあるとします。main.cfunc.c以上のファイルの中にはただ一つmain関数があるものとします。"-c"オプションをつけてコンパイルします。-c"により.oファイルが生成されました。最後に以下のように実行ファイルを生成します。func.oただし、"-o"オプションは実行ファイルの名前を指定しています。十分に構造を設計しておく事でバグの発生を防ぐ狙いがあります。試しに普段使用しているコンピュータで使われている共有ライブラリを以下のコマンドで見てみましょう。効率の良いプログラム開発ができ、アプリケーションプログラムのアイディア実現に集中する事ができます。Xの場合、共有ライブラリのファイルは"lib"で始まり.dylibで終わる事になっており今回はlibfunc.dylibを作成するものとします。以下の.cファイルがあるとします。func1.cfunc2.c以上のファイルの中にはmain関数があってはいけません。"-c"オプションをつけてコンパイルします。-c"により.oファイルが生成されました。最後に以下のように共有ファイルを作成します。libfunc.dylibただし、"-o"オプションは共有ファイルの名前を指定している。linuxの例linuxの場合、共有ライブラリのファイルは"lib"で始まり.soで終わる事になっており今回はlibfunc.soを作成するものとします。以下の.cファイルがあるとします。func1.cfunc2.c以上のファイルの中にはmain関数があってはいけません。"-c"オプションをつけてコンパイルします。-c"により.oファイルが生成されました。最後に以下のように共有ファイルを作成します。libfunc.soただし、"-o"オプションは共有ファイルの名前を指定しています。共有ライブラリを使用するためにはコンパイラにオプションを渡す必要があります。リンクするライブラリを指定するオプション。X)のようになっているが、??の部分のみ記述します。適切に設定する必要があります。本ライブラリでは"/usr/local/lib"等、通常システム用のディレクトリにインストールされるライブラリがユーザ領域にインストールされる設計になっています。Xの場合はDYLD_LIBRARY_PATH)を実行環境に合わせて設定し直す必要があります。そのため以下のような記述をexec.shに自動的に書き込むようにスクリプトを作っていますので、exec.shを通して完成したプログラウを実行する事ができます。具体的なゲームアプリケーションはここに作成します。shooting_gameディレクトリにサンプルとなる以下の基本ファイルが保存されています。†include/gamelib/gamelibのヘッダファイルのディレクトリです。以下のファイルが含まれています。Engine(ODE)のヘッダファイルのディレクトリです。include/drawstuff/ODEに付属しているODEを簡易に実行し、表示する環境のヘッダファイルのディレクトリです。†ソースファイルのディレクトリです。ODEのソースコードの圧縮ファイルを解凍すると現れるディレクトリです。物理シミュレーション、衝突判定、表示や操作のためのライブラリ等がおさめられています。MAKEスクリプトを実行する事で自動的にコンパイルとインストールが行われます。本ライブラリの本体のソースコードが保存されています。以下のファイルが存在します。†Makefilemakeを行う際の情報を書き込む。drawstuffのバージョンを登録する。//物理シミュレーション開始時に実行される関数(start)を登録する。&simLoop;//各ステップ毎に実行される関数(simLoop)を登録する。&command;//キーボードのキーが押された時に実行される関数(command)を登録する。&stop;//シミュレーション終了時に実行される関数(stop)を登録する。"./textures/";//テクスチャの画像ファイルを保存しているディレクトリの場所(./textures)を登録する。演習室PCでは遅くなる場合に試してみて下さい。ステージ定義等を記述するファイルapplication/shooting_game/shooting_game.capplication/shooting_game/shooting_game.hODEを簡易に実行するdrawstuffに登録するコールバック関数を定義します。定義された関数はmain関数の中で登録している。//物理シミュレーション開始時に一度だけ呼び出される関数。gamelibの初期化。//セルフエージェントを初期化。構造体のデータはself_agent.hで定義されており、隠蔽されている。);キーボードからの入力を受け付ける。†ゲームシステム全体を管理する関数を記述するファイルinclude/gamelib/gamelib.hsrc/gamelib/gamelib.c自機エージェント構造体定義と関数を記述するファイルinclude/gamelib/self_agent.hsrc/gamelib/self_agent.c敵エージェント構造体定義と関数を記述するファイルinclude/gamelib/enemy_agent.hsrc/gamelib/enemy_agent.cゲームマップの構造体定義と関数を記述するファイルinclude/gamelib/game_map.hsrc/gamelib/game_map.cインタラクションのための関数を記述するファイルinclude/gamelib/interaction.hsrc/gamelib/interaction.c自機と敵、弾と敵がぶつかった時の処理プログラム。