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;
}
Il y a plusieurs problèmes avec votre code, je vais essayer de résoudre la plupart d'entre eux.
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)
Où 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. .
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_CreateRenderer
ici .
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 .
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.
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)
#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;
}
Vous pouvez en savoir plus sur SDL2 sur mon blog.