Tutorial SDL 2 en Español - Capítulo 2

Capítulo 2: Creación de la Primera Ventana en SDL

Ahora que hemos configurado Visual Studio 2008, podemos empezar a crear nuestra primera ventana en SDL 2.
//Encabezados de inclusión utilizados en nuestros programas
#include <SDL.h>
#include <stdio.h>
Al inicio de nuestro código podemos observar un comentario, los comentarios se utilizan para documentar el código en C++. Existen dos tipos de comentarios, los comentarios de línea que comienzan con dos barras "//Comentario" de forma que el compilador ignora todo lo que está después de ellos; y los comentarios de múltiples líneas que comienzan con barra y asterisco y terminan con asterisco y barra "/*Comentario*/" de modo que todo lo que esté entre estos el compilador lo ignorará. Luego tenemos los archivos de inclusión utilizados en el programa. El archivos de inclusión SDL contienen las funciones, definiciones de tipos de datos, constantes y otros datos que necesita nuestra aplicación para trabajar con SDL. También hay un archivo de inclusión de entrada y salida del C estándar que contiene la función printf que vamos a utilizar para mostrar información en la consola.
//Función principal de la aplicación
int main(int argc, char* args[]){
   //Inicialización de la ventana, y la superficie.
   SDL_Window*    Ventana     = NULL;
   SDL_Surface*   Superficie  = NULL;
Después de los archivos de inclusión está la parte de inicial de la función main, esta función debe tener este formato:

int main(int argc, char* args[])

Este formato es crítico, ya que si se modifica, habrá una referencia indefinida a la función main y la aplicación no funcionará, así que hay que escribirla tal como está. Luego creamos una ventana SDL para nuestra aplicación. Después creamos una superficie para la ventana. Una superficie es una imagen que podemos cargar, pintar, y/o mostrar, esta imagen es 2D.
//Inicializa el subsistema de Video
if(SDL_Init(SDL_INIT_VIDEO) < 0){
   printf("ERROR: No se pudo inicializar SDL, Error SDL: %s\n", SDL_GetError());
}
Antes de declarar y dibujar la superficie debemos inicializar SDL para poder utilizar las funciones de SDL. Entonces vamos a inicializar SDL junto con el subsistema de video, ya que lo vamos a necesitar. Para inicializar el subsistema de video debemos pasarle a SDL_Init el parámetro "SDL_INIT_VIDEO".

La función SDL_Init devuelve -1 si existe algún error, así que este error lo vamos a mostrar en la consola cuando suceda.
Para mostrar la información en la consola usamos la función printf, esta función muestra la información en la consola, también vamos a pasarle como segundo parámetro el resultado de la función SDL_GetError()para que lo muestre en la consola.

Como SDL_GetError() devuelve una cadena de caracteres, debemos colocar %s dentro del texto del primer parámetro de printf donde queramos mostrar la información. %s indica a printf que el parámetro pasado es una cadena de caracteres.
else{
   //Se crea la ventana principal
   Ventana = SDL_CreateWindow("Tutorial SDL 2", 20, 20, 640, 480, SDL_WINDOW_SHOWN);
   if(Ventana == NULL) {
       printf("ERROR: No se pudo crear la ventana, SDL_Error: %s\n", SDL_GetError());
   }
Si todo resulta exitoso, entonces podemos crear la ventana, en este caso vamos a utilizar la función SDL_CreateWindow. El primer argumento de la función define el título de la ventana, el segundo y el tercero define la posición x e y respectivamente de la ventana, el cuarto y quinto argumento define el ancho y el alto respectivamente de la ventana, el último argumento son los parámetros de creación de la ventana, vamos a utilizar sólo SDL_WINDOW_SHOWN que muestra la pantalla cuando se haya creado.

La función SDL_CreateWindow devuelve NULL cuando ha ocurrido algún error, entonces la ventana no se crea y nosotros mostramos el error en la pantalla.
    else{
       //Se crea la superficie para la ventana principal
       Superficie = SDL_GetWindowSurface(Ventana);

       //Se dibuja un cuadro azul en la superficie principal
       SDL_FillRect(Superficie, NULL, SDL_MapRGB(Superficie->format, 0x00, 0x00, 0xFF));

       //Se actualiza la superficie
       SDL_UpdateWindowSurface(Ventana);

       //Esperamos 5 segundos
       SDL_Delay(5000);
    }
}
Si todo resulta exitoso, entonces podemos crear la superficie, en este caso vamos a utilizar la función SDL_GetWindowSurface. El argumento de la función define la ventana donde se va a crear la superficie.

Ahora vamos a dibujar un rectángulo azul para la superficie, para ello vamos a utilizar la función SDL_FillRect. El primer argumento de esta función es la superficie donde vamos a dibujar el rectángulo, el segundo argumento es el tamaño del rectángulo, en este caso vamos a colocar NULL para que dibuje toda la superficie, el tercer argumento es el color del rectángulo, el cual vamos a definirlo con la función SDL_MapRGB. La función SDL_MapRGB devuelve un entero sin signo de 32 bits (Uint32) con información del color. El primer argumento de la función SDL_MapRGB es el formato de la superficie, el segundo, tercero y cuarto son los colores Rojo, Verde y Azul (RGB) respectivamente.

Luego vamos a actualizar la superficie para que muestre los cambios que hemos realizado con la función SDL_UpdateWindowSurface que tiene como parámetro la ventana donde está la superficie.
Ahora debemos mostrar la pantalla al menos algunos segundos, para poderla observar, esto lo hacemos con la función SDL_Delay. Con esta función nosotros le podemos decir la cantidad de milisegundos que debe esperar la aplicación. 1 milisegundo es la milésima parte de un segundo (1/1000). Cuando esta función está en operación, la aplicación no acepta ningún comando del teclado o ratón, la aplicación se queda "colgada" hasta que termine el tiempo establecido.
   //Destruimos la Ventana para liberar recursos.
   SDL_DestroyWindow(Ventana);

   //Quitamos el subsistema de SDL.
   SDL_Quit();

   //Salimos de la función main
   return 0;
}
Para finalizar la aplicación, debemos liberar los recursos y quitar los subsistema iniciados, para liberar los recursos utilizamos la función SDL_DestroyWindow que tiene como parámetro la ventana que vamos a destruir. Para cerrar el subsistema SDL utilizamos la función SDL_Quit. Para salir de la función main utilizamos return..

