SDL – la ventana no muestra nada

Estoy haciendo mis primeros pasos en SDL (C ++) y tomé algunos tutoriales de www.

Pero hay un problema. He instalado SDL2 en mi sistema Linux Mint, comstackdo el código del tutorial:

#ifdef __cplusplus #include  #else #include  #endif #include  #include  #include  int main ( int argc, char** argv ) { if (SDL_Init(SDL_INIT_EVERYTHING) != 0){ std::cout << "SDL_Init Error: " << SDL_GetError() << std::endl; return 1; } SDL_Window *win = SDL_CreateWindow("Hello World!", 100, 100, 640, 480, SDL_WINDOW_SHOWN); if (win == NULL){ std::cout << "SDL_CreateWindow Error: " << SDL_GetError() << std::endl; return 1; } SDL_Renderer *ren = SDL_CreateRenderer(win, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC); if (ren == NULL){ std::cout << "SDL_CreateRenderer Error: " << SDL_GetError() << std::endl; return 1; } SDL_Surface *bmp = SDL_LoadBMP("cb.bmp"); if (bmp == NULL){ std::cout << "SDL_LoadBMP Error: " << SDL_GetError() << std::endl; return 1; } SDL_Texture *tex = SDL_CreateTextureFromSurface(ren, bmp); SDL_FreeSurface(bmp); if (tex == NULL){ std::cout << "SDL_CreateTextureFromSurface Error: " << SDL_GetError() << std::endl; return 1; } SDL_Delay(4000); SDL_DestroyTexture(tex); SDL_DestroyRenderer(ren); SDL_DestroyWindow(win); SDL_Quit(); return 0; } 

con este comando de comstackción:

 g++ main.cpp -lSDL2 -o prog 

Y tengo esto:

Un marco de ventana sin ningún interior.

Un marco de ventana sin ningún interior. ¿Dónde tengo que buscar este error ?



Código Final

Primero: gracias a starrify!

 #ifdef __cplusplus #include  #else #include  #endif #include  #include  #include  int main ( int argc, char** argv ) { if (SDL_Init(SDL_INIT_EVERYTHING) != 0){ std::cout << "SDL_Init Error: " << SDL_GetError() << std::endl; return 1; } SDL_Window *window = SDL_CreateWindow("Hello World!", 100, 100, 640, 480, SDL_WINDOW_SHOWN); if (window == NULL){ std::cout << "SDL_CreateWindow Error: " << SDL_GetError() << std::endl; return 1; } /* SDL_Renderer *ren = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC); if (ren == NULL){ std::cout << "SDL_CreateRenderer Error: " << SDL_GetError() << std::endl; return 1; } */ SDL_Surface *surface_bmp = SDL_LoadBMP("cb.bmp"); if (surface_bmp == NULL){ std::cout << "SDL_LoadBMP Error: " << SDL_GetError() << std::endl; return 1; } /* SDL_Texture *tex = SDL_CreateTextureFromSurface(ren, surface_bmp); SDL_FreeSurface(surface_bmp); if (tex == NULL){ std::cout << "SDL_CreateTextureFromSurface Error: " << SDL_GetError() << std::endl; return 1; } */ SDL_Surface *surface_window = SDL_GetWindowSurface(window); /* * Copies the bmp surface to the window surface */ SDL_BlitSurface(surface_bmp, NULL, surface_window, NULL); /* * Now updating the window */ SDL_UpdateWindowSurface(window); /* * This function used to update a window with OpenGL rendering. * This is used with double-buffered OpenGL contexts, which are the default. */ /* SDL_GL_SwapWindow(window); */ SDL_Delay(5000); /* SDL_DestroyTexture(tex);*/ /* SDL_DestroyRenderer(ren);*/ SDL_DestroyWindow(window); SDL_Quit(); return 0; } 

Muéstrame este resultado 🙂 introduzca la descripción de la imagen aquí

Vi que era realmente fácil. Y de esta manera no necesito openGL para dibujar. Este será el siguiente paso. Sería bueno, si me ayudas a mejorar este ejemplo para obtenerlo con OpenGL para …

SDL – la ventana no muestra nada

La razón es que no estás dibujando nada. Creaste una ventana, un renderizador, una superficie y una textura. Sin embargo no estás dibujando nada. Y el resultado visual refleja exactamente lo que has hecho.

Para mostrar simplemente una imagen BMP, cargue la imagen en una superficie y use SDL_BlitSurface para copiarla en la pantalla. O para trabajar con texturas, debes dibujar primitivos como triangularjs o quads como trabajar con OpenGL.

Otro problema también: ¿por qué su ventana se ve llena de otro contenido que no sea una pantalla en blanco?
Esto se debe a que en estos años, el modo de video predeterminado está configurado para duplicar el búfer , lo que significa que hay un búfer frontal para mostrar y un búfer posterior para mostrar. Cuando termines de renderizar un solo fotogtwig, deberás llamar algo como SDL_Flip (parece que ha sido obsoleto en SDL2) o SDL_UpdateWindowSurface .

EDITADO: edité su código y he aquí algo que funciona: (eliminé el renderer / texture, agregé SDL_BlitSurface y SDL_UpdateWindowSurface)

 #ifdef __cplusplus #include  #else #include  #endif #include  #include  #include  int main ( int argc, char** argv ) { if (SDL_Init(SDL_INIT_EVERYTHING) != 0){ std::cout << "SDL_Init Error: " << SDL_GetError() << std::endl; return 1; } SDL_Window *win = SDL_CreateWindow("Hello World!", 100, 100, 640, 480, SDL_WINDOW_SHOWN); if (win == NULL){ std::cout << "SDL_CreateWindow Error: " << SDL_GetError() << std::endl; return 1; } SDL_Surface *bmp = SDL_LoadBMP("cb.bmp"); if (bmp == NULL){ std::cout << "SDL_LoadBMP Error: " << SDL_GetError() << std::endl; return 1; } SDL_BlitSurface(bmp, 0, SDL_GetWindowSurface(win), 0); SDL_UpdateWindowSurface(win); SDL_Delay(4000); SDL_DestroyWindow(win); SDL_Quit(); return 0; } 

Dado que está utilizando SDL2, no debe usar una superficie SDL para actualizar la pantalla. Esa es la antigua forma en que SDL 1.2 tuvo que usar. El nuevo subsistema de renderizado es lo que desea para uso general porque es acelerado por hardware (usa la GPU), mientras que SDL_BlitSurface () y SDL_UpdateWindowSurface () no están (toda la copia de píxeles se realiza en la CPU).

Así que aquí está lo que hay que hacer. No utilice SDL_GetWindowSurface (). Usa tu código anterior para crear un renderizador y textura. Reemplace SDL_BlitSurface () con una llamada a SDL_RenderCopy (). Reemplace SDL_UpdateWindowSurface () con una llamada a SDL_RenderPresent ().

Alternativamente, puedes usar SDL_gpu (nota: yo soy el autor), que se parece a la antigua API de bling SDL 1.2, pero tiene aún más funciones y optimizaciones que SDL_Renderer.