web-dev-qa-db-fra.com

Dessiner un rectangle avec SDL2

Je viens de commencer à utiliser SDL2 et j'ai déjà un problème. Je veux créer une fenêtre et la peindre en rouge. Mais il reste blanc, et je ne comprends pas pourquoi.

Voici le code:

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;
}
14
Utundu

Il y a plusieurs problèmes avec votre code, je vais essayer de résoudre la plupart d'entre eux.

Initialiser SDL

SDL et SDL2 doivent être initialisés avant de pouvoir l'utiliser. La façon d'initialiser SDL est la fonction suivante.

int SDL_Init(Uint32 flags)

flags peut être une valeur différente pour différents sous-systèmes. Utilisez SDL_INIT_EVERYTHING Pour tout initialiser.

int SDL_Init(SDL_INIT_EVERYTHING)

En savoir plus ici. .


Initialisez SDL_Window Et SDL_Renderer

SDL_Renderer Et SDL_Window Doivent être configurés avant de pouvoir les utiliser. Vous avez déjà créé votre fenêtre correctement, donc je ne couvrirai pas cela. Voici comment configurer un SDL_Renderer

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

index définit le pilote à utiliser. Réglez-le sur -1 Pour utiliser le premier pilote qui prend en charge les autres arguments.
flags sont utilisés pour optimiser le rendu, le rendu du logiciel, empêcher vsync, etc. Réglez-le sur SDL_RENDERER_ACCELERATED.

En savoir plus sur SDL_CreateRendererici .

Mélange SDL et SDL2

SDL_Surface Est principalement utilisé dans SDL, pas dans SDL2. SDL2_image, SDL2_ttf Etc. sont toujours utilisés SDL_Surface, Mais ils sont convertis en SDL_Texture Avant de pouvoir être utilisés.

SDL_FillRect(...); est aussi principalement une chose SDL. Mais comme indiqué ci-dessus, le SDL_Surface Peut être utilisé, mais vous devez d'abord le convertir en un SDL_Texture:

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

En savoir plus ici .

Et utilise

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

Pour le rendre, lisez plus ici .

Boucle infinie (while(1);)

Vous ne devriez VRAIMENT pas faire ça, ça va juste boucler pour toujours. Utilisez SDL_Delay( 5000 ); pour faire une pause de 5000 ms ou 5 secondes.

Une manière plus simple

Vous pouvez utiliser

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

Dessiner un rect.

Tu devrais utiliser

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

Pour définir la couleur de ce que vous dessinez, utilisez

int SDL_RenderClear(SDL_Renderer* renderer)

Après quoi, vous appelez votre SDL_RenderDrawRect()

Jusqu'à ce point, tout a été dessiné "en coulisses". Pour le rendre à l'écran, utilisez

void SDL_RenderPresent(SDL_Renderer* renderer)

Exemple

#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's 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;
}

Résultat

Rendered result


Vous pouvez en savoir plus sur SDL2 sur mon blog.

63
olevegard