Wednesday 24 April 2019

Abrir una Ventana de SDL2

En este pequeño tutorial, daremos el primer paso: abrir una ventana.

Ahora que ya hemos configurado SDL2, es hora de crear una aplicación sencilla de SDL que dibuje un cuadrado en la pantalla.

El código estará dividido en distintas secciones, al final podrás descargar una copia del código completo. Iremos revisando estas piezas de código (snippets) poco a poco para explicar que hace cada línea.

Hasta arriba se encuentran los archivos fuente donde incluimos SDL, ya que vamos a necesitar las funciones y tipos de dato de SDL para ejecutar cualquier tipo de código SDL.

Vamos a utilizar también la salida/entrada estándar de C para imprimir errores a la consola. La función printf es un poco más segura en términos de hilo que usando iostream con cout, es un detalle menor, sin embargo luego encapsularemos la salida de errores y nos preocuparemos mucho por esto, usa lo que te parezca más conveniente.

Después de incluir las cabeceras, declaramos las constantes de ancho y alto de la ventana a la cual vamos a renderizar.

Aquí tenemos la parte superior de nuestra función main. Es importante que la lista de argumentos esté dada como se muestra, primero un int y luego un arreglo de caracteres, de no ser así, tendremos un error indicando una falla de referencia a main. SDL requiere que declaremos nuestra función main para ser compatible con múltiples plataformas.

Posteriormente declaramos nuestro puntero a la ventana de SDL que vamos a crear en un momento. Luego de eso tenemos nuestra superficie de SDL; una superficie es solamente una imagen 2D. Podemos cargar una imagen 2D desde un archivo o puede ser la imagen que se encuentre dentro de la ventana. En este caso, será la imagen que veremos de la ventana en la pantalla.

Después de declarar nuestra superficie y la ventana, inicializamos SDL. No puedes llamar ninguna función de SDL sin inicializar SDL primero. Ya que por ahora, lo único que necesitamos es utilizar el subsistema de video de SDL, solo estaremos pasando la bandera SDL_INIT_VIDEO.

Cuando haya un error, SDL_Init regresa un -1. Si esto llega a ocurrir, queremos imprimir el error que ocurrió en la consola, de otra manera la aplicación solo se lanzará por una fracción de un segundo y desaparecerá sin indicar que pasó.

Si nunca has usado printf antes, significa "print format" (imprimir con formato). Escribe la cadena de texto en el primer argumento con las variables en los siguientes argumentos. Cuando ocurra un error aquí "¡No se pudo inicializar SDL2! SDL_Error:" aparecerá en la consola, seguido por la cadena regresada por SDL_GetError. Este %s es el formato especial, significa que queremos mostrar una cadena de texto desde nuestra lista de variables. Ya que SDL_GetError es el único argumento, la cadena que regresa es lo que será agregado. SDL_GetError es una función que regresa el último error producido por una función de SDL.

SDL_GetError es una función muy útil, cada vez que tu aplicación vaya mal, necesitas saber el porque, y esta función te permitirá saber si alguna función de SDL presentó un error.

Si SDL se inicializó correctamente, vamos a crear una ventana usando la función SDL_CreateWindow. El primer argumento es el que define el título de la ventana.

El siguiente argumento define la posición X y Y donde será creada la ventana. Ya que por ahora esto no nos concierne, solo pondremos las constantes SDL_WINDOWPOS_UNDEFINED de SDL.

Los siguientes dos argumentos definen el ancho y el alto, y usamos nuestras constantes que definimos al principio de este post. Los últimos argumentos son las banderas de creación. SDL_WINDOW_SHOWN se asegura de que la ventana sea visible cuando es creada, este argumento es implícito si no está definido SDL_WINDOW_HIDDEN, el antónimo de esta bandera.

Si existe algún error, SDL_CreateWindow regresa un NULL. Si no existe una ventana, queremos imprimir el error en la consola.

Si la ventana fue creada con éxito, querremos obtener acceso a la superficie de esta para que podamos dibujar en ella. Para esto usaremos la función SDL_GetWindowSurface.

Vamos a mantener simple este tutorial, por lo que solo llenaremos la superficie de la ventana con el color más feo que podamos, usando la función SDL_FillRect. No te preocupes mucho acerca de esta función por ahora, lo que importa es que se muestre la ventana.

Algo muy importante a saber acerca de la renderización, es que solo porque hayas dibujado algo en la pantalla no significa que vayas a verlo, después de que hayas terminado de dibujar, se debe actualizar la ventana para que se muestre aquello que dibujaste. Para esto haremos una llamada a SDL_UpdateWindowSurface.

Si todo lo que hacemos es crear la ventana, llenarla y actualizarla, lo que veríamos sería solo un parpadeo de color por una fracción de segundo y eso sería todo. Para evitar que esto pase, vamos a llamar a la función SDL_Delay. Esta función esperará por una cantidad de milisegundos dados. Un milisegundo es 1/1000 de segundo. En nuestro código, esta función esperará por 2 segundos.

Un detalle importante es que, al estar en modo de espera, SDL no puede aceptar entrada del teclado o el mouse. Así que no te preocupes si al ejecutar este programa no responde, todavía no le damos código para tratar con el teclado o el mouse.

Después de que la ventana haya esperado por 2 segundos, la destruimos para liberar su memoria. Esto también se ocupará de la superficie que obtuvimos de esta. Después de que se haya liberado el espacio, cerramos SDL y regresamos un 0 para indicar una terminación adecuada del programa.



¡Descarga el código fuente y los recursos de esta publicación aquí!

No comments:

Post a Comment