两个精灵列表的冲突-SFML2.0
Collision of two sprite lists - SFML 2.0
我正在SFML 2中制作一个简单的游戏,到目前为止进展顺利。我创建了两个sf::精灵列表,一个用于敌人,另一个用于激光。敌人在屏幕外随机产生,只要输入,就会产生激光。我为这两个列表创建了一个冲突循环,并执行了我的代码。不存在编译时和运行时错误。激光敌人碰撞对前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的范围为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);
}
}
}
编辑:否则,我发现的一种解决迭代器问题的方法是手工处理。我为每个位置绘制了两个带有单元格的矩形,并跟踪迭代器并逐步运行逻辑。在每次迭代逻辑之前,记下您的预期结果。然后手工检查,看看你的结果是否符合你的期望。
相关文章:
- 写入位置0x0000000C时发生访问冲突
- GL_SHADERSTORAGE_BUFFER位置是否与其他着色器位置冲突
- 使用cmake从源代码构建MySQL连接器/C++失败(与以前的声明冲突)
- 引发异常:读取访问冲突**dynamicArray**为0x1118235.发生
- C++LinkedList问题.数据类型之间存在冲突?没有匹配的构造函数
- 链表中写入访问冲突的未知原因
- C++中的openCV Mat访问冲突
- 如何使 std::sort 在 std::swap 和我的命名空间的模板化交换之间没有名称冲突?
- C++尝试深度复制唯一指针时出现内存访问冲突
- 错误:使用通用引用的声明冲突
- 如何解决GTest和LibTorch联动冲突
- 两个运营商的一些奇怪的冲突<<
- 如何在多个线程中创建 QSql数据库连接时防止名称冲突
- C++ 中动态二维数组的访问冲突
- 从嵌套循环中的 std::list 中删除将返回访问冲突
- C++17 十六进制浮点文字单精度后缀冲突?
- 结构字段名称与 GDB 中的 STL 数组冲突
- 写入访问冲突异常
- 两个精灵列表的冲突-SFML2.0
- SFML2 与每个对象发生冲突