Antes de comenzar a escribir al framebuffer con SDL, necesitamos decirle a la placa de vídeo que es lo que esperamos de ella. Esta necesita saber la resolución de la pantalla que queremos, así como el formato de pixel que esperamos en el framebuffer. SDL puede manejar esto para nosotros con la funcione SDL_SetVideoMode. En el siguiente ejemplo podemos ver como setear un modo de vídeo en particular y preparar el framebuffer para dibujar:
#include <stdio.h>
#include <stdlib.h>
#include "SDL/SDL.h"
/*El path de SDL.h puede variar segun la plataforma en la que nos encontremos SDL/SDL.h es el path que se usa usualmente bajo Linux.*/
int main()
{
SDL_Surface *screen;
/* Inicializa el sistema de video de SDL y ckequeamos errores*/
if (SDL_Init(SDL_INIT_VIDEO) != 0)
{
printf("No se pudo inicializar SDL: %s", SDL_GetError());
return 1;
}
/* Nos aseguramos de que SDL_Quit sea llamado cuando el programa termine*/
atexit(SDL_Quit);
/* Intentamos setear el modo de video en 640x480 hicolor */
screen = SDL_SetVideoMode(640, 480, 16, SDL_FULLSCREEN);
if (screen == NULL)
{
printf("No se pudo setear el modo de video: %s", SDL_GetError());
return 1;
}
/* Si llegamos hasta aca es por que todo esta funcionando*/
printf("Exito!.");
return 0;
}
Este programa incluye el archivo de cabecera SDL.h , en el subdirectorio SDL. Este es el archivo de cabecera maestro de SDL, este debe ser incluido en todas las aplicaciones de SDL. También incluimos dos archivos de cabecera estándar para printf y la función atexit.
Comenzamos llamando a SDL_Init para inicializar SDL. Esta función toma una lista de argumentos predefinidos para indicar que subsistemas inicializar en este caso estamos interesados en uno solo, el subsistema de video, así que pasamos SDL_INIT_VIDEO como argumento.
A menos que un error ocurra esta función regresara cero para indicar que todo esta bien.
También usamos la función de C atexit (ejecuta la función que se le pasa como argumento al terminar el programa) para llamar a SDL_Quit antes de que el programa termine. Esta función se asegura de que SDL se apaga correctamente.
Función: SDL_Init(flags)
Sinopsis: Inicializa uno o mas subsistemas de SDL
devuelve: cero si tuvo éxito, un numero negativo si falla.
Parámetros: flags . Subsistemas a inicializar. Este viene de una lista predefinida de parámetros en donde entre otros se encuentran, SDL_INIT_VIDEO y SDL_INIT_AUDIO, El listado completo de parámetros se encuentra en la documentación de la api de desarrollo.
A continuación usamos SDL_SetVideoMode esta función informa al display de nuestra resolución decidida y de la profundidad del color.
Hay un asunto en este punto, SDL tratara de setear el display como se lo pedimos pero podría fallar, si eso pasa SDL no nos lo diría
en su lugar SDL emulara la internamente las características que se pidieron. Esto es usualmente aceptable, dado que la emulación por
código es relativamente rápida y podría funcionar como una solución en lugar de tratar con múltiples modos de video nosotros mismos.
SDL_SetVideoMode devuelve un puntero a una superficie que representa el framebuffer. Si algo va mal esta función devuelve NULL.
Función: SDL_SetVideoMode(ancho, alto, bpp, flags)
Sinopsis: Crea una ventana o inicializa el adaptador de video preparado para las salidas de SDL.
Devuelve: Un puntero a una valida estructura SDL_Surface si tuvo éxito o NULL si fallo.
Parámetros: ancho: Ancho(x de la resolución )del modo de video elegido.
alto: Alto(y de la resolución )del modo de video elegido. bpp: Profundidad de color elegida, Acepta valores como 8, 15, 16, 24, o 32. 0 deja que SDL elija cualquier modo soportado. flags: Un flag predefinido, los posibles valores son SDL_FULLSCREEN(pide el modo de video en pantalla completa) SDL_DOUBLEBUF(pide el modo de video seteado con doble buffer), SDL_HWSURFACE(pide un buffer por hardware para actualizar mas rápido)
SDL_OPENGL(pide un contexto opengl) y otros, para mas información consultar la documentación de la api.
Finalmente reportamos el éxito con un printf y salimos. La librería de C llama a SDL_Quit automáticamente, dado que la registramos con atexit, y luego SDL
regresa el display de video a su estado original.
Función: SDL_Quit()
Sinopsis: Apaga SDL limpiamente sin importar su estado actual.
Para mas informacion sobre SDL, consultar www.libsdl.org
Bibliografia: "Programming Linux Games" de John R. Hall (http://www.overcode.net/~overcode/writing/plg/)
