N:Nのあたりはんてい(じゃなかった)

ごめん、今日のを途中まで書いてて気付きましたが、今段階でN:Nの判定は不要でしたたた。昨日のメインループを書き直すと、

CHanteiList ListEnemy2Player;  // 敵→自機
CHanteiList ListPlayer2Enemy;  // 自弾→敵

MainLoop
{
  // 判定を空にする(敵)
  ListEnemy2Player.reflesh();

  // 敵を動かす
  foreach( 敵キャラ )
  {
     敵キャラ.Update();
     if( ListPlayer2Enemy.IsAtari( 敵キャラの喰らい判定 ) )
     {
       // 敵がやられた!
     }
     ListEnemy2Player.SetHantei(敵キャラの攻撃判定);
  }


  // 判定を空にする(自機)
  ListPlayer2Enemy.reflesh();

  // 自機を動かす
  {
    自機.Update();  // 中で自弾発射とかもやっておく
    if( ListEnemy2Player.IsAtari(自機の喰らい判定)
    {
      //やられたー
    }
  }
  // 自弾を動かす
  foreach( 自弾 )
  {
    ListPlayer2Enemy.SetHantei( 自弾の攻撃判定 );
  }

  // 敵の表示
  敵キャラ.Draw();
  
  // 自機の表示
  自機.Draw();

  // 自弾の表示
  自弾.Draw();
}

とりあえずこんな感じで。敵の走査ループの中で判定するので、1:Nの判定で十分でしたね。。。
いちおう、N:Nの判定も記載しておきます。つうても、1:Nの時のループを2重にするだけなんですが。昨日のやつのCAtariHanteiを拡張。

int CHanteiList::IsAtari( CHanteiList* pList )
{
  int len = this->pos;
  for( int idx=0; idx<len; idx++ )
  {
    if( pList->IsAtari( &(this->mRect[idx]) ) )
      return 1;
  }
  return 0;
}

これだけ。要は、敵の走査でループ回すか、判定時にループ回すかなんで、変わらないのですね。関数呼び出しのオーバーヘッドが気になりますが、inline宣言するなり、自力で展開するなりすればOKでしょう。

でわまた今度。