从Sprites SFML的向量中绘制

Drawing from a vector of sprites SFML

本文关键字:绘制 向量 Sprites SFML      更新时间:2023-10-16

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

这是每个可绘制的可绘制对象,它从:

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);
    }
}

从可绘制的对象的示例:

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);
}

在这种情况下,Terrain Sprite在运行时只是一个白色框。我认为这是因为Loadsprite中的"纹理"answers" Sprite" VAR在方法范围内后被破坏。

我知道我可能可以通过在地形级中保存"纹理"answers" Sprite"来解决这个问题(不在现在的方法中本地创建它们)。但这对我来说似乎是不必要的,不能将它们存储在矢量mysprites和mytextures中?

我认为这是因为Loadsprite中的"纹理"answers" Sprite" Var在方法范围内被破坏了。

你是对的。sf::Sprite存储对sf::Texture的引用。loadSprite只有在您进行sprite.setTexture(myTextures.back());时才工作。但是std::vector的元素将在您的push_back时重新分配。我建议std::vector<std::shared_ptr<sf::Texture>>为简单起见。

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