Enemy.cpp
#include "GPLib.h"
#include "MyLib.h"
#include "Enemy.h"
#define GAME_WIDTH 400
#define GAME_HEIGHT 640
#define SHOT_WIDTH 8
#define SHOT_HEIGHT 8
//敵情報
#define ENEMY_WIDTH 32
#define ENEMY_HEIGHT 32
#define ENEMY2_WIDTH 32
#define ENEMY2_HEIGHT 32
#define ENEMY_MAX 10
#define ENEMY_KIND 10
#define ENEMY_SPEED 3.5f
#define ENEMY2_SPEED 2.5f
#define ENEMYSHOT_MAX 30
#define ENEMYSHOT_SPEED 5.5
//--------------------------------------------
// Name:CreateEnemy()
// Desc:敵を生成する
//--------------------------------------------
VOID CreateEnemy()
{
int i,j;
static DWORD dwLastTime = timeGetTime();
DWORD dwTime = timeGetTime();
if( dwTime - dwLastTime > 1000 ) //1秒ごとに生成する
{
dwLastTime = dwTime;
j = rand()%2;
//敵機1
if(j == 0)
{
for( i = 0; i < ENEMY_MAX; i++ )
{
if( sEnemy[j][i].iUsed == FALSE )
{
sEnemy[j][i].iUsed = TRUE; //使用中にする
//位置をランダムで決める
sEnemy[j][i].sPos.fX = rand() % (GAME_WIDTH - ENEMY_WIDTH);
sEnemy[j][i].sPos.fY = 0;
sEnemy[j][i].fSpe = ENEMY_SPEED;
//アニメーションのための初期化
sEnemy[j][i].iCnt = 0;
sEnemy[j][i].iAnim = 0;
//爆発情報のクリア
sEnemy[j][i].iBlast = FALSE;
break;
}
}
}
//敵機2
if(j == 1)
{
for( i = 0; i < ENEMY_MAX; i++ )
{
if( sEnemy[j][i].iUsed == FALSE )
{
sEnemy[j][i].iUsed = TRUE; //使用中にする
//位置をランダムで決める
sEnemy[j][i].sPos.fX = rand() % (GAME_WIDTH - ENEMY2_WIDTH);
sEnemy[j][i].sPos.fY = 0;
sEnemy[j][i].fSpe = ENEMY2_SPEED;
//アニメーションのための初期化
sEnemy[j][i].iCnt = 0;
sEnemy[j][i].iAnim = 0;
//爆発情報のクリア
sEnemy[j][i].iBlast = FALSE;
//ライフの設定
sEnemy[j][i].eLife = 10;
break;
}
}
}
}
}
//--------------------------------------------
// Name:MoveEnemy()
// Desc:敵機を移動
//--------------------------------------------
VOID MoveEnemy()
{
int i,j;
S2DVECTOR vDir;
vDir.fX = 0; vDir.fY = 1; //敵機の進む方向を設定
for( i = 0; i < ENEMY_MAX; i++ )
{
for(j = 0; j < ENEMY_KIND; j++)
{
if( sEnemy[j][i].iUsed == TRUE && sEnemy[j][i].iBlast == FALSE)
{
vDir = My2DVecNormalize( vDir ); //正規化
vDir = My2DVecScalar( vDir, sEnemy[j][i].fSpe ); //スピードを設定
sEnemy[j][i].sPos = My2DVecAdd(sEnemy[j][i].sPos, vDir); //座標を決定
sEnemy[j][i].iCnt++; //アニメーションカウンタを上げる
//画面外に出たかチェック
if( sEnemy[j][i].sPos.fY > GAME_HEIGHT )
sEnemy[j][i].iUsed = FALSE; //画面外なので使用済みにする
}
}
}
}
//--------------------------------------------
// Name:ShotEnemy()
// Desc:敵機の弾を生成
//--------------------------------------------
VOID ShotEnemy()
{
int i,j,k,m;
for(i = 0; i < ENEMYSHOT_MAX; i++)
{
static DWORD dwLastTime = timeGetTime();
DWORD dwTime = timeGetTime();
if( dwTime - dwLastTime > 1000 )
{
dwLastTime = dwTime;
//生成されている敵機を調べる
for(i = 0; i < ENEMY_MAX; i++)
{
for(j = 0; j < ENEMY_KIND; j++)
{
if(sEnemy[j][i].iUsed == TRUE)
{
//使用していない弾を探す
for(k = 0; k < ENEMYSHOT_MAX; k++)
{
if(sEnemyShot[k].iUsed == FALSE)
{
//弾を使用中にする
sEnemyShot[k].iUsed = TRUE;
//位置を敵機の頭に合せる
//敵機1
if(j == 0)
{
sEnemyShot[k].sPos.fX = sEnemy[j][i].sPos.fX + ENEMY_WIDTH / 2 - SHOT_WIDTH / 2;
sEnemyShot[k].sPos.fY = sEnemy[j][i].sPos.fY + ENEMY_HEIGHT;
sEnemyShot[k].fSpe = ENEMYSHOT_SPEED;
}
//敵機2
if(j == 1)
{
for(m = 0; m < ENEMYSHOT_MAX; m++)
{
//未使用の弾を2つ見つけたら発射
if(sEnemyShot[m].iUsed == FALSE)
{
sEnemyShot[m].iUsed = TRUE;
sEnemyShot[m].sPos.fX = sEnemy[j][i].sPos.fX + ENEMY2_WIDTH / 2 + SHOT_WIDTH *2;
sEnemyShot[m].sPos.fY = sEnemy[j][i].sPos.fY + ENEMY2_HEIGHT;
sEnemyShot[m].fSpe = ENEMYSHOT_SPEED;
sEnemyShot[k].sPos.fX = sEnemy[j][i].sPos.fX + ENEMY2_WIDTH / 2 - SHOT_WIDTH *2;
sEnemyShot[k].sPos.fY = sEnemy[j][i].sPos.fY + ENEMY2_HEIGHT;
sEnemyShot[k].fSpe = ENEMYSHOT_SPEED;
break;
}
}
}
break;
}
}
}
}
}
}
}
}
//--------------------------------------------
// Name:MoveShot()
// Desc:敵機の弾を移動
//--------------------------------------------
VOID MoveEnemyShot()
{
int i;
S2DVECTOR vDir;
vDir.fX = 0; vDir.fY = 1; //弾の進む方向を設定
for( i = 0; i < ENEMYSHOT_MAX; i++ )
{
if( sEnemyShot[i].iUsed == TRUE )
{
vDir = My2DVecNormalize( vDir ); //正規化
vDir = My2DVecScalar( vDir, sEnemyShot[i].fSpe ); //スピードを設定
sEnemyShot[i].sPos = My2DVecAdd(sEnemyShot[i].sPos, vDir);
//画面外に出たかチェック
// (画面下部しかチェックしていないので注意!!)
if( sEnemyShot[i].sPos.fY > GAME_HEIGHT )
sEnemyShot[i].iUsed = FALSE; //画面外なので使用済みにする
}
}
}