我正在使用SFML 2.0编写游戏,其中两个精灵列表之间存在冲突。碰撞代码非常正确,但是以某种方式混淆了交互器。我不知道如何解决这个问题。这是我的代码。
std::list<sf::Sprite>::iterator enemyit = enemy.begin(), next;
std::list<sf::Sprite>::iterator greenlaserit = greenlaser.begin(), reload;
while(enemyit != enemy.end())
{
next = enemyit;
next++;
while(greenlaserit != greenlaser.end())
{
reload = greenlaserit;
reload++;
if(enemyit->getGlobalBounds().intersects(greenlaserit->getGlobalBounds()))
{
enemy.erase(enemyit);
greenlaser.erase(greenlaserit);
}
greenlaserit = reload;
}
enemyit = next;
}
这里有两个while循环,我正在做的是我使用内循环来检查碰撞,如果发生碰撞,我正在擦除敌人迭代器。在这样做之后,内部循环将保持循环,直到while条件停止满足。它完成之前不会进入外循环。问题是,敌人迭代器正在内循环中被删除,我没有递增它,直到程序返回到外循环。我如何做到这一点,以便敌人迭代器一旦被删除就在内循环中递增。我已经在循环内外调整了大量移动代码,添加了新变量,但仍然没有。请帮我。感谢。
答案 0 :(得分:0)
如果你只想增加敌人,你为什么不在外面突破?
std::list<sf::Sprite>::iterator enemyit = enemy.begin(), next;
std::list<sf::Sprite>::iterator greenlaserit = greenlaser.begin(), reload;
while(enemyit != enemy.end())
{
next = enemyit;
next++;
while(greenlaserit != greenlaser.end())
{
reload = greenlaserit;
reload++;
if(enemyit->getGlobalBounds().intersects(greenlaserit->getGlobalBounds()))
{
enemy.erase(enemyit);
greenlaser.erase(greenlaserit);
break;
}
greenlaserit = reload;
}
enemyit = next;
}
答案 1 :(得分:0)
这样的事情会起作用吗?我交换了while循环并使用了Guga00建议投掷break
。这样,您遍历所有greenlaserit
并检查每个enemyit
,如果有交叉点,则删除enemyit
和greenlaserit
,然后分配{{1}迭代器到next
,然后enemyit
并将break
迭代器分配给reload
。如果没有交叉点,它只是正常循环。
greenlaserit