*目次 [#k12fe86d]
#contents

*練習:敵を改造しよう! [#n6a5ded3]
**敵エージェントの追加 [#j11aa279]
***shooting_game.c [#hf463084]
 shooting_game.c
の
 start()
では、敵エージェントの配置についても初期化しています。
~
関数を追加して、敵エージェントの数を増やしてみましょう。
~
なお、
 simLoop(int pause)
と
 stop()
も敵エージェントについてのコードの追加が必要になります。

**自機エージェントに近寄る敵エージェント [#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);

*課題 [#ia580668]
**物理シミュレータ(ODE)を使ったシューティングゲームを作ろう [#hc80dada]
-新たなマップ要素を追加する~
--例)坂道
--例)ジャンプでしか移動できない段差
--例)移動しずらいデコボコがある。
--例)入るとHit Pointが減少する毒沼

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

-(可能なら)同一プログラム中で,ステージを変化させるにはどうしたら良いか考える.

-第9回(6/14)に全員の前で、作成したゲームを見せながらプレゼンしてもらいます。

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

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

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

課題の達成方法等にあまり細かいルールは設定しません。
~
ライブラリを全面的に書き換えて、C++にしてもらっても構いません。

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

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


*参考になる情報 [#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]
-浅田研 岩城までメールをください.~
なお,件名は「AP2017:課題4」としてください.~
ryo.iwaki_AT_ams.eng.osaka-u.ac.jp (_AT_は@に変えてください)

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