Trabajando con SDL
Es hora de ponerse manos a la obra y poner a trabajar al compilador.
Antes de llamar a cualquier función de SDL, hay que inicializarla y para ello se utiliza la función SDL_Init(Uint32 flags). Veámoslo con un ejemplo.
Código:
#include <stdlib.h>
#include "SDL.h"
main(){
if (SDL_Init(SDL_INIT_AUDIO|SDL_INIT_VIDEO)< 0) {
printf("No se puede iniciar SDL: %s\n",SDL_GetError());
exit(1);
}
atexit(SDL_Quit);
}
En este fragmento de código hay varias cosas interesantes. Empecemos por la función SDL_Init. Como parámetro acepta un argumento de tipo Uint32. Como te dije antes, SDL es multiplataforma, por lo que tiene definidos una serie de tipos de datos que serán iguales con independencia del sistema en el que corra. La U quiere decir que el tipo de datos es sin signo (unsigned), int, como podrás adivinar es por que es un entero y 32, porque es un entero de 32 bits. Si en vez de U, usamos la S (signed) estaremos hablando de un entero con signo. Para el número de bits, los posibles valores son 8,16,32 o 64. Así, por ejemplo, Uint16, hará referencia a un entero de 16 bits. Veamos en detalle los parámetros que hemos pasado a SDL_Init(). SDL_INIT_AUDIO|SDL_INIT_VIDEO. Con este parámetro le decimos a SDL que sólo queremos inicializar el subsistema de audio y de video. Los posibles valores son
SDL_INIT_VIDEO
SDL_INIT_AUDIO
SDL_INIT_TIMER
SDL_INIT_CDROM
SDL_INIT_JOYSTICK
SDL_INIT_EVERYTHING
Los parámetros se pasan separados por la barra vertical (|). Si quisiéramos inicializar además del audio y el video el cd-rom, los parámetros serían los siguientes: SDL_INIT_AUDIO|SDL_INIT_VIDEO|SDL_INIT_CDROM
Si lo queremos activar todo, pasaremos como único parámetro SDL_INIT_EVERYTHING.
Una vez inicializado SDL, si necesitamos inicializar otro subsistema podemos hacerlo con la función SDL_InitSubSystem(Uint32 flags) de la siguiente manera.
Código:
// Inicializamos el CD-ROM
if (SDL_InitSubSystem(SDL_INIT_CDROM) == -1) {
printf("No se puede iniciar el cdrom: %s\n",SDL_GetError());
exit(1);
}
Como habrán adivinado, la función SDL_GetError() devuelve el último error interno de SDL en formato cadena. Cuando una aplicación SDL es inicializada, se crean dos archivos, stderr.txt y stdout.txt. Durante la ejecución del programa, cualquier información que se escriba en la salida de error estándar se escribe en el archivo stderr.txt. Igualmente, cualquier información que se escriba en la salida estándar se guardará en el archivo stdout.txt. Esto nos va a ser de gran ayuda a la hora de depurar programas. Una vez finalizada la ejecución, si estos archivos están vacíos son borrados automáticamente, si no, estos permanecen intactos.
Al igual que inicializamos SDL, cuando hemos terminado el trabajo hemos de cerrarlo. La función encargada de esta tarea es SDL_Quit(). En nuestro programa de ejemplo hemos usado la siguiente la línea atexit(SDL_Quit). La función atexit() toma como parámetro a otra función a la que llama justo antes de que finalice la ejecución del programa. En nuestro caso, antes de que finelice nuestro programa (ya sea por un error o porque el usuario forzó la salida) se llamará a la función SDL_Quit(). Una de las particularidades de atexit() es que la función a la que debe llamar no tiene que tener parámetros ni devolver nada. En el caso de que queramos finalizar sólo un subsistema de SDL usaremos la función SDL_QuitSubSystem(Uint32 flags). Por ejemplo, si quisiéramos desactivar el subsistema de cdrom usaríamos la siguiente línea:
Código:
SDL_QuitSubSystem(SDL_INIT_CDROM);
La primera tarea que tenemos que acometer antes de empezar a mostrar información gráfica en la pantalla es establecer el modo de video. SDL nos lo pone fácil con la función SDL_SetVideoMode(). La función tiene la siguiente forma:
Código:
SDL_Surface *SDL_SetVideoMode(int width, int height, int bpp, Uint32 flags)
Esta función devuelve un puntero del tipo SDL_Surface. En SDL la “surface” o superficie es el elemento básico que utilizamos para construir los gráficos de nuestro juego. Imagina una superficie como un rectángulo que contiene información gráfica, por ejemplo de nuestra nave. La única superficie que es visible, es decir, que vemos en la
pantalla del ordenador, es ésta que nos devuelve la función SDL_SetVideoMode().Los parámetros witdth y height son la anchura y la altura de la superficie en píxeles. Es decir, la resolución de la pantalla. En teoría aquí podemos poner cualquier cosa, pero evidentemente el hardware ha de soportar dicha resolución. Si la resolución no es soportada, SDL intentará poner una resolución válida lo más cercana a la requerida. Un poco más adelante veremos una función que nos permitirá conocer cuales son los modos válidos. Con el parámetro bpp le indicamos a SDL cuántos bits por pixels queremos establecer, es decir, la profundidad de color. Valores típicos son 8, 16, 24 y 32. Hoy en día no tiene sentido trabajar con 8, ya que sólo nos proporciona 256 colores posibles, además, habría que trabajar con paletas en vez de con color real. El último parámetro es flags, que es un campo de bits. Estos son los posibles valores y su significado.
SDL_SWSURFACE Crea la superficie de vídeo en la memoria principal
SDL_HWSURFACE Crea la superficie en la memoria de vídeo.
SDL_ASYNCBLIT Modo de blit asíncrono. Mejora el rendimiento en máquinas con más de un procesador, unque puede disminuirlo en máquinas con una sólo procesador.
SDL_ANYFORMAT Fuerza el uso de los bpp de la surface actual. Hay que usarlo cuando queramos crear la superficie en una ventana.
SDL_HWPALETTE Da a SDL acceso exclusivo a la paleta de color.
SDL_DOUBLEBUF Sólo válido con SDL_HWSURFACE. Permite el uso del doble buffer.
SDL_FULLSCREEN Intenta poner el modo a pantalla completa.
SDL_OPENGL Crea un contexto OpenGL en la superficie.
SDL_OPENGLBLIT Igual que la anterior, pero permite que SDL haga el render 2D.
SDL_RESIZABLE Crea un ventana que puede cambiar de tamaño.
SDL_NOFRAME Crea una ventana pero sin borde.
He aquí un ejemplo práctico del uso de SDL_SetVideMode().
Código:
SDL_Surface *screen;
screen = SDL_SetVideoMode(640,480,24,SDL_SWSURFACE| SDL_DOUBLEBUF);
if ( screen == NULL ){
fprintf(stderr, "No se puede establecer el modo \
de video 640x480: %s\n", SDL_GetError());
exit(1);
}
Marcadores