c++ - 为什么类 .setTexure() 方法的行为不同?

标签 c++ iterator sprite textures sfml

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

我们正在尝试为绘制到窗口上的框架构建结构。我们正在使用 sfml 库及其 Sprite 和纹理类。在frameData结构的构造函数中,我们从文件加载纹理,然后使用.setTexture()方法将其应用到 Sprite 上。当我们编译和运行程序时,我们要么得到白 block ,要么程序崩溃,具体取决于机器。

如果我们在frameData的构造函数之外使用.setTexture()创建对纹理的指针引用,它就可以工作!

如果这是一个迭代器结构,可以迭代不同的帧,则所有这些。这是相关代码,首先是 FrameData 结构的 header :

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);
}

关于为什么会发生这种情况,我们有什么想法吗?我们是否遗漏了什么?我们希望构造函数能够正常工作,当前帧的返回频率比纹理更改的频率要高得多,因此我们不需要每次返回当前帧时都更新纹理。

谢谢!

最佳答案

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

It is important to note that the sf::Sprite instance doesn't copy the texture that it uses, it only keeps a reference to it. Thus, a sf::Texture must not be destroyed while it is used by a sf::Sprite (i.e. never write a function that uses a local sf::Texture instance for creating a sprite).

因此,为此类范围之外的纹理创建一个存储库,然后传递引用就可以了,就像推荐的 Strongdrink 一样!

关于c++ - 为什么类 .setTexure() 方法的行为不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11129167/

相关文章:

C++ 映射 : add pair to the end of the map

c++ - Visual C++ 的奇怪错误

c# - 将 C++ 代码转换为 C# 用于加密算法

arrays - 迭代 `setindex!`

c++ - opencv 访问 CV_32FC3 BGR cv::Mat 的颜色元素

c++ - 我可以使用 lambda 来简化 for 循环吗

java - spring中的Model对象刷新页面时获取空值

python - 当pygame中两个图像碰撞时如何使变量输出 'True'

python - Pygame - Sprite 与 Sprite 组的碰撞

java - Java 和 C++ 中的迭代器有什么区别?