【问题标题】:Drawing from a vector of sprites SFML从精灵向量中绘制 SFML
【发布时间】:2017-02-28 11:42:27
【问题描述】:

我的游戏世界中的每个对象都有一个精灵向量,可以直观地表示该对象。我的问题是我似乎无法在屏幕上正确绘制它们:

这是每个可绘制对象都继承自的可绘制对象:

class Drawable {
private:
    static vector<Drawable*> sprites;
protected:
    vector<sf::Texture> myTextures;
    vector<sf::Sprite> mySprites;
public:
    Drawable();
    static vector<Drawable*> getSprites();
    void draw(sf::RenderWindow&) const;
};

及其 .cpp:

vector<Drawable*> Drawable::drawables;
Drawable::Drawable() {
    drawables.push_back(this);
}

vector<Drawable*> Drawable::getDrawables() {
    return drawables;
}

void Drawable::draw(sf::RenderWindow& window) const {
    for (auto sprite : mySprites) {
        window.draw(sprite);
    }
}

继承自drawable的对象示例:

class Terrain : public Drawable {
private:
    void loadSprite(string);
public:
    Terrain(string);
};

及其 .cpp:

Terrain::Terrain(string fileName) {
    loadSprite(fileName);
}

void Terrain::loadSprite(string fileName) {
    sf::Texture texture;
    texture.loadFromFile(fileName);
    myTextures.push_back(texture);

    sf::Sprite sprite;
    sprite.setTexture(texture);
    mySprites.push_back(sprite);
}

在这种情况下,地形精灵在运行时只是一个白盒。我认为这是因为 loadSprite 中的“纹理”和“精灵”变量在方法超出范围后被破坏。

我知道我可以通过在地形类中保存“纹理”和“精灵”来解决这个问题(而不是像现在这样在本地创建它们)。但这对我来说似乎没有必要,我不能将它们存储在向量 mySprites 和 myTextures 中吗?

【问题讨论】:

    标签: c++ sfml


    【解决方案1】:

    我认为这是因为 loadSprite 中的“纹理”和“精灵”变量在方法超出范围后被销毁。

    你是对的。 sf::Sprite stores a reference to sf::Texture。 loadSprite 只有在你愿意 sprite.setTexture(myTextures.back()); 时才会工作一次。但是std::vector 的元素将被重新分配为您push_back。为简单起见,我推荐std::vector&lt;std::shared_ptr&lt;sf::Texture&gt;&gt;。

    更好的是,一次加载所有纹理,这样您就没有重复并使用 ID 来引用它们。

    【讨论】:

    • 感谢您的输入,我尝试了我想出的方法。那就是将精灵和纹理存储在使用它们的每个对象中。因此,terrain.h 将有两个字段 sf::Texture 纹理,sf::Sprite sprite 和 loadSprite 我分配了它们并且它起作用了:)
    • 我也进行了更改,以便向量 mySprites 和 myTextures 现在保存指针(而不是制作副本),这样可以防止重复
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 2013-05-31
    • 1970-01-01
    • 2014-02-16
    • 2019-03-10
    相关资源
    最近更新 更多