La librer铆a SDL

隆C贸digo!

El primer paso en nuestro uso de SDL ser谩 la creaci贸n de una simple ventana. Para esto haremos uso de algunas pocas funciones de la librer铆a.

libsdl-app-sc1

Figura. El ejemplo que acompa帽a el tutorial en acci贸n

Para esto crearemos una clase C++ llamada “Window” dentro de un espacio de nombre llamado “codeTutorials” simplemente para evitar colisiones de este nombre tan com煤n con cualquier otra librer铆a que en el futuro pueda utilizar nuestra aplicaci贸n.

Nuestra clase poseer谩 los siguientes m茅todos:

Constructor: Crear谩 un objeto del tipo ventana e inicializar谩 el subsistema de video de SDL.
Destructor: Apagar谩 el subsistema de video y destruir谩 el objeto.
Update: Actualiza el contenido de la ventana.
Clear: Limpia el contenido de la ventana con el color especificado.
SetBackgroundColor: Fija el color de fondo por defecto de la ventana.
SetTitle: Fija el t铆tulo de la ventana.

Claro que podr铆amos especificar m谩s m茅todos, pero nos manejaremos con estos s贸lo simplemente para ver como lidiar con SDL.

Las propiedades que tendr谩 nuestra peque帽a clase “Window” ser谩n:

SDL_Surface * m_pMainSurface: Puntero a una superficie SDL. Una superficie es b谩sicamente una porci贸n de memoria de video (aunque en ciertos casos esto no sea realmente as铆 nos servir谩 pensarlo de este modo) con ciertos atributos. Esta superficie puede ser escrita y en el caso particular de la superficie principal su contenido podr谩 verse en pantalla dentro de nuestra ventana.
unsigned int m_uiColor: Color por defecto utilizado por nuestra clase para “pintar” la superficie.

Ahora, veamos el c贸digo dentro del constructor y analicemos el uso de las primeras funciones SDL:


| // Crea una ventana del tama帽o especificado
| Window::Window(int iWidth, int iHeight, const char * pszTitle)
| {
| // Fijo un color por defecto
| m_uiColor = 0xff000000;
|
| // Si algo sale mal y debo terminar la funci贸n de manera prematura
| // la superficie quedar谩 en NULL
| m_pMainSurface = NULL;
|
| // Inicializaci贸n de SDL
| if (SDL_Init(SDL_INIT_VIDEO) == -1)
| // Ha ocurrido un error
| return;
|
| // Fijo el t铆tulo de la ventana
| if (pszTitle != NULL)
| SDL_WM_SetCaption(pszTitle, NULL);
|
| // Obtengo informaci贸n del sistema
| const SDL_VideoInfo * pInfo = SDL_GetVideoInfo();
|
| if(!pInfo)
| // No se pudo obtener la informaci贸n de video
| return;
|
| // Creo una variable con los flags requeridos
| unsigned long ulFlags = SDL_DOUBLEBUF | SDL_HWSURFACE;
| m_pMainSurface = SDL_SetVideoMode(iWidth, iHeight, pInfo->vfmt->BitsPerPixel, ulFlags);
| }

La primer funci贸n que utilizamos de SDL es SDL_Init, por medio de ella podremos inicializar los distintos subsistemas de la librer铆a. En este caso particular deseamos inicializar el subsistema de video por lo que especificamos como par谩metro SDL_INIT_VIDEO.

Funci贸n: SDL_Init
Prototipo: int SDL_Init(Uint32 flags);
Par谩metros: Los valores posibles principales de flags son:

Constantes:

SDL_INIT_VIDEO: Inicializa subsistema de video.
SDL_INIT_AUDIO: Inicializa subsistema de audio.
SDL_INIT_TIMER: Inicializa subsistema de timer.
SDL_INIT_CDROM: Inicializa subsistema de cd-rom.
SDL_INIT_JOYSTICK: Inicializa subsistema de joystick.
SDL_INIT_EVERYTHING: Inicializa todos los subsistemas.

Siguiendo el c贸digo del constructor, l铆neas despu茅s utilizamos la funci贸n SDL_WM_SetCaption que en realidad pertenece al conjunto de funci贸n de manejo de ventanas (notar el prefijo WM de Window Management). Esta funci贸n se utiliza para cambiarle el nombre a la ventana (algo as铆 como la funci贸n del API de Win32 SetWindowText).

Funci贸n: SDL_WM_SetCaption
Prototipo: void SDL_WM_SetCaption(const char *title, const char *icon);
Par谩metros:
title: T铆tulo de la ventana (puede ser NULL).
icon: Nombre del archivo “.ico” que se utilizar谩 para la ventana (puede ser NULL).

