为什么类 .setTexure() 方法的行为不同
Why class .setTexure() method behaves differently?
sfml 精灵类 .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);
}
关于为什么会发生这种情况的任何想法,我们是否错过了什么?我们希望构造函数正常工作,当前帧的返回频率比纹理更改的频率高得多,因此我们不需要每次返回当前帧时都更新纹理。
谢谢!
解决了!阅读 sf::sprite 类文档的最后一段:
需要注意的是,sf::Sprite 实例不会复制 它使用的纹理,它只保留对它的引用。因此,一个 sf::纹理在被sf::精灵使用时不得破坏 (即永远不要编写使用本地 sf::Texture 实例的函数 用于创建精灵)。
因此,为此类范围之外的纹理创建一个存储库,然后传递引用就可以了,就像推荐的 strongdrink 一样!
我也有类似的问题。我的解决方案是将所有纹理存储在类外部的容器中,并使用指向纹理的指针而不是纹理本身。这会用一块石头杀死 2 只鸟,因为如果您要从类中创建另一个对象,则不必存储超过 1 只相同纹理的鸟。
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 通过方法访问结构
- 最小硬币更换问题(自上而下方法)
- C++为构建时间获取QDateTime的可靠方法
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 有什么方法可以遍历结构吗
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 使用std::函数映射对象方法
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- C++从另一个类访问公共静态向量的正确方法是什么
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 没有为自己的结构调用列表推回方法
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 在类定义之后定义一个私有方法
- 枚举环境变量的惯用C++14/C++17方法
- 为什么类 .setTexure() 方法的行为不同