【问题标题】:SFML sprite.move() not workingSFML sprite.move() 不工作
【发布时间】:2015-08-12 12:41:27
【问题描述】:

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

武器.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);
}

发生的情况是射击在玩家的位置产生,但它们并没有移动。相反,他们有点振动,好像他们想移动但有什么东西阻止了他们。如果您需要更多代码,请告诉我。

【问题讨论】:

    标签: c++ sfml


    【解决方案1】:

    问题很可能在循环中

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

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

    使用 references 代替循环:

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

    【讨论】:

      猜你喜欢
      • 2015-06-07
      • 2016-11-10
      • 2013-08-27
      • 1970-01-01
      • 1970-01-01
      • 2019-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-14
      相关资源
      最近更新 更多