我正在尝试使用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;
}
同样的问题
答案 0 :(得分:2)
使用通灵调试,Mover
类型无法正确移动isDead
查询的状态。