我想在屏幕上绘制仅包含结构信息的精灵,然后在其上绘制文本
信息很好 X和Y比例= 1 路径是好的并且指向图形 位置和旋转= 0;
int免费有一个不错的数字
但是文本有效 所以我不知道为什么雪碧不
我尝试通过绘图和文字使注释代码无效
struct ObjectInfo
{
float Xpoz,Ypoz;
std::string TexPath;
float Xscale,Yscale;
float Rotation;
};
ObjectInfo OI[1000];
int free;
void Draw()
{
for(int i=0;i<free;i++)
{
sf::Texture t;
t.loadFromFile(OI[i].TexPath);
sf::Sprite s;
s.setTexture(t);
s.setPosition(OI[i].Xpoz,OI[i].Ypoz);
s.setScale(OI[i].Xpoz,OI[i].Ypoz);
s.setRotation(OI[i].Rotation);
okno.draw(s);
sf::Text text;
text.setFont(font);
text.setCharacterSize(48);
text.setColor(sf::Color::Black);
text.setPosition(s.getPosition());
text.setString(IntToString(i));
okno.draw(text);
}
}
我希望精灵和文本显示 但只显示文字
答案 0 :(得分:0)
调用s.setTexture(t)
时,精灵s通过指针/引用记住纹理t。因此,当您的代码从for循环sf::Texture t
退出时被破坏(退出某个范围时C ++破坏范围变量),并且sprite类中的指针/引用指向已删除的内存位置,这会导致SFML在绘制sprite时出错。解决此问题的方法是使用纹理的全局数组。我还建议为sf :: Sprites添加全局数组,因为这会使您的代码更安全。这是它的实现方式:
//In the global scope
sf::Texture textures[1000];
sf::Sprite sprites[1000];
//void draw() new for loop
for(int i=0;i<free;i++)
{
textures[i].loadFromFile(OI[i].texPath);
sprites[i].setTexture(s);
//Set other parameters
okno.draw(s);
sf::Text text;
text.setFont(font);
text.setCharacterSize(48);
text.setColor(sf::Color::Black);
text.setPosition(s.getPosition());
text.setString(IntToString(i));
okno.draw(text);
}
顺便说一下,您的代码还有一些改进。纹理加载操作是一项繁重的操作,因此,如果纹理的路径是不可变的,我建议您添加一些立即加载纹理的方法。另外,创建文本类可能是一项繁重的操作,因此最好添加您使用的sf::Text
类的全局数组