gamelibを改造して、敵エージェントの数や種類を増やしましょう。
前回と同様に、gamelibの解説とライブラリ開発方法を参考にしてください。
敵エージェントに関するヘッダファイルの
#define ENEMY_AGENT_SIZE 2
では、敵エージェントの数を定義しています。
ここを3に変更しましょう。
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に
#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);
まずは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 ); }
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);
になります。
エージェントに関するライブラリを書き換えて、ゲームシステムを完成させてください。
下記項目を全て行ってください。
自分なりのアイディアを実現してほしいですが、思いつかなければ(例)の一つを実現して下さい。
さらに独創的なシステムやキャラクターを作りましょう!
以下に例を挙げます.