Рисование прямоугольника с помощью SDL2

Я только начал использовать SDL2, и у меня уже есть проблема. Я хочу создать окно и нарисовать его красным цветом. Но он остается белым, и я не понимаю, почему.

Вот код:

int main (int argc, char** argv) {
    SDL_Window* pWindow = NULL;
    pWindow = SDL_CreateWindow("Jeu de la vie", SDL_WINDOWPOS_UNDEFINED,
        SDL_WINDOWPOS_UNDEFINED,
        640,
        480,
        SDL_WINDOW_SHOWN);

    SDL_Surface* pSurface = NULL;
    pSurface = SDL_GetWindowSurface(pWindow);
    SDL_FillRect(pSurface, NULL, SDL_MapRGB(pSurface->format, 255, 0, 0));

    while(1);

    SDL_FreeSurface(pSurface);
    SDL_DestroyWindow(pWindow);
    SDL_Quit();
    return EXIT_SUCCESS;
}

Ответ 1

В коде есть несколько проблем, я попытаюсь обратиться к большинству из них.

Инициализировать SDL

SDL и SDL2 необходимо инициализировать, прежде чем вы сможете его использовать. Способ инициализации SDL - это следующая функция.

int SDL_Init(Uint32 flags)

Где flags может быть другим значением для разных подсистем. Используйте SDL_INIT_EVERYTHING, чтобы инициализировать все.

int SDL_Init(SDL_INIT_EVERYTHING)

Подробнее об этом ..

Инициализировать SDL_Window и SDL_Renderer

SDL_Renderer и SDL_Window необходимо настроить, прежде чем вы сможете их использовать. Вы уже правильно создали свое окно, поэтому я не буду его освещать. Здесь, как настроить SDL_Renderer

SDL_Renderer* SDL_CreateRenderer(SDL_Window* window,
                                 int         index,
                                 Uint32      flags)

index определяет, какой драйвер использовать. Установите его в -1, чтобы использовать первый драйвер, который поддерживает другие аргументы.

flags используются для рендеринга, оптимизации программного обеспечения, предотвращения vsync и т.д. Установите его на SDL_RENDERER_ACCELERATED.

Подробнее о SDL_CreateRenderer здесь.

Смешивание SDL и SDL2

SDL_Surface прежде всего используется в SDL, а не SDL2. SDL2_image, SDL2_ttf и т.д. все еще используются SDL_Surface, но они преобразуются в SDL_Texture, прежде чем они могут быть использованы.

SDL_FillRect(...); также в основном является SDL. Но, как указано выше, можно использовать SDL_Surface, но сначала нужно преобразовать его в SDL_Texture:

SDL_Texture* SDL_CreateTextureFromSurface(SDL_Renderer* renderer,
                                          SDL_Surface*  surface)

Подробнее здесь.

И используйте

int SDL_RenderCopy(SDL_Renderer*   renderer,
                   SDL_Texture*    texture,
                   const SDL_Rect* srcrect,
                   const SDL_Rect* dstrect)

Чтобы сделать это, читайте здесь.

Бесконечный цикл (while(1);)

Вы, ДЕЙСТВИТЕЛЬНО, не должны этого делать, это будет просто навсегда. Используйте SDL_Delay( 5000 ); для паузы в течение 5000 мсек или 5 секунд.

Простейший способ

Вы можете использовать

int SDL_RenderDrawRect(SDL_Renderer*   renderer,
                       const SDL_Rect* rect)

Чтобы нарисовать прямоугольник.

Вы должны использовать

int SDL_SetRenderDrawColor(SDL_Renderer* renderer,
                           Uint8         r,
                           Uint8         g,
                           Uint8         b,
                           Uint8         a)

Чтобы установить цвет того, что вы рисуете, используйте

int SDL_RenderClear(SDL_Renderer* renderer)

После чего вы вызываете свой SDL_RenderDrawRect()

До этого момента все было нарисовано "за кулисами". Чтобы отобразить его на экране, используйте

void SDL_RenderPresent(SDL_Renderer* renderer)

Пример

#include <SDL2/SDL.h>

int main (int argc, char** argv)
{
    SDL_Window* window = NULL;
    window = SDL_CreateWindow
    (
        "Jeu de la vie", SDL_WINDOWPOS_UNDEFINED,
        SDL_WINDOWPOS_UNDEFINED,
        640,
        480,
        SDL_WINDOW_SHOWN
    );

    // Setup renderer
    SDL_Renderer* renderer = NULL;
    renderer =  SDL_CreateRenderer( window, -1, SDL_RENDERER_ACCELERATED);

    // Set render color to red ( background will be rendered in this color )
    SDL_SetRenderDrawColor( renderer, 255, 0, 0, 255 );

    // Clear winow
    SDL_RenderClear( renderer );

    // Creat a rect at pos ( 50, 50 ) that 50 pixels wide and 50 pixels high.
    SDL_Rect r;
    r.x = 50;
    r.y = 50;
    r.w = 50;
    r.h = 50;

    // Set render color to blue ( rect will be rendered in this color )
    SDL_SetRenderDrawColor( renderer, 0, 0, 255, 255 );

    // Render rect
    SDL_RenderFillRect( renderer, &r );

    // Render the rect to the screen
    SDL_RenderPresent(renderer);

    // Wait for 5 sec
    SDL_Delay( 5000 );

    SDL_DestroyWindow(window);
    SDL_Quit();

    return EXIT_SUCCESS;
}

Подробнее о SDL2 можно прочитать в блоге .