为什么类.setTexure()方法的行为有所不同?

时间:2012-06-20 22:35:13

标签: c++ iterator sprite textures sfml

sfml sprite类.setTexure()方法在迭代器的构造函数内部不起作用,但在迭代器已经生成时才起作用

我们正在尝试为正在绘制到窗口上的帧构建结构。我们正在使用sfml库及其精灵和纹理类。在frameData结构的构造函数中,我们从文件加载纹理,然后使用.setTexture()方法将其应用于sprite。在编译和运行程序时,我们要么根据机器出现白色块或程序崩溃。

如果我们在frameData的构造函数外创建一个指向纹理的指针引用.setTexture(),它就可以了!

所有这些都是迭代器结构迭代不同的帧。以下是相关代码,首先是在FrameData结构的标题中:

private:
    struct FrameData
    {
        FrameData(const std::string& fileName, int frameDelay);

        sf::Texture texture;
        sf::Sprite sprite;
        unsigned int frameDelay;
    };

其次,这是实际的构造函数,不起作用:

const sf::Sprite& SpriteAnimator::currentFrame() const
{
    return currentFrame_->sprite;
}

SpriteAnimator::FrameData::FrameData(const std::string& fileName, int frameDelay)
: frameDelay(frameDelay)
{
    texture.loadFromFile(fileName);
    sprite.setTexture(texture);
}

第三,这就是工作:

const sf::Sprite& SpriteAnimator::currentFrame() const
{
    currentFrame_->sprite.setTexture(currentFrame_->texture);
    return currentFrame_->sprite;
}

SpriteAnimator::FrameData::FrameData(const std::string& fileName, int frameDelay)
: frameDelay(frameDelay)
{
    texture.loadFromFile(fileName);
    sprite.setTexture(texture);
}

关于为什么会发生这种情况的任何想法,我们都错过了什么?我们希望构造函数正常工作,当前帧的返回频率比纹理更改频繁,因此每次返回当前帧时都不需要更新纹理。

谢谢!

2 个答案:

答案 0 :(得分:1)

<强>解决!阅读sf :: sprite的类文档的最后一段:

  

重要的是要注意sf :: Sprite实例不会复制   它使用的纹理,它只保留对它的引用。因此,一个   sf ::在sf :: Sprite使用时,不得销毁纹理   (即从不编写使用本地sf :: Texture实例的函数   用于创建精灵)。

因此,为此类范围之外的纹理创建存储库,然后传递引用,比如推荐的strongdrink!

答案 1 :(得分:1)

我遇到了类似的问题。我的解决方案是将所有纹理存储在类之外的容器中,并使用指向纹理的指针而不是纹理本身。如果您打算从班级中创建另一个对象,则可以一石二鸟,因为您不必存储多于1个相同的纹理。