El código fuente debe quedar como el siguiente:
//Encabezados de inclusión utilizados en nuestros programas
#include <SDL.h>
#include <stdio.h>

//Función principal de la aplicación
int main(int argc, char* args[]){
   //Inicialización de la ventana, y la superficie.
   SDL_Window*    Ventana     = NULL;
   SDL_Surface*   Superficie  = NULL;

   //Inicializa el subsistema de Video
   if(SDL_Init(SDL_INIT_VIDEO) < 0){
      printf("ERROR: No se pudo inicializar SDL, Error SDL: %s\n", SDL_GetError());
   }
   else{
      //Se crea la ventana principal
      Ventana = SDL_CreateWindow("Tutorial SDL 2", 20, 20, 640, 480, SDL_WINDOW_SHOWN);
      if(Ventana == NULL){
         printf("ERROR: No se pudo crear la ventana, SDL_Error: %s\n", SDL_GetError());
      }
      else{
         //Se crea la superficie para la ventana principal
         Superficie = SDL_GetWindowSurface(Ventana);

         //Se dibuja un cuadro azul en la superficie principal
         SDL_FillRect(Superficie, NULL, SDL_MapRGB(Superficie->format, 0x00, 0x00, 0xFF));

         //Se actualiza la superficie
         SDL_UpdateWindowSurface(Ventana);

         //Esperamos 5 segundos
         SDL_Delay(5000);
      }
   }
   //Destruimos la Ventana para liberar recursos.
   SDL_DestroyWindow(Ventana);

   //Quitamos el subsistema de SDL.
   SDL_Quit();

   //Salimos de la función main
   return 0;
}
Hasta aquí hemos visto cómo se crea una ventana SDL y una superficie, también vimos como se dibuja en la superficie un cuadro de color azul y lo mostramos en la pantalla. Puedes descargar el código fuente aquí.

Puedes ir a:

Introducción a SDL 2.

Capítulo 1: Instalación y Configuración de SDL 2 y Visual Studio 2008.

Capítulo 3: Mostrar una Imagen en SDL 2.

1 comentario: