【问题标题】:Why that code don't draw sprites C++ SFML为什么该代码不绘制精灵 C++ SFML
【发布时间】:2019-11-08 18:44:09
【问题描述】:

我想在屏幕上绘制精灵,在我的结构中只有关于它的信息,然后在上面绘制文本

资料不错 X 和 Y 比例=1 路径很好,指向图形 位置和旋转 =0;

int free 有一个很好的数字

但文本有效 所以我不知道为什么雪碧没有

我尝试用绘图注释代码并使文本不起作用

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.setScale(OI[i].Xpoz,OI[i].Ypoz); 为什么使用位置而不是比例值?

标签: c++ textures sprite sfml


【解决方案1】:

当您调用s.setTexture(t) 时,精灵 s 通过指针/引用记住纹理 t。因此,当您的代码从 for 循环 sf::Texture t 退出时被销毁(退出某个范围时 C++ 销毁范围变量)并且精灵类中的指针/引用指向已删除的内存位置,这会导致 SFML 在绘制精灵时出错。此问题的解决方案是您使用的纹理的全局数组。我还建议为 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 类的全局数组

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-19
    • 1970-01-01
    相关资源
    最近更新 更多