SFML图像无法加载

3

我正在使用 Xcode 和 SFML。我将我的文件放在 Xcode 项目中,然后它被复制到目录中。但是,我仍然无法将其加载到程序中。有什么建议吗?

代码:

int main(int argc, const char * argv[])
{
    sf::RenderWindow(window);
    window.create(sf::VideoMode(800, 600), "My window");

    sf::Texture img;
    if(!img.loadFromFile("colorfull small.jpg")) return 0;

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

    window.draw(sprite);
    window.display();

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

编译器: enter image description here

目录: enter image description here

谢谢

3个回答

2

我有些惊讶,“正确答案”下面的评论说它不起作用...无论如何:

你的渲染(绘画)需要在每次循环迭代中进行:

int main(int argc, const char * argv[])
{
    sf::RenderWindow(window);
    window.create(sf::VideoMode(800, 600), "My window");

    sf::Texture img;
    if(!img.loadFromFile("colorfull small.jpg")) return 0;

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

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

        // drawing needs to take place every loop right HERE 
        window.clear();
        window.draw(sprite);
        window.display();
    }

    return 0;
}

为什么每次调用事件时都需要重新绘制它?我只想绘制一次并让其显示,而不改变任何关于它的内容。 - Sam
2
这不是计算机的工作方式。如果你只画一次,你的窗口就不会重新绘制,看起来就像你的程序崩溃了一样。运行程序意味着一直绘制图形。如果你有商业程序,它们可能只在特定事件发生时重新绘制,比如大小改变或其他窗口覆盖你的窗口并被移除,但总体上...你需要频繁地重新绘制。只需看看教程。它们甚至说你不必担心每帧重新绘制1000个项目...那远低于今天图形卡的性能。 - nvoigt

2

出现错误的原因有几个:

根据sfml文档

某些格式选项不受支持,例如渐进式jpeg。

或者

它找不到文件,因为文件名中有空格(请重命名文件,例如colorfull_small.jpg)

或者

程序的工作目录没有 .jpg 文件(您可以使用 getcwd(NULL) 将其打印出来(在 #include <unistd.h> 中可用))


谢谢。我把名字改成了colorful_small.jpg,但没有帮助。然后我下载了一个PNG文件,想找出渐进式JPEG是否是问题所在。结果还是出现了同样的错误。不过我不确定该如何完成你解决方案的最后一部分。我已经包含了你告诉我的库,并且执行了cout << getcwd(NULL); 但它说不知道getcwd是什么意思。你能否进一步解释一下我该怎么做呢?谢谢。 - Sam

1

引用官方教程:

该项目在main.cpp中提供了一个基本示例和一个帮助函数:ResourcePath.hpp和ResourcePath.mm中的std :: string resourcePath(void)。 正如提供的示例所说明的那样,此函数的有用性在于以方便的方式访问应用程序包的Resources文件夹。

这意味着您需要编写类似以下内容的内容:

#include "ResourcePath.hpp"
:
:
if (!icon.loadFromFile(resourcePath() + "colorfull small.jpg")) {
:
:

受项目模板生成的默认代码启发。

nvoigt的回答也非常重要。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接