1
私は、クラスのためにスペースインベーダーをプログラミングするのは非常に困難です。私は「ミサイル」と私の「エイリアン」を保管するためのリストを保管するためにリストを使用することになっています。スペースバーを押して新しいエイリアンにロードし、2人の接触があったときに両方を削除しようとしていて、過去に "エイリアン"を削除することもできません。複数のミサイルが発射されたときにさまざまなバグがあり、この機能がコメントアウトされていればミサイルは正常に機能します。私はすでに宇宙人のリストを含む別のクラスにミサイルのリストを渡し、両方を削除することを余儀なくされている。ここで2つのリストから要素を削除するにはどうすればいいですか?
は、問題のあるコードです:
bool AlienMgr::checkHit(PlayerMgr& playerMgr)
{
bool hit = false; // If the player hits an alien, switches to true and is returned.
list<Missile*>::iterator missileIter;
list<Missile*> missileList = playerMgr.getMissiles();
int missileCount;
FloatRect missileBounds;
FloatRect alienBounds;
iter = myAliens.begin();
while (!myAliens.empty() && iter != myAliens.end())
{
alienBounds = (*iter)->getGlobalBounds();
if (!missileList.empty() && !hit)
{
for (missileIter = missileList.begin(); missileIter != missileList.end() && !hit; missileIter++)
{
missileBounds = (*missileIter)->getMissileBounds();
if (alienBounds.intersects(missileBounds))
{
delete (*iter);
iter = myAliens.erase(iter);
cout << "HIT" << endl;
}
else
{
iter++;
}
}
}
else
{
iter++;
}
}
return hit;
}
*プレーヤーがエイリアンに当たった場合は、trueに切り替えて返されます。* - いいえ、trueに切り替わりません。それはコメントが言っていることですが、それはコード内で起こることではありません:)。また、修正を加える前に、変数の宣言をどこに初期化するかを移してください。関数の初めにそれらをすべて宣言することは悪い、時代遅れの習慣です。同様に、オブジェクトのライフタイムを手動で管理するべきではありません。値を格納すると、それらを '削除 'する必要がなくなります。ノイズを除去すると、実際の問題に集中するのに役立ちます。 –
エイリアンとそれが衝突するすべてのミサイルを取り除きたい場合は、エイリアンを取り外す前にミサイルを取り除く必要があります。 – molbdnilo