【问题标题】:Why class .setTexure() method behaves differently?为什么类 .setTexure() 方法的行为不同?
【发布时间】:2012-06-20 22:35:13
【问题描述】:

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

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

如果我们在 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 只鸟,因为如果要从该类中创建另一个对象,您不必存储超过 1 个相同的纹理。
  • 那么您认为问题出在使用纹理本身而不是指针上吗?我想知道这是否记录在案。谢谢!
  • 既然您解决了您的问题,您可以发布解决方案作为答案吗?这样一来,对于所有其他 SO 用户来说,它看起来就不是一个悬而未决的问题。谢谢!

标签: c++ iterator sprite textures sfml


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    我遇到了类似的问题。我的解决方案是将所有纹理存储在类外部的容器中,并使用指向纹理的指针而不是纹理本身。这会用一块石头杀死 2 只鸟,因为如果您要从该类中创建另一个对象,则不必存储超过 1 个相同的纹理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-28
      • 2016-10-31
      • 1970-01-01
      • 2019-02-12
      • 1970-01-01
      • 2011-11-10
      • 1970-01-01
      • 2020-04-27
      相关资源
      最近更新 更多