我尝试在SFML中编写一个自顶向下的射手,但遇到了问题。我对C++和编程一般都很陌生,所以请原谅混乱的代码和/或过于复杂的解决方案。在单独的列表中碰撞两个精灵
我有两个std::list
s,其中一个包含随机产卵的敌人,另一个包含我解雇的子弹。当一颗子弹击中一个敌人时,他们都应该被擦除,但它不起作用。
这里是我的代码的问题部分:
for(MonsterIt = MonsterList.begin(); MonsterIt != MonsterList.end(); MonsterIt++)
{
//Here would be Monster-Movement
//Collision Monster-Player (MonsterIt = iterator of MonsterList)
if ((MonsterIt -> getPosition().x + 25) >= PlayerX - 25 &&
(MonsterIt -> getPosition().x - 25) <= PlayerX + 25 &&
(MonsterIt -> getPosition().y + 25) >= PlayerY - 25 &&
(MonsterIt -> getPosition().y - 25) <= PlayerY + 25 )
{
MonsterList.erase(MonsterIt);
break;
}
window.draw(*MonsterIt);
}
这就是我所做的怪物和玩家之间的碰撞的方式。这工作得很好,所以我试图与怪物和激光一样的:
for(LaserIt = LaserList.begin(); LaserIt != LaserList.end(); LaserIt++)
{
//Here would be "Laser-Movement"
//Collision-Laser // Doesn't work
if ((MonsterIt -> getPosition().x + 25) >= //
(LaserIt -> getPosition().x - 7) && //
(MonsterIt -> getPosition().x - 25) <= //
(LaserIt -> getPosition().x + 7) && //
(MonsterIt -> getPosition().y + 25) >= //
(LaserIt -> getPosition().y - 7) && //
(MonsterIt -> getPosition().y - 25) <= //
(LaserIt -> getPosition().x + 7)) //
{ //
MonsterList.erase(MonsterIt); //
//
LaserList.erase(LaserIt); //
//
break; //
} //
window.draw(*LaserIt);
}
当我把代码的一部分标志着我(与右侧//)我得到一个“列表迭代器不dereferencable”误差尽快调试我拍摄。当我切出所说的代码时,它运行良好(我可以射击,走入怪物并消失等等)。因此,我猜我的代码的其余部分正在工作。
那么,不同列表的迭代器之间甚至有可能发生冲突? 如果是这样,我该怎么做?
如果您需要更多信息或代码,请询问。我很乐意为您提供帮助...
你怎么知道'MonsterIt'是第二个片段中的有效迭代器? –
这是我的问题。我想这是无效的,这就是为什么它不起作用。但是,我怎样才能使MonsterList中的Monster和LaserList中的Laser-Shot之间发生碰撞?就像我说的,我对C++很陌生。就我所了解的迭代器而言,这里的MonsterIt是列表中一个成员的“名字”。真的吗? – pantagruel
不是。 MonsterIt是一个变量的名称,它指向一个怪物(MonsterIt是一个迭代器,而不是怪物)。 – Synxis