C++ 为什么class.setTexure()方法的行为不同?
sfml sprite class.setTexure()方法在迭代器的构造函数中不起作用,但在迭代器已经生成时起作用 我们正在尝试为正在绘制到窗口上的框架构造结构。我们正在使用sfml库,以及它们的精灵和纹理类。在frameData结构的构造函数中,我们从文件加载纹理,然后使用.setTexture()方法将其应用于精灵。编译和运行程序时,我们会遇到白块或程序崩溃,具体取决于机器 如果我们在frameData的构造函数之外创建一个指向纹理的.setTexture()指针引用,它就可以工作了 如果这是一个迭代器结构,它可以遍历不同的帧。以下是相关代码,首先是FrameData结构的标题:C++ 为什么class.setTexure()方法的行为不同?,c++,iterator,sprite,textures,sfml,C++,Iterator,Sprite,Textures,Sfml,sfml sprite class.setTexure()方法在迭代器的构造函数中不起作用,但在迭代器已经生成时起作用 我们正在尝试为正在绘制到窗口上的框架构造结构。我们正在使用sfml库,以及它们的精灵和纹理类。在frameData结构的构造函数中,我们从文件加载纹理,然后使用.setTexture()方法将其应用于精灵。编译和运行程序时,我们会遇到白块或程序崩溃,具体取决于机器 如果我们在frameData的构造函数之外创建一个指向纹理的.setTexture()指针引用,它就可以工作了 如
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::Sprite使用sf::Texture时,不能将其破坏 (即,切勿编写使用本地sf::Texture实例的函数 用于创建精灵)
因此,为这个类范围之外的纹理创建一个存储库,然后传递引用就可以了,就像推荐的strongdrink 我对此也有类似的问题。我的解决方案是将所有纹理存储在类外的容器中,并使用指向纹理的指针,而不是纹理本身。这可以一举两得,因为如果要从类中创建另一个对象,则不必存储超过1个相同纹理的对象。我也有类似的问题。我的解决方案是将所有纹理存储在类外的容器中,并使用指向纹理的指针,而不是纹理本身。如果你要从类中创建另一个对象,那么你不必存储超过1个相同纹理,这会一举两得。那么你认为问题是使用纹理本身而不是指针造成的吗?我想知道是否有文件记录。非常感谢。既然你已经解决了你的问题,你能把这个解决方案作为答案贴出来吗?这样看来,对于所有其他SO用户来说,这并不是一个公开的问题。谢谢