C ++ remove_if删除所有后续元素

时间:2016-10-15 00:22:43

标签: c++ vector lambda iterator sfml

我正在尝试使用c ++和SFML2创建一个小游戏,当我尝试删除敌人对象时,我会遇到这个问题。

我有一个"僵尸"类型" Mover"当我尝试用这个lambda函数从矢量中删除一个特定的僵尸时:

zombies.erase(remove_if(zombies.begin(), zombies.end(), [](Mover& m) {return m.isDead(); }), zombies.end());

它会删除向量的所有后续元素(如果我有10个元素向量,并且我尝试擦除第8个元素,它将擦除元素num 8,9和10)。

我还在学习这门语言,所以这可能是一个非常愚蠢的错误,但我一直在寻找解决方案很长一段时间我找不到任何东西,关于lambdas和remove_if函数的示例代码看起来一样对我而言。

感谢您的帮助

- - - - - - - - 编辑

这是isDead函数:

bool Mover::isDead() { return hp.isEmpty(); }

检查hp是否小于或等于0.

当我添加新的僵尸时,会发生这种情况:

vector<Mover> zombies;

Mover z;

z.init(Vector2f(100, 100), Animator(120, Vector2f(512, 896), Vector2f(128, 128), texManager.get("zombie"), Vector2i(8, 1)));
z.setMaxSpeed(0.08);
z.setAngularVelocity(0.3);

for (int k = 0; k < 20; k++)
{
    z.setPosition(z.getPosition().x + 10, z.getPosition().y + 10);
    z.randomAnimation();
    zombies.push_back(z);
}

问题可能在这里吗?也许我在使用init(下面的代码)做错了,但我不确定这种初始化是否适用于我所拥有的其他类型的实体(例如es pro procctiles)。

void Mover::init(Vector2f _position, Animator _animator)
{
    setPosition(_position);
    animator = _animator;
    size = animator.getSize();
    rect.setSize(size);
    tex = animator.getTexture();
    sprite.setTexture(*tex);
    hp.init(15);
}

- - - - - - - - 编辑

刚刚添加了复制构造函数:

►Mover

声明

Mover(const Mover& other);

定义

Mover::Mover(const Mover& other) : Entity(other)
{
    velocity = other.velocity;
    acceleration = other.acceleration;
    maxSpeed = other.maxSpeed;
    maxForce = other.maxForce;
    animator = other.animator;
    aVelocity = other.aVelocity;
    speedModifier = other.speedModifier;
    hp = other.hp;
}

►实体

声明

Entity(const Entity& other);

定义

Entity::Entity(const Entity& other) : Transformable(other), Drawable(other)
{
    size = other.size;
    rect = other.rect;
    tex = other.tex;
    sprite = other.sprite;
}

同样的问题

1 个答案:

答案 0 :(得分:2)

使用通灵调试,Mover类型无法正确移动isDead查询的状态。