C++ - SDL无法工作

3

我尝试按照this教程学习使用SDL显示图像的基础知识。但是,当我运行程序时,它返回一个空白屏幕。图片在正确的目录中,但在程序中没有显示出来。我做错了什么吗?我真的希望SDL能够正常工作。

编辑

这是我的代码:

#include <SDL/SDL.h>

using namespace std;

int main(int argc, char *argv[])
{
    SDL_Surface *hello;
    SDL_Surface *screen;
    SDL_Init(SDL_INIT_EVERYTHING);
    screen = SDL_SetVideoMode(640, 480, 32, SDL_SWSURFACE);
    hello = SDL_LoadBMP("hello.bmp");
    SDL_BlitSurface(hello, NULL, screen, NULL);
    SDL_Flip(screen);
    SDL_Delay(2000);
    SDL_FreeSurface(hello);
    SDL_Quit();
    return 0;
}

我不知道你是否做错了什么,因为你没有发布任何代码。 - Yacoby
你能让我们看到你的确切程序吗? - James
不确定是否相关,但教程指出:“一些 Linux 用户可能会运行并得到一个空白屏幕。尝试从命令行中运行程序。” - Steve S
1
就我所知,这段代码在我的系统上(一个旧版的Ubuntu)可以正常工作。 - Steve S
它在我的电脑上运行正常(Mandriva 2011)。 - Qchmqs
我使用了一个随机的 BMP 文件进行测试,我认为问题出在你的 BMP 文件上。 - Qchmqs
5个回答

2
使用SDL_GetError()函数可以找出SDL_LoadBMP()在加载位图时失败的原因。
还可以阅读这个帖子

谢谢,它返回的错误是SDL_UpperBlit:传递了一个空表面。那是什么意思? - Greg Treleaven
奇怪...SDL版本和操作系统? - gabriev82
SDL 1.2,Windows Vista Home Premium x86。该教程可能是针对不同版本的吗? - Greg Treleaven
你可以尝试使用gdb检查表面是如何形成的,它是否具有正确的图像数据? - Masse

1

我以为几个月前已经修复了这个问题,但似乎还没有。我又重新编译了一遍,很奇怪居然就可以了。


1

尝试使用SDL_UpdateRect(screen,0,0,0,0)代替SDL_Flip(screen)


0
请确保hello.bmp文件在您当前的目录中,并且它是一个可读且有效的BMP文件。

它只能采用某种特定格式进行BMP处理吗,例如16位? - Greg Treleaven
它应该支持任何 Windows BMP 文件;如果您可以使用标准的 Windows 查看器查看 BMP,则足够好。您确定您正在运行进程的相同目录中存储您的 hello.bmp 吗?您是否使用命令行运行程序? - Igor Krivokon
它在相同的目录中,我尝试过使用命令行和查看器。还有其他解释吗? - Greg Treleaven

0
在这行代码中:"hello = SDL_LoadBMP("hello.bmp");",请尝试使用"/hello.bmp"代替"hello.bmp"。我也遇到了同样的问题,但是似乎在文件名前加上斜杠("/")有助于找到并渲染图像,即使它不在程序所在的目录中。
如果您使用的是Windows系统,请使用"c://hello.bmp"代替"/hello.bmp"。第一个是针对Mac系统的。(:
编辑:算了吧,我刚才意识到这实际上行不通,之前它能够工作只是因为我将文件放在了磁盘目录下。

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