2017-02-28 12 views
0

私のゲーム世界のすべてのオブジェクトには、そのオブジェクトを視覚的に表現するスプライトのベクトルがあります。私の問題は、私は、画面上で適切にそれらを描くように見える傾けることです:スプライトのベクトルからの描画SFML

これは描画可能なオブジェクトであることから、すべての描画可能な継承:

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

この場合、テレインスプライトは実行時にのみ白いボックスになります。これは、メソッドが範囲外になった後にloadSpriteの "texture"と "sprite" varが破棄されるためです。

"テクスチャ"と "スプライト"を地形クラスに保存することで問題を解決できる可能性があることは知っています。しかし、これは私にとっては不必要なことです。代わりにベクトルmySpritesとmyTexturesにそれらを格納することはできませんか?

答えて

3

これは、メソッドが有効範囲外になった後にloadSpriteの "texture"と "sprite" varが破棄されるためだと思います。

あなたはそうです。 sf::Sprite stores a reference to sf::TextureloadSpriteは、sprite.setTexture(myTextures.back());を実行する場合にのみ1回だけ動作します。しかし、std::vectorの要素はpush_backとして再配分されます。簡単にするためにstd::vector<std::shared_ptr<sf::Texture>>をお勧めします。

と重複していないように、すべてのテクスチャを一度に読み込んで参照してください。

+0

入力いただきありがとうございます、私は思い付いた方法を試してみました。それはスプライトとテクスチャを使用する各オブジェクトにスプライトとテクスチャを格納していることです。 terrain.hにはsf :: Textureテクスチャ、sf :: Spriteスプライト、およびloadSpriteの2つのフィールドが割り当てられていました。 – Binbon

+0

また、mySpritesとmyTexturesのベクトルがコピーを作成する代わりにポインタを保持するように変更しました。これは重複を防ぎます – Binbon

関連する問題