从Sprites SFML的向量中绘制
Drawing from a vector of sprites 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);
}
在这种情况下,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来引用它们。
相关文章:
- 写入向量<向量<bool>>
- 函数向量_指针有不同的原型,我可以构建一个吗
- std::向量与传递值的动态数组
- 将值指定给向量(2D)的向量中的某个位置
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 如何使用向量的template_back函数
- 尝试通过多个向量访问变量时,向量下标超出范围
- 如何通过派生类函数更改基类中的向量
- C++从另一个类访问公共静态向量的正确方法是什么
- 如何将ampl中的集合表示为c++中的向量
- 变量没有改变?通过向量的函数调用
- 迭代时从向量和内存中删除对象
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- 创建要在类中使用的向量向量,并使用 CERNROOT 绘制
- C++ SFML 创建形状向量并在函数中绘制它们
- 使用向量的向量在OpenGL中绘制地面
- 从Sprites SFML的向量中绘制
- 如何在C++中创建一个网格,这将允许我将每个索引设置为一个向量,以便以后操作该向量,然后绘制它
- 绘制一个向量<glm::vec3> opengl c++
- 在向量中包含的点之间绘制线(VC++)