[求助]:應用適當的列表迭代程序修復問題。 (如下所示)迭代列表的邏輯。元素「閃爍」
我現在有在其中一個列表的要素通過迭代和擦除,如果符合特定條件的節目。由於該計劃的性質,這可以直觀地看到。正在通過有時迭代屏幕上
對象閃爍開啓和關閉。當它們周圍的物體被破壞時(即在代碼中被擦除)時,通常會發生這種情況。起初我以爲是屏幕閃爍,但現在我意識到我認爲我的迭代函數的邏輯可能會導致問題。
這裏有兩種功能。第一個檢測與塊的子彈碰撞。如果子彈擊中一個塊,該塊將被銷燬。
// Edit: WRONG WAY TO ITERATE THROUGH LIST
void DetectBulletCollisions()
{
std::list<Bullet>::iterator bullet = game::player_bullets.begin();
for (; bullet != game::player_bullets.end(); ++bullet)
{
if (bullet->IsOnScreen())
{
bullet->DetectBlockCollision(game::blocks);
}
else // Remove bullet from list
{
bullet = --game::player_bullets.erase(bullet);
}
}
}
該函數移動閃爍的塊。
// Edit: RIGHT WAY TO ITERATE THROUGH LIST
void MoveBlocks(const int delta_ticks)
{
// Blocks on screen
std::list<Block>::iterator block = game::blocks.begin();
while (block != game::blocks.end()) // Loop through blocks
{
block->Show(); // Show block
if (!block->IsDestroyed()) // If block hasn't been destroyed
{
block->Move(delta_ticks); // Move block
++block; // Increment iterator
}
else // Block has been destroyed, remove it from list.
{
block = game::blocks.erase(block);
}
}
}
這些循環的邏輯有什麼問題嗎?值得注意的是第二個?看起來,當一個塊被破壞時,其周圍的其他人閃爍開關(它不一致,但可能只是幀速率)。我不確定在每次擦除後重新排列元素的列表是否會成爲問題。每個塊都有座標,所以它們在列表中的位置並不重要。
如果需要更多的信息,我很樂意給它。我只是想知道在編寫這些循環時我的邏輯是錯誤的,還是我應該採取不同的方法。我選擇列表是因爲它們是用於刪除元素的最有效的STL容器。
我會考慮這個了。 – trikker 2009-11-01 02:40:09
是的,這是確切的問題。我刪除了元素,並將其賦值給迭代器。非常感謝! – trikker 2009-11-01 02:43:06
太棒了! :)你也可以將增量移動到循環體中,這樣你就不會被迫做稍微多毛的遞減。 – henle 2009-11-01 02:48:52