gpt4 book ai didi

c++ - 两个 Sprite 在单独列表中的碰撞

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:58:27 24 4
gpt4 key购买 nike

我现在尝试用 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);
}

当我放入我标记的代码部分(在右侧用//)时,我一拍摄就在调试时收到“列表迭代器不可取消引用”错误。当我删除上述代码时,它运行良好(我可以射击,走进怪物然后它们消失,等等)。因此,我想我的其余代码都可以正常工作。

那么,不同列表的迭代器之间是否可能发生冲突?如果可以,我该怎么做?

如果您需要更多信息或代码,请询问。我很高兴能得到你的帮助...

最佳答案

您使用的迭代器无效。

您的问题有多种解决方案。第一个:

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++ 风格。使用 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 活着; 民众: bool isAlive() const { 活着回来;

        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);
}
};

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

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