目次

エージェントライブラリの開発

gamelibを改造して、敵エージェントの数や種類を増やしましょう。

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

練習4:敵を改造しよう!

敵エージェントの追加

enemy_agent.h

敵エージェントに関するヘッダファイルの

#define ENEMY_AGENT_SIZE 2

では、敵エージェントの数を定義しています。
ここを3に変更しましょう。

shooting_game.c

shooting_game.c

の関数

void start()

では、壁だけでなく、敵エージェントの配置についても初期化しています。
関数を追加して、敵エージェントの数を増やしてみましょう。
敵を生成する関数は

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の敵について追加しましょう。

自機エージェントに近寄る敵エージェント

enemy_agent.h

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

まずは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

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

物理シミュレータ(ODE)を使ったシューティングゲームを作ろう

エージェントに関するライブラリを書き換えて、ゲームシステムを完成させてください。
下記項目を全て行ってください。
自分なりのアイディアを実現してほしいですが、思いつかなければ(例)の一つを実現して下さい。

  • 異なる種類の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)を参考に作成する。
    • ゲームの終了条件の変更
  • これまでの課題をアプリケーションに反映させて,新しいゲームを完成させる。
    • 追加したマップ要素を配置する。
    • 追加した敵エージェントを配置する。
    • ボスエージェントを配置する。

発展課題

さらに独創的なシステムやキャラクターを作りましょう!
以下に例を挙げます.

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

注意事項

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

提出方法

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

評価方法

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

参考になる情報

質問がある場合

  • 浅田研 岩城までメールをください.
    なお,件名は「AP2018:課題4」としてください.
    ryo.iwaki_AT_ams.eng.osaka-u.ac.jp (_AT_は@に変えてください)

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-06-20 (水) 10:16:05 (174d)