SFML sprite.move() not working

SFML sprite.move() not working

本文关键字:not working sprite move SFML      更新时间:2023-10-16

我正在用SFML制作一款游戏,我试图添加射击,但由于某种原因sprite.move()似乎不起作用。以下是相关代码:

Weapon.cpp

void Weapon::update(float delta, sf::RenderWindow& window, Player player) {
    for (auto s : shots) {
        s.move(delta);
        s.draw(window);
    }
    switch (type) {
    case RANGED:
        if (sf::Mouse::isButtonPressed(sf::Mouse::Left)) {
            shots.push_back(Shot(shot, player.position, Helper::getMousePos(window)));
            Helper::log(std::to_string(shots.size()));
        }
        break;
    case MELEE:
        break;
    }
}

Shot.cpp

Shot::Shot(sf::Sprite sprite_, sf::Vector2f origin, sf::Vector2f target)
{
    sprite = sprite_;
    sprite.setPosition(origin);
    direction = Helper::normalizeVector(target - origin);
    speed = 200;
}
void Shot::move(float delta) {
    sprite.move(direction * speed * delta);
}
void Shot::draw(sf::RenderWindow& window) {
    window.draw(sprite);
}

发生的是镜头在玩家的位置刷出,但它们不移动。相反,它们有点振动,好像它们想要移动,但有什么东西阻止了它们。如果您需要更多代码,请告诉我。

问题很可能在循环

for (auto s : shots) {
    s.move(delta);
    s.draw(window);
}

在这里,您按值创建循环变量s ,这意味着它是容器中元素的副本。修改副本当然不会修改原件。

使用引用代替循环:

// Notice the ampersand here
//       |
//       v
for (auto& s : shots) {
    s.move(delta);
    s.draw(window);
}