gpt4 book ai didi

c++ - 两个 Sprite 列表的碰撞 - SFML 2.0

转载 作者:行者123 更新时间:2023-11-30 04:15:13 24 4
gpt4 key购买 nike

我正在用 SFML 2 制作一个简单的游戏,到目前为止一切顺利。我创建了两个 sf::Sprite 列表,一个用于敌人,一个用于激光。敌人在屏幕外随机生成,只要给出输入就会产生激光。我为两个列表创建了一个碰撞循环并执行了我的代码。没有编译时和运行时错误。激光与敌人的碰撞对于前 3 到 4 个敌人来说效果很好,但在那之后,碰撞就不会发生。可能导致此问题的原因是什么?请帮我解决这个问题。谢谢。这是我的代码。

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);
++erased;
}
greenlaserit = reload;
}
enemyit = next;
}

最佳答案

这似乎是您正在进行大量的迭代器操作,而这很可能就是问题发生的地方。

如果您可以使用 c++11,我建议您研究 for each 循环 ( http://www.cprogramming.com/c++11/c++11-ranged-for-loop.html ),以使事情真正易于阅读和理解(因此更易于调试)。

你可以这样做:

    std::list<sf::Sprite> enemies;
std::list<sf::Sprite> lasers;

for (sf::Sprite enemy: enemies) {
for (sf::Sprite laser : lasers) {
if (enemy.getGlobalBounds().intersects(laser.getGlobalBounds())) {
enemies.remove(enemy);
lasers.remove(laser);
}
}
}

编辑:否则,我找到的一种解决迭代器问题的方法是手动逐步解决它。我为每个位置绘制了两个带有单元格的矩形,并跟踪迭代器并逐步运行逻辑。在您的逻辑的每次迭代之前,写下您的预期结果。然后手动检查一下,看看您的结果是否符合您的预期。

关于c++ - 两个 Sprite 列表的碰撞 - SFML 2.0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18452096/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com