我尝试在SFML中编写一个自上而下的射击游戏,但遇到了问题。我对C ++和编程很新,所以请原谅凌乱的代码和/或过于复杂的解决方案。
我有两个std::list
,一个包含随机产生的敌人,另一个包含我发射的子弹。当子弹击中敌人时,它们都会被擦除,但它不起作用。
这是问题 - 我的代码的一部分:
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);
}
这就是我在Monster和Player之间碰撞的方式。这很好,所以我尝试使用Monsters和Lasers:
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);
}
当我输入我标记的代码部分(右侧为//)时,我会在调试时立即调试“list iterator not dereferencable”-error。当我删除所述代码时,它运行正常(我可以拍摄,走进怪物,它们会消失,等等)。因此,我猜我的其余代码正在运行。
那么,不同列表的迭代器之间的冲突是否可能? 如果是这样,我该怎么做?
如果您需要更多信息或代码,请询问。我很高兴你的帮助......
答案 0 :(得分:0)
您使用的迭代器无效。
您的问题有几种解决方案。第一个:
for(MonsterIt = MonsterList.begin(); MonsterIt != MonsterList.end(); MonsterIt++)
{
//Here would be Monster-Movement
//Collision Monster-Player (MonsterIt = iterator of MonsterList)
// Collision with laser, inside the loop for monsters
for(LaserIt = LaserList.begin(); LaserIt != LaserList.end(); LaserIt++)
{
}
window.draw(*MonsterIt);
}
这个解决方案实际上不是C ++ ish。使用OOP,您可以获得更清晰的代码:
class Player
{
public:
int X, Y; // for code simplicity on SO.
};
// ...
Player player;
for(MonsterIt = MonsterList.begin(); MonsterIt != MonsterList.end(); MonsterIt++)
{
MonsterIt->update(player,LaserList);
if(!MonsterIt->isAlive())
{
// Remove monster from list *without* break
}
}
然后,Monster
是一个类如下的类:
类怪物
{
布尔活着;
上市:
bool isAlive()const {return alive; }
bool collideWithPlayer(Player p) const
{
// Returns whether it collide with player
// ...
}
bool collideWithLaser(Laser l) const
{
// Returns whether it collide with one laser
// ...
}
bool collideWithLasers(LaserList l) const
{
for(LaserIt = LaserList.begin(); LaserIt != LaserList.end(); LaserIt++)
if(collideWithLaser(*LaserIt))
return true;
return false;
}
void update(Player p, LaserList l)
{
if(collideWithPlayer(p) || collideWithLasers(l))
alive = false;
else
window.draw(this);
}
};