【问题标题】:SFML Loading images from txt file into vector only loads last imageSFML 将 txt 文件中的图像加载到矢量中仅加载最后一张图像
【发布时间】:2018-03-28 17:54:44
【问题描述】:

我正在尝试将 6 张图片加载到我的状态机中的 std::vector(sf::Sprite) 中。状态机工作正常,所以我怀疑这是问题所在。

我有一个 .txt 文件,其中包含图像的文件名

1.png
2.png
3.png
4.png
5.png
6.png

图像本身位于img/ 目录中。

以下是相关代码:

std::ifstream file("images.txt");

while (!(file.eof()))
{
    getline(file, TmpString);
    filename.push_back(TmpString);
}

TmpString 只是一个字符串变量,用于存储单个图像的文件名。 filename 是一个字符串向量,使用断点,我可以看到它有正确的字符串(也就是正确的文件名)。

在下一个循环中,我使用loadFromFile() 将图像加载到名为tempTexsf::Texture 中。我设置了sf::Sprite称为tempSprite 的纹理并将其添加到spriteList,即std::vector<sf::Sprite>

for (size_t i = 0; i < filename.size(); i++)
{
    tempTex.loadFromFile("img/" + filename[i]);
    tempSprite.setTexture(tempTex, true);
    spriteList.push_back(tempSprite);
}

问题是,每当我从 spriteList 向窗口绘制任何精灵时,它始终是 6.png 图像。那就是:

m_window.draw(spriteList[index]) 总是绘制6.png 无论索引是什么。

【问题讨论】:

  • @NeilButterworth 将 while 循环更改为 while(file &gt;&gt; TmpString),然后添加到字符串向量中没有任何作用。就像我在问题中所说的那样,我已经通过调试检查了字符串向量是否包含正确的文件名,while 循环不是问题。问题出在 for 循环中,但我无法调试以查看每个索引中的图像。 spriteList 仅包含所有索引上的6.png 图像。

标签: c++ sfml


【解决方案1】:

SFML Sprites and Textures 教程说

当你设置一个精灵的纹理时,它在内部所做的只是存储一个指向纹理实例的指针。因此,如果纹理被破坏或移动到内存中的其他位置,则精灵最终会得到一个无效的纹理指针。

根据我的理解,这也意味着如果您将新纹理加载到同一个对象中,它将被覆盖。精灵仍将指向现在已更改的相同纹理。您需要保留一组纹理。

【讨论】:

  • 是的,这似乎是问题所在,我尝试制作一个sf::Texture 数组,其中每个索引通过.loadFromFile() 分配其自己的纹理,然后将每个精灵设置在sf::Sprite 数组中到纹理数组的每个索引。这也不起作用,这让我感到困惑,因为纹理数组在初始化后根本没有被操纵。我最终制作了六个 sf::Texture 对象并这样做,我确信这在技术上不是正确的方式......
猜你喜欢
  • 2020-05-06
  • 1970-01-01
  • 1970-01-01
  • 2013-12-10
  • 2017-11-09
  • 2014-01-21
  • 2012-11-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多