SDL无法使用文件和标头加载媒体

时间:2015-09-17 11:13:05

标签: c++ sdl-2

我刚开始关注Lazy Foo's SDL tutorial。我的问题是关于第02课的代码,所以我认为这是非常基本的。我不得不说我也没有太多的C ++经验!

Lazy Foo提供的代码在我的机器上运行正常(Windows-Code :: Blocks)。但是,作为练习,我试图将示例函数移动到一个单独的文件(带有相应的头文件)。我还将变量移到main中,以避免全局变量。我需要实现的唯一真正的改变是为我的函数包含一些输入变量,因为我不会依赖于全局变量。

我的代码已编译,但无法根据需要上传图片。这里有简单函数的代码:

bool loadMedia(SDL_Surface* gHelloWorld) {
//Loading success flag
bool success = true;

//Load splash image
gHelloWorld = SDL_LoadBMP("hello_world.bmp");
if(gHelloWorld == NULL) {
    printf("Unable to load image %s! SDL Error: %s\n", "hello_world.bmp",
        SDL_GetError());
    success = false;
}

return success;

这就是我称之为该功能的地方:

    if(!loadMedia(gHelloWorld)) {
        printf( "Failed to load media!\n" );
    } else {
        //Apply the image
        SDL_BlitSurface( gHelloWorld, NULL, gScreenSurface, NULL );

        //Update the surface
        SDL_UpdateWindowSurface( gWindow );

        //Wait two seconds
        SDL_Delay( 2000 );
    }

使用调试器我注意到gHelloWorld永远不会更新它的值,这与Lazy Foo给出的原始示例不同。由于gHelloWorld是一个指针,我相信这应该可以正常工作。

这里发生了什么?

非常感谢你的帮助!

巴勃罗

1 个答案:

答案 0 :(得分:1)

您需要另一个指针级别来实际修改调用函数中的变量:

bool loadMedia(SDL_Surface** gHelloWorld) {
    ...
    *gHelloWorld = SDL_LoadBMP("hello_world.bmp");
    if(*gHelloWorld == NULL) {
    ...

并将其称为:

SDL_Surface *gHelloWorld;
if(!loadMedia(&gHelloWorld)) {

说明:在C中,使用指针时几乎没有幕后魔术。 SDL_LoadBMP创建一个新的SDL_Surface并将指针返回到该表面。您的函数仅将该指针(即地址)存储在局部变量中,但不会修改调用函数中的变量。为此,您需要使用&运算符在调用函数中传递变量的地址,并使用*将值存储在该地址的指针中。

lazy foo示例中的代码有效,因为gHelloWorld是一个全局变量。

由于你使用的是C ++,你也可以使用参考参数(这会做一些幕后魔术)。