为什么该代码不绘制精灵C++ SFML



我想在屏幕上绘制精神

信息很好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);
    }
}

我期望精灵和文本显示但是只有文本显示

呼叫s.setTexture(t) Sprite S通过指针/参考来记住纹理t。因此,当您的代码从循环中退出时,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类的全局数组是很好的

最新更新