[[Advanced Programing 2012]]

*目次 [#k12fe86d]
#contents

*第5回以降の趣旨 [#sdeef366]
企業や研究でのプログラム開発では、開発の効率化やバグ等を減らすため
~
同じような処理は関数等にまとめて、ライブラリ化する事が良く行われます。
~
そこで今回はゲーム開発を題材にライブラリ開発の意義や方法について学びます。

ライブラリを開発するのにも別のライブラリを使用することは良く行われます.
~
今回の課題では、3次元物理シミュレータとしてOpen Dynamics Engineを使用して、
~
ライブラリの使用と開発の両方を経験する事によって、使いやすいライブラリや
~
開発やメンテナンスしやすいライブラリはどのようなものかを実際に作る事で考えてもらいます。

*最終目標 [#re33e102]
楽しいゲームを開発しやすくするゲームライブラリの開発

*サンプルコードのインストール [#k53b4fc1]
** 演習室(linux)でのインストール [#rb065e69]
適当なディレクトリに移動して,以下のコマンドを実行します.
 $ wget jeap-res.ams.eng.osaka-u.ac.jp/~hiroki/ap2013_gamelib_linux_20130513.tar.gz
 $ tar zxvf ap2013_gamelib_linux_20130513.tar.gz
 $ cd ap2013_gamelib_linux
 $ ./MAKE
./MAKE スクリプトによりODEの解凍、コンパイル、インストールと
今回の課題のサンプルプログラムのコンパイルとインストールが行われます。
~
サンプルプログラム(演習室 VineLinux 用)へのリンク http://jeap-res.ams.eng.osaka-u.ac.jp/~hiroki/ap2013_gamelib_linux_20130513.tar.gz
~
演習室のVine LinuxとUbutuにて動作確認しています。

** Mac OSXでのインストール [#v4951e8d]
Mac OSXや最新のlinuxで行いたい場合は以下のファイルをダウンロードしてインストールして下さい。
 $ wget jeap-res.ams.eng.osaka-u.ac.jp/~hiroki/ap2013_gamelib_osx_20130513.tar.gz
 $ tar zxvf ap2013_gamelib_osx_20130513.tar.gz
 $ cd ap2013_gamelib_osx
 $ ./MAKE
./MAKE スクリプトによりODEの解凍、コンパイル、インストールと
今回の課題のサンプルプログラムのコンパイルとインストールが行われます。
ODEの最新版を使っています。
Linuxの場合と同じコマンドを実行しますが、
~
ODEをコンパイルするためには予めMacPortsやyum,apt-get等を用いて、
~
freeglut等のOpenGL関係のライブラリをインストールしておく必要があります。
(最新のODEは演習室の環境でコンパイルできず、古いODEはOSXで動作しません)
~
サンプルプログラム(演習室 MacOS X 用)へのリンク  http://jeap-res.ams.eng.osaka-u.ac.jp/~hiroki/ap2013_gamelib_osx_20130513.tar.gz

*Open Dynamics Engine とゲームのサンプルプログラム [#x417a3a3]
インストールしたライブラリ等の解説は次のページに詳しく書いてあります。
~
[[gamelibの解説]]


**ODE付属のデモプログラムを動かしてみよう [#p30ec5be]
以下のディレクトリにはODEが解凍されています
 src/ode-0.11.1 # または src/ode-0.12

 $ cd src/ode-0.11.1/ode/demo/ # または、src/ode-0.12/ode/demo/
 $ ./demo_crash

**サンプルプログラムを動かしてみよう [#h368fcc8]
 $ cd bin
 $ ./exec.sh ./shooting_game

 $ cd application/shooting_game
 $ ./exec.sh ./shooting_game

サンプルプログラムでは、敵(enemy_agent)がランダムに動いており、
~
弾を撃って当てるとhit_pointが減少し、0になると消滅します。
~
全ての敵が消滅するとGame Clearが表示され、ゲームが終了されます。
~
自機(self_agent)と敵の本体が接触すると、
~
自機のhitpointが減少し、0になるとGame Overが表示され、ゲームが終了されます。


-サンプルプログラムのボタン配置(後の改造で変更可)
 d: 前進
 s: 後進
 f: 右平行移動
 a: 左平行移動
 e: 右旋回
 w: 左旋回
 g: ジャンプ
 v: 視点切り替え(一人称視点と背後霊(?)視点.ゲームによってはどちらかに固定した方がよいかも)
 u: 敵キャラ 消滅/生成 (最終的なゲームでは無意味なので削除すべきだが、動作確認のため実装)
 h: 強制終了

**サンプルプログラムの構造を理解しよう [#l7537f9f]
-全てのファイルをエディタで見てみよう。

 application/shooting_game_c-lang
ディレクトリ内にはゲームアプリケーションのソースコードが入っています。
~
ゲームアプリケーションはライブラリを使用して具体的なゲームを構成します。

 src/gamelib
にはライブラリのソースコードが入っています。

アプリケーションとライブラリのディレクトリ内にあるファイルを全てエディタで開いて、
~
中身を確認してください。

 main.c
に、drawstuffによるシミュレーション管理のための構造体や関数が書かれており。
~
 shooting_game.c
に、実際のゲームのロジックが書かれています。

**サンプルを改造してみよう [#n6a5ded3]
 shoogint_game.c
には
 start()
という関数があり、ゲーム環境の初期化を行っています。
~
そこにマップを構成するための関数が書かれているので、
~
関数を修正してマップを変更してみましょう。
~
最初のマップは3x3だが、ライブラリのソースを変更するともっと大きなマップにする事は可能です。
~
何を変更すれば良いか、ソースコードを読んで調べてみよう。

基本的な処理を行う関数を作成し、必要に応じて引数や組み合わせを変更して、
~
様々なアプリケーションを作成する事を可能にするのがライブラリ開発の醍醐味です。
~
マップの変更はその1つなので、まず始めに挑戦してみてください。


*課題 [#ia580668]
**物理シミュレータ(ODE)を使ったシューティングゲームを作ろう(5月29日までの課題) [#hc80dada]
ライブラリを書き換えゲームシステムを完成させる。
~
下記項目を全て行う。
~
自由度の高い課題は自分なりのアイディアを実現して良いですが、
~
思いつかなければ(例)の一つを実現して下さい。

-異なる種類のEnemy Agentを作成
enemy_agent.cとenemy_agent.hをコピーして新しいファイルを作成し、書き替える。
~
--例)動き(ジャンプを入れる、ランダムでなく規則的な動きにする等)や形(ODEのtrimeshを利用して自由形状のクリーチャーを作成する、ジョイントを駆動して動く、等)を変更する.
--例)Self Agentのコードを参考にして、弾を撃てる様にする.(可能ならSelf Agentに向かって撃つ。衝突時の処理関数もinteraction.cに追加)
--例)空を飛ぶ敵エージェント
-ボスエージェントを設定して、ボスのHit Pointが0になると「Game Clear」を表示してゲーム終了
-- BossAgentをEnemyAgentのファイル(enemy_agent.c,enemy_agent.h)を参考に作成する。
--ゲームの終了条件の変更
-新たなマップ要素を追加する~
--例)坂道
--例)ジャンプでしか移動できない段差
--例)移動しずらいデコボコがある。
--例)入るとHit Pointが減少する毒沼
-同じゲームライブラリを使用して複数のステージを作成する.
ディレクトリを改めて作成して、その下で開発する。
~
ディレクトリを改めて作成して(shooting_gameディレクトリを丸のままshooting_game2等とコピーして)、その下で開発する。
--例)マップが異なっている.
--例)敵の種類が違う.
--例)難易度が変わる。
~
同一プログラム中でステージ変化をするにはどうしたら良いか考える.
-バグ報告←これが一番評価が高い

**シューティングゲームツクールを作ろう(6月19日までの発展的課題) [#zae81b5b]
最終目標へ近づく!:「楽しいゲームを作るためのゲームライブラリの開発」

工夫して、自分なりのゲームシステムを持つライブラリとアプリケーションを作成して下さい。
~
提出時に全員の前で、作成したゲームを見せながらプレゼンしてもらいます。
~
独創的なシステムやキャラがあるほど評価を高くします。
~

-マウスやゲームパッドを使って操作できるようにする。
-Enemy Agentの動きを知能化する~
--例)Self Agentに近寄る.
--例)Self Agentの場所によって動きを変える。
--例)Self Agentにトラップを仕掛ける。
--例)Hit Point等の状況によって動きや色、形を変える、等…
-一つのステージをクリアしたら、別のステージを遷移できるようにする。
--例)同一のバイナリファイルでステージを作り直す。
--例)スクリプトでバイナリを複数作成してステージを切り替える。
-物理シミュレーションを活かしたゲームシステムを作成する
--例)当たるとHit Pointが減少する巨大な玉が、Self Agentを待ち構えている坂がある。
--商業ゲーム開発に携わった中西先生は~
「Hit Pointシステムに頼らないゲームシステムは楽しい」~
とおっしゃっています.~
Hit Pointシステムがなく、物理シミュレーションを活かした楽しいゲームは作れるでしょうか?
~
考えてみてください.

