在单独列表中的两个精灵的碰撞

Collision of two sprites in separate lists

本文关键字:两个 精灵 碰撞 单独 列表      更新时间:2023-10-16

我目前尝试在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);
}

当我将标记的代码部分放入(右侧//)时,我会在拍摄后立即进行调试时,我会得到"列表迭代器不可抵消"。当我剪掉上述代码时,它运行良好(我可以射击,走进怪物,它们消失等)。因此,我想我的代码的其余部分都在起作用。

那么,不同列表的迭代器之间是否可能发生碰撞?如果是这样,我该怎么做?

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

您使用的迭代器无效。

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

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