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;  //画面外なので使用済みにする
  }
 }
}