La librer铆a SDL
Escribiendo en la superficie principal
Para ver algo en el contenido de la pantalla, deberemos escribir en la superficie principal. Para esto crearemos una nueva superficie a partir de un archivo tipo bmp, que utilizaremos a tal efecto.
La carga de archivo bmp lo encapsularemos dentro de una clase que llamaremos Bitmap y colocaremos dentro del mismo espacio de nombre que la clase Window. La clase Bitmap tendr谩 algunos pocos m茅todos, entre los que se destacan:
Constructor: Carga el bitmap a partir del nombre de un archivo.
Draw: Dibuja el bitmap en la superficie SDL pasada como par谩metro.
SetPos: Fija la posici贸n del bitmap en la pantalla.
Dentro de las propiedades de la clase especificaremos:
SDL_Surface * m_pSurface: Puntero a la superficie SDL con el bitmap cargado en ella.
int m_iX, m_iY: Posici贸n del bitmap en la pantalla.
Analicemos el m茅todo constructor de la clase Bitmap:
| Bitmap::Bitmap(const char * pszFilename)
| {
| m_iX = m_iY = 0;
|
| SDL_Surface * pSurface = SDL_LoadBMP(pszFilename);
|
| if (pSurface)
| // Asigno la superficie
| m_pSurface = pSurface;
| else
| m_pSurface = NULL;
| }
Del c贸digo anterior se destaca el uso de la funci贸n de SDL SDL_LoadBMP:
Funci贸n: SDL_LoadBMP
Prototipo: SDL_Surface *SDL_LoadBMP(const char *file);
Par谩metros:
file: Nombre del archivo BMP.
La funci贸n retorna una superficie con el contenido de bitmap en ella.
Para copiar el contenido de la superficie con el bitmap dentro de la superficie principal haremos uso de la funci贸n SDL_BlitSurface:
Funci贸n: SDL_BlitSurface
Prototipo: int SDL_BlitSurface(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, SDL_Rect *dstrect);
Par谩metros:
src: Superficie desde la cual tomaremos la informaci贸n a copiar.
srcrect: Regi贸n de la superficie a copiar (podr铆amos querer tomar s贸lo una parte de ella).
dst: Superficie a la cual vamos a copiar la informaci贸n.
dstrect: Regi贸n de la superficie a la cual vamos a copiar la informaci贸n.
Cada vez que queramos copiar el contenido del bitmap en la superficie principal haremos uso del m茅todo Draw de la clase Bitmap que hace uso de la funci贸n descrita anteriormente como podemos apreciar en el siguiente trozo de c贸digo:
| void Bitmap::Draw(SDL_Surface * pMainSurface)
| {
| // Especifico 谩rea de copiado del bitmap
| static SDL_Rect rectSrc;
| rectSrc.x = 0;
| rectSrc.w = m_pSurface->w;
| rectSrc.y = 0;
| rectSrc.h = m_pSurface->h;
|
| // Especifico 谩rea de pegado en superficie principal
| static SDL_Rect rectDst;
| rectDst.x = m_iX;
| rectDst.w = m_pSurface->w;
| rectDst.y = m_iY;
| rectDst.h = m_pSurface->h;
|
| // Realizo el Blit del DC de memoria al DC del backbuffer
| SDL_BlitSurface(m_pSurface, &rectSrc, pMainSurface, &rectDst);
| }
Cabe destacar que el copiado de la superficie con el bitmap a la superficie principal se realiza sobre el b煤fer secundario (back buffer), para poder ver dicha informaci贸n en pantalla deberemos realizar un SDL_Flip de la superficie principal.
Funci贸n: SDL_Flip
Prototipo: int SDL_Flip(SDL_Surface *screen);
Par谩metros:
screen: Superficie principal.
Esto lo haremos en el m茅todo Update de la clase Window:
| void Window::Update()
| {
| // Finalmente copia el backbuffer sobre el frontbuffer
| SDL_Flip(m_pMainSurface);
| }

Figura. Copiado y cambio de b煤fer principal
Finalmente, puede no resultar obvio que luego de realizar un flip, el b煤fer secundario ser谩 el que antes era el primario y si deseamos colocar un nuevo contenido en 茅l deberemos limpiarlo previamente (a no ser deseemos realizar alg煤n efecto particular). Para esto utilizaremos la funci贸n SDL_FillRect de SDL.
Conclusi贸n
Hemos visto como utilizar el subsistema de video de la librer铆a SDL haciendo uso de una de sus funcionalidades b谩sicas. En el ejemplo que acompa帽a el tutorial vamos un poco m谩s lejos y agregamos algunos elementos como sprites y uso de timers, confiamos en que el lector no tendr谩 inconvenientes en entender estos nuevos elementos analizando el c贸digo fuente explicado paso a paso con comentarios dentro del mismo.
Para descargar la aplicaci贸n de ejemplo, puede hacer click aqu铆.
~fuzzyLogic





Comentarios (2)



interesante, buena intro
pero en una parte hablas de una “siguiente revista”, se te chispoteo me parece!
jeje, fixed! Gracias.