その内容ですが、
全敵を格納したリストがある。
画面上で敵は整列しており、
縦に区切って、それらの列にはNoを振り、
それを各敵は保持しています。
●|●|●|●|●|●
●|●|●|●|●|●
●|●|●|●|●|●
列No 0 1 2 3 4 5
時間が来ると、どれかの列に攻撃命令を出すわけですが
毎回、「どれかひとつの列だけ」がチョイスされ、
また、攻撃するのは「その列の先頭の敵だけ」です。
列はランダムに選択されます。
敵はプレイヤーによって、破壊され減らされていきますが、
チョイスされた列の先頭の敵が必ず攻撃する、
といった内容になるようにしました。
ソースです。
//攻撃する敵を決めるメソッド
void ObjectMgr::EnemyAttack(){
//これらの最初の値設定はイニシャライズにて完了しているものとする
this->attackNo = GetRand(4);//指定する列のNOをランダムで
this->attackstart = 30;//攻撃する敵を決めるメソッド開始タイム
this->attackcount = 0;//メソッドの間隔を刻むカウンター
this->attackflg = false;//攻撃する敵を選択するソメッド開始フラグ
list<sObject*>::iterator it; //イテレータ宣言
it = enemylist.begin(); //itの指すところを先頭にする
//毎回、初期化したカウンターが攻撃開始時間を超えたらスタート
if(this->attackcount >= this->attackstart){
this->attackflg = true;//攻撃処理のフラグを立ててループの中へ
while(this->attackflg == true){
if(it!=enemylist.end()){
//指定番号と、敵の列番号が合わされば
if((*it)->getlineNo() == this->attackNo){
//その敵の攻撃フラグを立てる
(*it)->setenemyshot_flg(true);
//繰り返すためにリセット
this->attackNo = GetRand(10);
this->attackstart = 30;
this->attackcount = 0;
this->attackflg = false;
it=enemylist.begin();
break;
}
it++;
}
}
}
this->attackcount++;
}
途中でエラーが出て止まるか、フリーズします。
このメソッドを更新関数に入れると起きるので原因はここにありそうです。
エラーはリストのイテレータが不明、みたいなエラーです。
それかwhileから出れなくなったようなフリーズになります。
attackNoに格納されるチョイス列Noが、
すでに無くなってしまった列を選んだ場合の対処が入っていないからでしょうか?
「listの最後まで来てしまったら、リセットしてやりなおせ」を加えたつもりですが
うまくいきません。
//攻撃する敵を決めるメソッド
void ObjectMgr::EnemyAttack(){
//これらの最初の値設定はイニシャライズにて完了しているものとする
this->attackNo = GetRand(4);//指定する列のNOをランダムで
this->attackstart = 30;//攻撃する敵を決めるメソッド開始タイム
this->attackcount = 0;//メソッドの間隔を刻むカウンター
this->attackflg = false;//攻撃する敵を選択するソメッド開始フラグ
list<sObject*>::iterator it; //イテレータ宣言
it = enemylist.begin(); //itの指すところを先頭にする
//毎回、初期化したカウンターが攻撃開始時間を超えたらスタート
if(this->attackcount >= this->attackstart){
this->attackflg = true;//攻撃処理のフラグを立ててループの中へ
while(this->attackflg == true){
if(it!=enemylist.end()){
//指定番号と、敵の列番号が合わされば
if((*it)->getlineNo() == this->attackNo){
//その敵の攻撃フラグを立てる
(*it)->setenemyshot_flg(true);
//繰り返すためにリセット
this->attackNo = GetRand(10);
this->attackstart = 30;
this->attackcount = 0;
this->attackflg = false;
it=enemylist.begin();
break;
}
it++;
}
if(it==enemylist.end()){//listの最後になった(つまりその列はもう無い
//リセットしてループを出る
this->attackNo = GetRand(10);
this->attackstart = 30;
this->attackcount = 0;
this->attackflg = false;
break;
}
}
}
this->attackcount++;
}
どう修正すればいいでしょうか