私のゲーム世界のすべてのオブジェクトには、そのオブジェクトを視覚的に表現するスプライトのベクトルがあります。私の問題は、私は、画面上で適切にそれらを描くように見える傾けることです:スプライトのベクトルからの描画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にそれらを格納することはできませんか?
入力いただきありがとうございます、私は思い付いた方法を試してみました。それはスプライトとテクスチャを使用する各オブジェクトにスプライトとテクスチャを格納していることです。 terrain.hにはsf :: Textureテクスチャ、sf :: Spriteスプライト、およびloadSpriteの2つのフィールドが割り当てられていました。 – Binbon
また、mySpritesとmyTexturesのベクトルがコピーを作成する代わりにポインタを保持するように変更しました。これは重複を防ぎます – Binbon