[求助]:应用适当的列表迭代程序修复问题。 (如下所示)迭代列表的逻辑。元素“闪烁”
我现在有在其中一个列表的要素通过迭代和擦除,如果符合特定条件的节目。由于该计划的性质,这可以直观地看到。正在通过有时迭代屏幕上
对象闪烁开启和关闭。当它们周围的物体被破坏时(即在代码中被擦除)时,通常会发生这种情况。起初我以为是屏幕闪烁,但现在我意识到我认为我的迭代函数的逻辑可能会导致问题。
这里有两种功能。第一个检测与块的子弹碰撞。如果子弹击中一个块,该块将被销毁。
// 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