目次

gamelibとは何か

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

Open Dynamics Engine (ODE)について

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

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

サンプルコードのインストール

適当なディレクトリに移動して,以下のコマンドを実行します.

$ wget jeap-res.ams.eng.osaka-u.ac.jp/~hiroki/AdvancedPrograming2012_gamelib_ode-0.11.1_20120516.tar.gz
$ tar zxvf AdvancedPrograming2012_gamelib_ode-0.11.1_20120516.tar.gz
$ cd AdvancedPrograming2012_gamelib_ode-0.11.1_20120516
$ ./MAKE

./MAKE スクリプトによりODEの解凍、コンパイル、インストールと 今回の課題のサンプルプログラムのコンパイルとインストールが行われます。
サンプルプログラム(演習室 VineLinux? 用)へのリンク http://jeap-res.ams.eng.osaka-u.ac.jp/~hiroki/AdvancedPrograming2012_gamelib_ode-0.11.1_20120516.tar.gz

Mac OSXや最新のlinuxで行いたい場合は以下のファイルをダウンロードしてください。

$ wget jeap-res.ams.eng.osaka-u.ac.jp/~hiroki/AdvancedPrograming2012_gamelib_ode-0.12_20120515.tar.gz 

ODEの最新版を使っています。 上記と同じコマンドを実行しますが、ODEをコンパイルするためには予めMacPorts?やyum,apt-get等を用いて、
freeglut等のOpenGL関係のライブラリをインストールしておく必要があります。 (最新のODEは演習室の環境でコンパイルできず、古いODEはOSXで動作しません)
サンプルプログラム(演習室 MacOS X 用)へのリンク http://jeap-res.ams.eng.osaka-u.ac.jp/~hiroki/AdvancedPrograming2012_gamelib_ode-0.12_20120515.tar.gz

開発方法

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

以下では、大規模なプログラム開発で常識的に行われている以上の3点について解説します。 (例ではコンパイルのためにgccを使っていますが、
gamelibではodeを使用する関係でC++のコンパイラが必要なため、g++を用いてコンパイルしています。)

分割コンパイル

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

以下の.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"オプションは実行ファイルの名前を指定しています。

共有ライブラリ開発

ライブラリを用意する事、はアプリケーションプログラムで頻繁に使用する関数等を予め開発して、
アプリケーション開発時に何度も同じプログラムを開発する手間を省いたり、
予め十分に構造を設計しておく事でバグの発生を防ぐ狙いがあります。
試しに普段使用しているコンピュータで使われている共有ライブラリを以下のコマンドで見てみましょう。

$ ls /usr/lib
$ ls /usr/local/lib

アプリケーションプログラム開発時には、そのライブラリの思想を十分汲み取る事で、
効率の良いプログラム開発ができ、アプリケーションプログラムのアイディア実現に集中する事ができます。

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の場合、共有ライブラリのファイルは"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"オプションは共有ファイルの名前を指定しています。

共有ライブラリの使用方法

共有ライブラリを使用するためにはコンパイラにオプションを渡す必要があります。

gcc -L../lib -lfunc -o test_func main.c
-L: ライブラリの場所を指定するオプション
-l: リンクするライブラリを指定するオプション。ライブラリのファイル名はlib??.so (linux等)、lib??.dylib (MacOS X)のようになっているが、??の部分のみ記述します。

本ライブラリでは"/usr/local/lib"等、通常システム用のディレクトリにインストールされるライブラリが
ユーザ領域にインストールされる設計になっています。
これは演習室の環境がユーザにシステム領域へのアクセスを禁じているためで、
LD_LIBRARY_PATH(MacOS Xの場合はDYLD_LIBRARY_PATH)を実行環境に合わせて設定し直す必要があります。

そのため以下のような記述をexec.shに自動的に書き込むようにスクリプトを作っていますので、
exec.shを通して完成したプログラウを実行する事ができます。

$cat exec.sh
#!/bin/sh
export DYLD_LIBRARY_PATH="../../lib" #MacOS X用の記述
export LD_LIBRARY_PATH=../../lib:$LD_LIBRARY_PATH
$* # スクリプトの引数を全て展開
$ ./exec.sh ./shoothing_game

makeによるコンパイルの自動化

gamelibのディレクトリ構造

application

具体的なゲームアプリケーションはここに作成します。
shooting_gameディレクトリにサンプルとなる以下の基本ファイルが保存されています。

main.c
shooting_game.c
shooting_game.h
Makefile
exec.sh

include

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

gamelib.h
game_map.h
self_agent.h
enemy_agent.h
interaction.h

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

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


src

ソースファイルのディレクトリです。

プログラム説明

アプリーケーションソースコード

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

キーボードからの入力を受け付ける。

終了処理

ライブラリソースコード

参考になる情報


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