*目次 [#k12fe86d]
#contents

*エージェントライブラリの開発 [#hf7534b2]
gamelibを改造して、敵エージェントの数や種類を増やしましょう。

前回と同様に、[[gamelibの解説]]と[[ライブラリ開発方法]]を参考にしてください。

*練習4:敵を改造しよう! [#n6a5ded3]
**敵エージェントの追加 [#j11aa279]
***enemy_agent.h [#v78e0bfb]
敵エージェントに関するヘッダファイルの
 #define ENEMY_AGENT_SIZE 2
では、敵エージェントの数を定義しています。~
ここを3に変更しましょう。

***shooting_game.c [#hf463084]
 shooting_game.c

 start()
では、敵エージェントの配置についても初期化しています。
の関数
 void start()
では、壁だけでなく、敵エージェントの配置についても初期化しています。
~
関数を追加して、敵エージェントの数を増やしてみましょう。
~
なお、
 simLoop(int pause)

 stop()
も敵エージェントについてのコードの追加が必要になります。
敵を生成する関数は
 void make_enemy_agent()
です。~
サンプルプログラムでは、敵がID 0と1の2体しかいませんので、ID 2の敵を追加しましょう。

次に、
 void simLoop(int pause)
では、シミュレーションループの中での状態を更新します。~
敵のヒットポイントがなくなると、
 void destroy_enemy_agent()
で敵を消滅させ、そうでないと、
 void update_enemy_agent()
で敵の状態を更新(移動など)します。~
すべての敵がいなくなると、
 stop();
 exit(0);
でゲームを終了します。

さきほどstart()で追加したID 2の敵の状態を更新する条件文を追加しましょう。

また、関数
 void stop()
では、敵エージェントに関するメモリ解放をしています。~
ここにもID 2の敵について追加しましょう。

**自機エージェントに近寄る敵エージェント [#kf71ae31]
***enemy_agent.h [#pc1700e9]
enemy_agent.hに
 #define ENEMY_AGENT_SPEED 1.2
 #define FLAG_DISTANCE_ENEMY_TO_SELF_AGENT 1.5
を加えます。
~
ENEMY_AGENT_SPEEDは敵エージェントが自機エージェントに近寄る速さです。
~
FLAG_DISTANCE_ENEMY_TO_SELF_AGENTは敵エージェントが自機エージェントに近寄る行動をする範囲です。~
範囲外だと近寄ってきません。
~
次に、update_enemy_agent関数の引数を次のように追加してください。
 void update_enemy_agent( int enemy_agent_index, const dReal* self_agent_position);

***enemy_agent.c [#y82edb8c]
まずはmath.hのインクルードを追加します。
 #include <math.h>
そして、update_enemy_agent関数を改造します。
~
引数に自機の位置を示す変数を追加します。
 void update_enemy_agent( int enemy_agent_index, const dReal* self_agent_position){
次に、
 force[2] = drand48()
の下で、対象となっている敵エージェントの位置を取得します。
 const dReal* enemy_agent_position = dBodyGetPosition(enemy_agent_data[ enemy_agent_index ].body_ID);
自機エージェントと敵エージェントの距離を計算します。
 double distance = sqrt((self_agent_position[0] - enemy_agent_position[0])*(self_agent_position[0] - enemy_agent_position[0]) + (self_agent_position[1] - enemy_agent_position[1])*(self_agent_position[1] - enemy_agent_position[1]));
その距離がFLAG_DISTANCE_TO_SELF_AGENTより小さければ,~
その距離に応じた大きさの,敵エージェントから自機エージェントに向かう力を敵エージェントに与えます。
  if(distance < FLAG_DISTANCE_ENEMY_TO_SELF_AGENT){
      force[0] = (self_agent_position[0] - enemy_agent_position[0]) * ENEMY_AGENT_SPEED;
      force[1] = (self_agent_position[1] - enemy_agent_position[1]) * ENEMY_AGENT_SPEED;
      force[2] = 0.0;
      dBodyAddForce( enemy_agent_data[ enemy_agent_index ].body_ID, force[0], force[1], force[2] );
  }
  else{
      dBodyAddForce( enemy_agent_data[ enemy_agent_index ].body_ID, drand48()-0.5, drand48()-0.5, drand48()-0.5 );
  }

***shooting_game.c [#r02a09c8]
simLoop関数を改造する。
~
update_enemy_agent関数に関するif文の前に,自機エージェントの位置を取得します。
 const dReal* self_agent_position = get_self_agent_position();
update_enemy_agentの引数にself_agent_positionを追加する。~
IDが0の敵エージェントの場合、
 update_enemy_agent( 0,  self_agent_position);
になります。

*課題4 [#ia580668]
**物理シミュレータ(ODE)を使ったシューティングゲームを作ろう [#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)を参考に作成する。
--ゲームの終了条件の変更

-これまでの課題をアプリケーションに反映させて,新しいゲームを完成させる。
--追加したマップ要素を配置する。
--追加した敵エージェントを配置する。
--ボスエージェントを配置する。

**発展課題 [#tc64fef8]
さらに独創的なシステムやキャラクターを作りましょう!
~
以下に例を挙げます.

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

**注意事項 [#mef4a474]
-サンプルコードにバグがある可能性や、課題が分かりづらい等の問題点がある可能性もあります。~
何か気がついた事があれば担当教員やTAに連絡をお願いします。
-適宜コメントを入れたり、関数化したりして、他人にもわかりやすいプログラムになるように心がけてください。~
全くコメントのないものは減点します。
-他人のプログラムを写したことが判明した場合は,両者とも0点になります。
-課題内容に対応していないプログラムには点をつけられません。


**提出方法 [#k4ba1727]
-第9回(6/14)に全員の前で、作成したゲームを見せながらプレゼンしてもらいます。
-下記の提出物を第9回講義日(6/14)24:00までにCLEで提出してください.
-提出物一式を入れるフォルダの名前は学生番号(ログインIDではない!)とし,zipファイルに圧縮してください.
-提出物
--ソースコード
--コンパイルに使用するMakefile
--その他,コンパイル・実行に必要なファイル
--プログラムの説明(工夫した点・頑張った点,操作方法)

**評価方法 [#kc98448d]
-仕様を満たしているか
-ソースコードの可読性の高さ
--機能ごとに関数を分け,分かりやすい関数名をつけているか(機能ごとにソースを分けて分割コンパイルをする)
--分かりやすい変数名をつけているか
--分かりやすいコメントを記述しているか
-機能に対応した分かりやすい関数を設計しているか
-無駄な処理を行っていないか
-工夫に応じて加点する


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

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

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

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

-この授業の担当の中西先生のページや論文等
~
中西先生が手がけたゲーム作品
[[中西先生が手がけたゲーム作品>http://smg.ams.eng.osaka-u.ac.jp/~nakanishi/hn_designs_j.html]]
~
http://smg.ams.eng.osaka-u.ac.jp/~nakanishi/hn_designs_j.html
中西 英之. [[ビデオゲームデザインのためのモデル>http://smg.ams.eng.osaka-u.ac.jp/~nakanishi/hnp_1998_mps.pdf]]. 情報処理学会研究報告 モデル化と問題解決, 98-MPS-18-9, 1998.
~
中西 英之. ビデオゲームデザインのためのモデル. 情報処理学会研究報告 モデル化と問題解決, 98-MPS-18-9, 1998.
中西 英之, Katherine Isbister. [[ビデオゲームに浸透するエージェント技術>http://smg.ams.eng.osaka-u.ac.jp/~nakanishi/hnp_2007_ipsjmag.pdf]]. 情報処理, Vol. 48, No. 3, pp. 250-256, 2007.
~
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]
-浅田研 岩城までメールをください.~
なお,件名は「AP2017:課題4」としてください.~
ryo.iwaki_AT_ams.eng.osaka-u.ac.jp (_AT_は@に変えてください)


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