目次

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

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

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

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

敵エージェントの追加

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の敵の状態を更新する条件文を追加しましょう。

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

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)を使ったシューティングゲームを作ろう

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

発展課題

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

注意事項

提出方法

評価方法

参考になる情報

質問がある場合


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