所以我一直在玩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
被抛弃,为什么它会起作用呢?我很困惑。
我还尝试通过手动输入include path和libs来调用没有sdl2-config的gcc。