Acto seguido invocamos la funci贸n SDL_GetVideoInfo, esta funci贸n nos retorna un puntero a una estructura del tipo SDL_VideoInfo.

Funci贸n: SDL_GetVideoInfo
Prototipo: SDL_VideoInfo *SDL_GetVideoInfo(void);
Par谩metros: Ninguno.

La estructura del tipo SDL_VideoInfo posee informaci贸n relacionada a las capacidades del dispositivo de video y el formato del pixel utilizado al momento de realizar la llamada a la funci贸n. Recordemos que si fijaremos el adaptador en pantalla completa podremos seleccionar (de un grupo de modos disponibles) cu谩l es el formato de pixel y la resoluci贸n de la pantalla, pero si inicializaremos en modo ventana deberemos tomar las propiedades como est谩n fijadas y adaptarnos a ellas.

Veamos con mayor detalle sus elementos:

Propiedades:

hw_available: Indica si es posible crear superficies de hardware.
wm_available: Indica si el sistema dispone de un gestor de ventanas (en Windows esto siempre ser谩 as铆 pero no en otros sistemas)
blit_hw: Indica si existe aceleraci贸n de copiado de superficies en hardware.
blit_hw_CC: Indica si existe aceleraci贸n de copiado con colorkey de superficies en hardware.
blit_hw_A: Indica si existe aceleraci贸n de copiado con canal alfa de superficies en hardware.
blit_sw: Indica si existe aceleraci贸n de copiado de superficies de software a hardware.
blit_sw_CC: Indica si existe aceleraci贸n de copiado con colorkey de superficies de software a hardware.
blit_sw_A: Indica si existe aceleraci贸n de copiado con canal alfa de superficies de software a hardware.
blit_fill: Indica si existe aceleraci贸n en el proceso de rasterizaci贸n.
video_mem: Indica la cantidad total de memoria disponible (en Kb).
vfmt: Puntero a estructura SDL_PixelFormat

De la estructura SDL_PixelFormat tal vez la propiedad de mayor inter茅s para nosotros sea BitsPerPixel que nos indica la cantidad de bits que existen por p铆xels, es decir la profundidad de colores.

Finalmente llegamos a la 煤ltima l铆nea del m茅todo, en donde fijamos el modo de video haciendo uso de la funci贸n SDL_SetVideoMode:

Funci贸n: SDL_SetVideoMode
Prototipo: SDL_Surface *SDL_SetVideoMode(int width, int height, int bpp, Uint32 flags);
Par谩metros:
width: Ancho en p铆xels de la superficie a crear.
height: Alto en p铆xels de la superficie a crear.
bpp: Profundidad de colores (bits por pixel).
flags: Propiedades de la superficie a crear:

Flags:

SDL_SWSURFACE: Superficie en memoria de sistema.
SDL_HWSURFACE: Superficie en memoria de video.
SDL_ASYNCBLIT: Habilita el copiado a superficie principal sin sincronizar con barrido de vertical.
SDL_DOUBLEBUF: Habilita un b煤fer doble en hardware (s贸lo v谩lido para superficies de hardware).
SDL_FULLSCREEN: Fija el modo de video en pantalla completa.
SDL_OPENGL: Crea un contexto de renderizaci贸n OpenGL.
SDL_RESIZABLE: Crea una ventana redimensionable.
SDL_NOFRAME: Crea una ventana sin barra de t铆tulo ni bordes.

En nuestro caso, utilizamos el alto y ancho especificados por par谩metros en el constructor (que ser谩 el alto y ancho de la ventana), utilizamos la profundidad de colores que nos retorn贸 la funci贸n SDL_GetVideoInfo dentro de la estructura SDL_VideoInfo.

Luego, en cuanto a flags especificaremos que deseamos una superficie de hardware con b煤fer doble (utilizando un b煤fer doble escribiremos sobre una porci贸n de memoria que no se est茅 mostrando en pantalla y luego cambiaremos la superficie activa por esta).

Cuando terminemos de utilizar la librer铆a deberemos invocar la funci贸n SDL_Quit.

Funci贸n: SDL_Quit
Prototipo: void SDL_Quit(void);
Par谩metros: -

Compartir:
  • Twitter
  • Facebook
  • MySpace
  • BarraPunto
  • del.icio.us

Pages: 1 2 3 4

Comments

  1. Master-Blaster
    August 13th, 2007 | 3:10

    interesante, buena intro

    pero en una parte hablas de una “siguiente revista”, se te chispoteo me parece! :P

  2. August 13th, 2007 | 10:10

    jeje, fixed! Gracias. ;)

Leave a reply