【问题标题】:Loading a texture in sfml在 sfml 中加载纹理
【发布时间】:2014-08-13 01:59:05
【问题描述】:

我开始学习 SFML,我想创建精灵来从文件中加载图像,所以我只是按照教程做了很明显的事情。

sf::Texture texture;
texture.loadFromFile("C:\image.png");

sf::Sprite sprite;
sprite.setTexture(texture);
window.draw(sprite);

当我启动程序时,我只得到一个白屏和“itsprgps.exe 中 0x50CEDEDA (msvcr110.dll) 处的未处理异常:0xC0000005:访问冲突读取位置 0x00524000。”,控制台也充满了随机符号。我试图寻找一些信息,但我只是发现“如果纹理被破坏或移动到内存中的其他位置,精灵最终会得到一个无效的纹理指针”,这对某些人来说可能很明显,但我是新手,他们不要给出任何有效的例子。

我正在使用 SFML 2.1 和 Visual Studio 2013

编辑:

这是我的代码示例,其中没有我在尝试加载纹理之前绘制的所有形状:

包括“stdafx.h”

int main()
{
 sf::RenderWindow window(sf::VideoMode(557, 500), "My window");

while (window.isOpen())
{
    sf::Event event;
    while (window.pollEvent(event))
    {
        if (event.type == sf::Event::Closed)
            window.close();
    }

    window.clear(sf::Color(255, 255, 255));

    sf::Texture texture;
    texture.loadFromFile("C:\roads.png");

    sf::Sprite sprite;
    sprite.setTexture(texture);
    window.draw(sprite);

    window.display();
}

return 0;
}

我还意识到其他事情......我也无法加载字体,它发生完全相同的事情,我想我知道为什么。当我开始项目时,我添加了用于发布而不是调试的库(“sfml-system.lib;sfml-main.lib;sfml-graphics.lib;sfml-window.lib;”而不是“sfml-system-d. lib;sfml-main-d.lib;sfml-graphics-d.lib;sfml-window-d.lib;") 所以我认为这实际上可能是问题所在,所以我试图解决它,但我遇到了另一种问题。

长话短说:我尝试了正确的调试和发布配置,但我得到了不同的错误,首先,我缺少一个 MSVCR110D.dll,所以出于好奇,我下载了它并将它放在调试文件夹中,现在我得到 0xc000007b。我尝试了不同的配置,唯一可行的配置是使用发布库进行调试(到目前为止尝试加载纹理或字体时除外)。

【问题讨论】:

  • loadFromFile 返回一个bool。请检查返回值是否加载成功。
  • 问题可能在于window的初始化,请提供一个重现问题的最小可编译示例。
  • 在原帖中添加了示例,还添加了一些注释,请查看。
  • 混合调试/发布配置不好...stackoverflow.com/a/20215509/520217
  • 是的,我意识到了这一点,但我似乎有问题,我认为我的系统缺少一些重要文件或其他东西

标签: c++ sfml


【解决方案1】:

("C:\image.png"); 更改为("C:\\image.png");

很可能是单个反斜杠导致了问题,因为它是一个转义字符。

此外,您应该检查来自loadFromFile 的返回值以确保它成功。

【讨论】:

  • 反斜杠不是问题,loadFromFile 的结果也是 true。
【解决方案2】:

我建议您将负责加载纹理的代码移出循环并检查其返回值。 如果这不能解决问题,您可以遇到或排除与多个加载图像相关的任何问题。

代码:

int main()
{
    sf::RenderWindow window(sf::VideoMode(557, 500), "My window");

    sf::Texture texture;
    if(!texture.loadFromFile("C:\roads.png"))
    {
        std::cerr << "failed to load image" << std::endl;
        exit(1);
    }

    sf::Sprite sprite;
    sprite.setTexture(texture);

    while (window.isOpen())
    {
        sf::Event event;
        while (window.pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
                window.close();
        }

        window.clear(sf::Color(255, 255, 255));
        window.draw(sprite);
        window.display();
    }
}

【讨论】:

    【解决方案3】:

    您似乎需要为您的 Visual Studio 版本安装 Visual C++ Redistributable,您可以在 microsoft 的网站上下载。

    【讨论】:

      【解决方案4】:

      在调试模式下的“链接器输入”配置中,确保将“-d”添加到附加文件中!

      示例:sfml-system-d.lib

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-07-21
        • 2021-02-01
        • 1970-01-01
        • 2016-04-14
        • 1970-01-01
        • 1970-01-01
        • 2020-05-06
        相关资源
        最近更新 更多