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でしょう。
でわまた今度。