SDL2 OSX上的SDL_GetWindowSurface和/或SDL_CreateRenderer上的渲染器无效

时间:2014-07-28 20:22:53

标签: c macos sdl sdl-2

所以我一直在玩SDL2,看看它是否符合我的需求。我正在按照介绍性的例子(主要来自lazyfoo)并做了一个简单的测试。

#include <stdio.h>
#include <SDL.h>

const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;

int main(int argc, char const *argv[]) {

    /* The window handle */
    SDL_Window* window = NULL;

    /* The surface contained in the window */
    SDL_Surface* screen_surface = NULL;

    /* Init SDL */
    if(SDL_Init(SDL_INIT_VIDEO) < 0) {
        printf("SDL could not initialize! SDL Error: %s\n", SDL_GetError());
        return 1;
    }
    else {
        /* Create window */
        window = SDL_CreateWindow(
            "SDL Window", 
            SDL_WINDOWPOS_CENTERED, 
            SDL_WINDOWPOS_CENTERED, 
            SCREEN_WIDTH, 
            SCREEN_HEIGHT, 
            SDL_WINDOW_SHOWN | SDL_WINDOW_BORDERLESS
        );

        if(window == NULL) {
            printf("Window could not be created! SDL Error: %s\n", SDL_GetError());
            return 1;
        }
        else {
            // /* Get window surface */
            screen_surface = SDL_GetWindowSurface(window);

            // /* Fill the surface white */
            SDL_FillRect(screen_surface, NULL, SDL_MapRGB(screen_surface->format, 0x50, 0x50, 0x50));

            // /* Update the surface */
            SDL_UpdateWindowSurface(window);

            printf("%s\n", SDL_GetError());

            /* Wait n secs */
            SDL_Delay(2000);

        }
    }

    /* Destroy the window */
    SDL_DestroyWindow(window);

    /* Quit SDL subsystem */
    SDL_Quit();

    return 0;
}

在OSX 10.7.5(MBA 2011)上编译:

gcc `sdl2-config --cflags --libs` -o sdl_test sdl_test.c

示例很简单。它应该初始化SDL,创建一个窗口,将一个表面附加到窗口,将颜色设置为灰色并将其渲染出来 - 两秒后它应该退出。

然而,窗户保持黑色。没有显示灰色表面。这就是我在延迟之前为SDL错误引入printf的原因。它显示Invalid renderer我已追踪到由screen_surface = SDL_GetWindowSurface(window);

触发的内容

我还尝试用

做其他方式
renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_SOFTWARE);
SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255);
SDL_RenderClear(renderer);
SDL_RenderPresent(renderer);

而不是SDL_Surface方式..但是同样的事情发生在SDL_CreateRenderer上抛出Invalid renderer。正如你所看到的,我用_SOFTWARE和_ACCELERATED标志尝试了它 - 同样的事情。

现在,这是“有趣”的部分。在第一个代码中,用SDL_Surface方式我调用了SDL_UpdateWindowSurface(window);两次 - 一个接一个。灰色显示!但是,Invalid renderer仍被抛弃,但代码可以运行。为什么要一次又一次地调用SDL_UpdateWindowSurface(window);,一次又一次调用?如果Invalid renderer被抛弃,为什么它会起作用呢?我很困惑。

  • OSX: 10.7.5
  • 编译器: i686-apple-darwin11-llvm-gcc-4.2(GCC)4.2.1(基于Apple Inc. build 5658)(LLVM build 2336.11.00)
  • SDL2: 2.0.3(通过自制软件安装)

我还尝试通过手动输入include path和libs来调用没有sdl2-config的gcc。

0 个答案:

没有答案