在SDL_GetWindowSurface和/或SDL_CreateRenderer在OSX SDL

2019-09-28 02:15发布

所以,我一直在玩弄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,创建一个窗口,一个表面附着到窗口,设置颜色为灰色,呈现出来 - 两秒钟,这两点应该退出之后。

然而,窗口保持黑色。 示出没有灰色表面。 这就是为什么我介绍了一个printf进行延迟之前SDL的错误。 它示出了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方式..但同样的事情发生Invalid renderer抛出的SDL_CreateRenderer。 正如你所看到的,我_SOFTWARE和_ACCELERATED标志尝试了 - 同样的事情。

现在,这里的“搞笑”的一部分。 在第一个代码,与SDL_Surface方式我称之为SDL_UpdateWindowSurface(窗口); 两次 - 一前一后。 灰色节目! 然而, Invalid renderer仍然抛出,但代码工作。 为什么会调用SDL_UpdateWindowSurface(window); 两次,一前一后,工作,一旦它不会? 为什么会如果它在所有的工作Invalid renderer被抛出? 我深感不解。

  • OSX:10.7.5
  • 编译:i686的-苹果darwin11-LLVM-GCC-4.2(GCC)4.2.1(基于苹果公司建立5658)(LLVM构建2336.11.00)
  • SDL2:2.0.3(通过自制安装)

我还试图通过手动键入包括路径和库调用的gcc而不SDL2-配置。

文章来源: SDL2 Invalid renderer on SDL_GetWindowSurface and/or SDL_CreateRenderer on OSX
标签: c macos sdl sdl-2