2014 ソフトウェア設計及び演習用の班Wiki

gr03:敵モジュール

enemy.h

#include<time.h>
#include<gtk/gtk.h>
#pragma once

#define MAXENEMY 10     /*同エリアに存在できる最大敵数*/
#define RUNNER 0
#define GUNNER  1
#define HEAVIER 2
#define BOSS 3

typedef struct {
  int species;           /*敵種*/
  int direction;         /*方向*/
  double x;              /*x座標*/
  double y;              /*y座標*/
  double beforeX;        /*前回のx座標*/
  double beforeY;        /*前回のy座標*/
  int status;            /*状態(0−>回収済み、1−>正常 2−>気絶)
  int attackSta;	/*boss(状態(0->移動 1-> 発射準備、2ー>発射、3ー>雑魚敵召喚準備、
                                      4ー>雑魚敵召喚5ー>梨汁準備、6ー>梨汁放出、*/
  int hp;                /*HP*/
  double r;              /*接触範囲(半径)*/
  int len;               /*配列の長さ*/
}enemy;


/*ゲーム開始時に敵情報を設定する関数引数は敵配列*/
void enemyFirstSet(void);

/*気絶した時(HP=0)になったときに状態タイマをスタートさせる関数。引数は気絶した敵配列番号。*/
void enemyTimerStart(int num);

/*状態タイマに応じて状態変数を書き換える関数。一定時間ごとに呼び出して欲しい。*/
void enemyTimer(void);

/*回収された時に状態変数を書き換える関数。引数は回収された敵配列番号。*/
void collectEnemy(int num);

/*敵のHPを−1する。引数はダメージを受けた敵の配列番号。返り値は残りHP*/
int ememyHpDamage(int num);

/*敵の動きを決める関数。一定時間ごとに呼び出して欲しい。*/
int enemyAI(void);

関数説明等

enemyFirstSet

enemy型グローバル変数Enemyを初期設定する関数。enemy.c内のenemy型2次元配列の値を代入し初期化。

enemyTimerStart

コメントにある通り、気絶した時(HP=0)になっときに状態タイマ(enemy.c内の構造体AI型の2次元配列のaiのメンバーkizetuTimer)をスタートさせる関数。引数は気絶した敵配列番号。

enemyTimer

状態タイマ(aa.kizetuTimer)に応じて状態変数(Enemy.status)を書き換える関数。気絶してから一定時間経ったらHPを少し回復させて復活させる

collectEnemy

回収された時に状態変数(Enemy.status)を書き換える(2->0)関数。気絶状態の敵が自機と接触したらこの関数が呼び出され気絶状態から回収済み状態にする。たったそれだけの操作をする関数。他のモジュールに敵モジュールのデータをいじらせたくなかったため作成。

ememyHpDamage

ダメージを受けた敵のHPを−1するだけの関数。できるだけ他のモジュールに敵モジュールのデータをいじらせたくなかったので、たったそれだけの操作でも関数化した。さらにダメージを受けた場合は活性化(ai.kasseikaCount++)させる。ボスの無敵時間の間はHPを減らさない。

enemySummon2play

2人プレイ用関数。雑魚敵を召喚する。場所と種類は一応ランダム。(擬似乱数がランダムじゃないから....)

enemyFirstSet2play

2人プレイ用関数。Enemy配列の初期化を行う。

enemyAI

敵4種をそれぞれ動かす関数。

enemyAIで使う関数

  • Edirect関数  向く方向を決めるだけの関数。下記の図のように決定する。 無題図形描画.png
  • GunRunMoveVector関数  gunner(それなり動きながら弾を撃ってくる奴)とrunner(近づいてくるだけの奴)と進行方向ベクトル(ai.xsv&ysv)を決定して座標を動かす。実際の動かすのはEmove。基本的にこいつらは近づくだけで、そこに少しランダムに少しぶれる。自機と遠いと近い時より比較的大きくぶれる。この関数が呼びされるたびに進行方向ベクトルを再設定するわけではなく、これは自機が敵から逃げやすくするためである。ai.cmでカウントし、maxcm回までカウントしたら再設定する。
  • Emove関数  進行方向ベクトル(aa.xsv&ysv)を基に実際に座標を動かす。壁にぶつかった場合は壁沿いに進むように進行方向ベクトルを再設定する。
  • Eback関数  自機が一定範囲内におらず、ダメージを一定時間受けていない場合は所定の位置に戻る(runnerは例外)。この関数で戻る場合の進行方向ベクトルを決定する。
  • Eshot関数  敵と自機の位置から方向を決め撃つ。ある程度遠くを狙うと大きくぶれる。
  • Ehoming関数  ボスのみが使う関数。ホーミング弾を生成。
  • Esummon関数  ボスのみが使う関数。ボスの周りに雑魚敵を召喚する。
  • BossMoveVector関数  ボスのみが使う関数。ボスを進行方向を決定して動かす。


最終更新日:2015/02/17 18:10:28