**注意事項 [#mef4a474]
サンプルコードにバグがある可能性や、課題が分かりづらい等の問題点がある可能性もあります。
~
何か気がついた事があれば担当の森やTAに連絡をお願いします。

課題の達成方法等にあまり細かいルールは設定しません。
~
ライブラリを全面的に書き換えて、C++にしてもらっても構いません。
~
サンプルより良いゲームライブラリにしてくれれば、1つ1つの課題をクリアするよりも良い評価にします。
~
その代わりしっかり動く様にして来てください。

**提出方法 [#k4ba1727]
-下記の提出物を第7回(5/29)と第9回(6/19)の講義開始時に回収する
-提出物一式を入れるフォルダの名前は学生番号とする
-提出物
--ソースコード
--コンパイルに使用するMakefile
--その他,コンパイル・実行に必要なファイル

**評価方法 [#kc98448d]
-仕様を満たしているか
--担当の森とTAで実際に動いているかを提出者の環境で確認する
--最終課題は全員の前でゲームを動かしながら発表してもらう
-ソースコードの可読性の高さ
--機能ごとに関数を分け,分かりやすい関数名をつけているか(機能ごとにソースを分けて分割コンパイルをする)
--分かりやすい変数名をつけているか
--分かりやすいコメントを記述しているか
-機能に対応した分かりやすい関数を設計しているか
-無駄な処理を行っていないか
-工夫に応じて加点する

*参考になる情報 [#j1dcb858]
-公式ホームページ 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/
~
大阪大学の松下先生のページ

-この授業の担当の中西先生のページや論文等
~
中西先生が手がけたゲーム作品
~
http://smg.ams.eng.osaka-u.ac.jp/~nakanishi/hn_designs_j.html
~
中西 英之. ビデオゲームデザインのためのモデル. 情報処理学会研究報告 モデル化と問題解決, 98-MPS-18-9, 1998.
~
http://smg.ams.eng.osaka-u.ac.jp/~nakanishi/hnp_1998_mps.pdf
~
中西 英之, Katherine Isbister. ビデオゲームに浸透するエージェント技術. 情報処理, Vol. 48, No. 3, pp. 250-256, 2007.
~
http://smg.ams.eng.osaka-u.ac.jp/~nakanishi/hnp_2007_ipsjmag.pdf
~


*質問がある場合 [#h308a67f]
-浅田研 森までメールをください.~
なお,件名は「AP2012:課題3」としてください.~
hiroki_AT_ams.eng.osaka-u.ac.jp (_AT_は@に変えてください)


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