(Este artículo forma parte del Curso de Programación en C)
Existen muchas librerías para añadir gráficos a nuestros programas escritos en C. Vamos a usar una llamada SDL (iniciales de Single DirectMedia Layer), porque tiene muchos puntos a su favor: es multiplataforma, libre, eficiente y permite manejar cualquier componente multimedia (gráficos, sonido, joysticks, ratones, discos ópticos, etc). Teniendo en cuenta la complejidad intrínseca a estos dispositivos, la librería es razonablemente sencilla de usar. Se ha utilizado como base para algunos desarrollos conocidos en el terreno de los videojuegos, como Quake 4 o FreeCiv.
SDL puede descargarse gratuitamente desde http://www.libsdl.org u obtenerse de cualquier repositorio oficial GNU/Linux medianamente decente.
Nosotros sólo vamos a proporcionar una introducción a la parte de SDL dedicada a los gráficos, y aún así nos saldrá un artículo bastante voluminoso. Si quiere más información, en la página web reseñada antes encontrará una completa documentación.
Instalación de SDL
SDL no es una librería C estándar, es decir, no viene de serie con ningún compilador de C. Así que debe ser instalada antes de poder utilizarla. A continuación describimos el proceso de instalación en Linux y en Windows.
Instalación de SDL en GNU/Linux
- Bájese la última versión de la librería de la web de SDL. Necesitará el paquete de la librería propiamente dicho (denominado runtime) y el paquete de desarrollo. El paquete runtime tiene un nombre similar a este: SDL-1.2.8-1.i386.rpm, donde “1.2.8″ es la versión de la libería e “i386″ indica para qué tipo de procesador está compilado. El paquete de desarrollo debe llamarse SDL-devel-1.2.8-i386.rpm o algo similar.
- Instale ambos paquetes en su sistema. Con el paquete runtime es suficiente para ejecutar programas que usen la librería SDL, pero si además quiere escribir programas nuevos que usen esta librería (y es nuestro caso), también necesitará el paquete de desarrollo.
Instalación de SDL en Windows
- Bájese la última versión de la librería de la web de SDL. Necesitará la librería de vínculos dinámicos (denominada dll) y el paquete de desarrollo. La librería de vínculos dinámicos suele venir comprimida en un archivo cuyo nombre es similar a: SDL-1.2.8-win32.zip, donde “1.2.8″ es la versión de la libería. Existirán varios paquetes de desarrollo para varios compiladores. Mi consejo es que baje el que está preparado para el compilador de GNU, cuyo nombre es SDL-devel-1.2.8-mingw32.tar o algo similar. También encontrará paquetes para Visual C++ y otros compiladores.
- Descomprima la librería de vínculos dinámicos. Debe obtener un archivo llamado sdl.dll. Copie este archivo al directorio /windows/system32, o bien ubíquelo en la misma carpeta en la que vaya a estar el programa ejecutable del ajedrez.
- Descomprima el paquete de desarrollo. Encontrará varios directorios y, dentro de ellos, multitud de archivos. Copie los archivos en los directorios del mismo nombre de su compilador. Por ejemplo, copie el directorio “include” del paquete de desarrollo al directorio “include” de la carpeta donde esté instalado su compilador. Repita la operación para todos los directorios cuyo nombre coincida.
Compilación y enlace
Al no ser SDL una librería estándar, el enlace entre nuestro programa y las funciones de SDL no se produce automáticamente. Hay que indicarle al enlazador (o linker) lo que debe hacer.
Compilación y enlace en GNI/Linux
Si, por ejemplo, nuestro programa ejecutable se llama “ajedrez” y se construye a partir de 3 programas objeto, llamados “ajedrez.o”, “movs.o” e “interfaz.o”, debemos modificar la primera parte de nuestro Makefile de este modo:
ajedrez: ajedrez.o movs.o interfaz.o
gcc -g `sdl-config --cflags` -o ajedrez ajedrez.o movs.o interfaz.o `sdl-config --libs`
Fíjese bien en que las comillas son en realidad acentos graves, es decir, invertidos e inclinados hacia atrás. Debe respetar la sintaxis para que funcione.
Eso es todo lo que tiene que hacer para compilar son SDL. Si te interesa saber POR QUÉ, siga leyendo. Si no, puede pasar al siguiente apartado.
En realidad, lo que hay escrito entre esas comillas invertidas son comandos de SDL que indican la configuración de la librería. Estos comandos los puede ejecutar desde la consola, obteniendo más o menos esto:
$ sdl-config --cflags
-I/usr/local/include -I/usr/local/include/SDL -D_REENTRANT
$ sdl-config --libs
-L/usr/local/lib -lSDL -lpthread
Al añadir estos comandos dentro del Makefile, enmarcados entre esas comillas invertidas, obligamos a la herramienta make a ejecutar los comandos y a sustituir el texto entrecomillado por el resultado del comando. Es decir, sería como si hubiéramos puesto esto en el Makefile:
ajedrez: ajedrez.o movs.o interfaz.o
gcc -g -I/usr/local/include -I/usr/local/include/SDL -D_REENTRANT -o ajedrez ajedrez.o movs.o interfaz.o -L/usr/local/lib -lSDL -lpthread
Pero preferiremos la primera forma porque es más corta y, además, funcionará en todas las situaciones, mientras que esta segunda depende de dónde y cómo se haya instalado la librería SDL (fíjese que hace referencia a directorios concretos de nuestro sistema)
Compilación y enlace en Windows
Lo siguiente explica cómo compilar y enlazar con SDL desde el compilador Dev-C++, que tiene licencia GNU y es gratuito. Ya explicamos cómo se usaba en este artículo. Con otros compiladores el proceso debe ser similar, aunque es posible que necesite bajar otro paquete de desarrollo adaptado al compilador concreto.
Para poder compilar y enlazar la libería SDL tiene que abrir las opciones del proyecto (menú “Proyecto”) y activar la pestaña “Parámetros”. En el cuadro con el título “Linker” escriba lo siguiente:
-lmingw32 -lSDLmain -lSDL
Si ha instalado correctamente la librería SDL, con esto debería bastar. Recuerde que el archivo sdl.dll debe estar en la misma carpeta que el programa ejecutable (o, si no, instalado con las liberías del sistema de Windows)
Inicialización y terminación de la pantalla gráfica
Una vez instalada la libería y preparado el compilador, podemos usar las funciones de SDL como cualquier otra función estándar de C. Su uso es exactamente igual en Windows y en Linux, por lo que el programa que obtendremos debería compilar sin necesidad de hacerle ningún cambio en ambos sistemas.
Para usar los gráficos, hay que hacer un #include <SDL/SDL.h> en el archivo fuente, como es natural. Aparece dos veces el nombre “SDL” porque el archivo SDL.h está dentro de una carpeta llamada SDL.
Lo siguiente que hay que hacer es inicializar la pantalla gráfica. Para eso disponemos de dos funciones: SDL_Init() y SDL_SetVideoMode().
SDL_Init() debe ser la primera función en invocarse. No se puede usar ninguna otra función de SDL si antes no se ha llamado a ésta. Hay que pasarle un parámetro que indica qué tipo de sistema multimedia queremos manejar (la tarjeta de vídeo, la de sonido, el CD-ROM, etc). En nuestro caso será la tarjeta de vídeo, ya que sólo nos interesa manipular gráficos. La constante para ello es SDL_INIT_VIDEO:
SDL_Init(SDL_INIT_VIDEO);
La fución SDL_Init() devuelve –1 si ocurre algún error al iniciar el sistema de gráficos. En ese caso, el programa no podrá continuar, de modo que debemos comprobar el valor devuelto por SDL_Init().
SDL_SetVideoMode() debe ser la segunda función en invocarse, justo a continuación de SDL_Init(). Sirve para establecer el tipo de pantalla gráfica que queremos. Hay que indicarle el tamaño en píxels, el número de bits de color y los atributos de la pantalla. Por ejemplo:
SDL_SetVideoMode(800, 600, 16, SDL_ANYFORMAT | SDL_DOUBLEBUFFER);
Esto crea una ventana gráfica de 800×600 píxels, con 16 bits de profundidad de color. El último parámetro, SDL_ANYFORMAT, es una constante que indica a SDL que puede seleccionar otra profundidad de color si la elegida no está disponible. Este cuarto parámetro puede tomar otros muchos valores que no vamos a ver, pero sí señalaremos que es conveniente añadir la constante SDL_DOUBLEBUFFER por motivos de rendimiento (ver ejemplo más abajo).
SDL_SetVideoMode() devuelve un puntero a una estructura llamada SDL_Surface, definida en SDL.h, o NULL si ocurre algún error. Este puntero nos será imprescidible para manejar la pantalla gráfica, así que debe guardarlo en una variable de tipo puntero a SDL_Surface.
SDL_Quit(). Tan importante como inicializar la pantalla gráfica es finalizarla. Tenga en cuenta que la pantalla gráfica consume muchos recursos, y éstos deben ser liberados antes de que el programa termine su ejecución. Para eso tenemos la función SDL_Quit(), que se invoca sin argumentos.
Siempre se entiende mejor con un ejemplo. Aquí va uno dónde se ilustra la inicialización de la pantalla gráfica:
#include <SDL/SDL.h>
...
SDL_Surface *pantalla; // Puntero a la pantalla. Lo necesitaremos más adelante
...
// Inicializamos el modo de vídeo de SDL
if (SDL_Init(SDL_INIT_VIDEO) == -1) {
puts("Error en la inicialización del sistema de vídeo\n");
SDL_Quit();
exit(-1);
}
// Creamos una pantalla gráfica de 800x600
pantalla = SDL_SetVideoMode(800, 600, 16, SDL_ANYFORMAT|SDL_DOUBLEBUF);
if (pantalla == NULL) {
puts("Fallo al establecer el modo de vídeo\n");
SDL_Quit();
exit(-1);
}
...
SDL_Quit(); // Esto se hace al final del programa
Mostrando imágenes en la pantalla
Ya tenemos nuestra pantalla gráfica inicializada y lista para empezar a dibujar en ella. Pero, ¿qué tipo de objetos se pueden dibujar?
Aunque las librerías gráficas permiten al programador pintar píxels individuales en cualquier punto de la pantalla, lo habitual es trabajar con imágenes previamente existentes llamadas sprites. Un sprite es una imagen guardada en un archivo que puede ser cargada por el programa y mostrada en cualquier parte de la pantalla gráfica y tantas veces como sea necesario.
Por lo tanto, lo primero que necesita es hacerse con una colección de sprites para su programa. Supongamos, por ejemplo, que estamos programando un juego de ajedrez. Necesitaremos los siguientes sprites (puede buscarlos en Internet, escanearlos, dibujarlos usted mismo/a, etc):
- Una imagen del tablero, a ser posible de buen tamaño (por ejemplo, de 400×400 píxels como mínimo)
- Una imagen de cada una de las piezas. En total son 12: peón, torre, caballo, alfil, dama y rey, cada uno en dos colores (blanco y negro). El tamaño de estas imágenes debe ser adecuado para reproducirlas dentro de cada uno de los recuadros del tablero. Si, por ejemplo, en el tablero cada casilla mide 45×45 píxels, las imágenes de las piezas deben ser de alrededor de 40×40 píxels (o incluso algo menos). Además, todas las piezas deben tener el mismo color de fondo (para simplificar, negro)
- Opcionalmente, todas las imágenes adicionales que deseemos para mejorar la estética del programa.
Los archivos con las imágenes deben estar en formato BMP (SDL admite otros formatos, pero el BMP es con diferencia el más fácil de manipular)
Para dibujar una imagen en cualquier punto de la pantalla, hay que hacer dos cosas que más abajo describimos con detalle:
- Cargar la imagen en la memoria (procedente de un archivo BMP)
- Mostrar la imagen en la pantalla
1. Cargar imágenes en la memoria
Sólo es necesario cargar las imágenes una vez. Normalmente, se hará al principio del programa, justo después de la inicialización de SDL. Una vez cargadas en la memoria, podremos utilizarlas tantas veces como las necesitemos, a menos que liberemos el espacio de memoria que ocupan. La liberación de espacio, por tanto, debería hacerse al final del programa, justo antes de terminar.
Para cargar una imagen BMP se usa la función SDL_LoadBMP(), de esta forma:
SDL_Surface *tablero;
tablero = SDL_LoadBMP("tablero.bmp");
if (fondo == NULL) {
printf("Error al cargar el archivo tablero.bmp");
SDL_Quit();
exit(-1);
}
Observa que SDL_LoadBMP() devuelve un puntero a SDL_Surface. Este puntero será necesario para luego mostrar la imagen en cualquier lugar de la pantalla. La variable “fondo” debe ser global si se va a usar en más de una función (si es local y la pasamos como parámetro a otra función, SDL fallará).
Las imágenes son rectangulares. En muchas ocasiones, necesitamos mostrar una imagen encima de otra. Es el caso de las piezas, que se mostrarán encima del tablero. Cuando esto ocurre, el color de fondo de la pieza (que decidimos que fuera negro) aparecerá encima del tablero como un desagradable recuadro de color negro. En estas situaciones, hay que avisar a SDL de que, para este sprite en concreto, el color negro va a ser transparente, es decir, no debe ser mostrado. Esto se hace así:
SDL_Surface *peon_blanco;
Uint32 color; // Para definir el color de transparencia (donde proceda)// Cargamos la imagen del peón blanco
peon_blanco = SDL_LoadBMP("peon_bl.bmp");
if (peon_blanco == NULL) {
printf("Error al cargar el archivo peon_bl.bmp");
SDL_Quit();
exit(-1);
}
// Definimos la transparencia (color negro = (0,0,0) )
color = SDL_MapRGB(peon_blanco->format, 0, 0, 0);
SDL_SetColorKey(cuadro1, SDL_SRCCOLORKEY | SDL_RLEACCEL, color);
Las imágenes cargadas en memoria deben ser liberadas antes de finalizar el programa con una llamada a SDL_FreeSurface(). Por ejemplo, para liberar la memoria ocupada por la imagen “tablero.bmp” que hemos cargado antes usaremos el puntero que obtuvimos al cargarla, así:
SDL_FreeSurface(tablero);
2. Mostrar imágenes en la pantalla
Una vez cargada una imagen BMP en la memoria, podemos mostrarla en la pantalla a través del puntero SDL_Surface que obtuvimos al cargarla. Una imagen cargada puede ser mostrada todas las veces que queramos en cualquier posición de la pantalla.
Por ejemplo, para mostrar la imagen del tablero (que cargamos en un ejemplo del apartado anterior) haríamos lo siguiente (luego comentamos el código)
SDL_Rect rect;
rect = (SDL_Rect) {10, 10, 400, 400};
SDL_BlitSurface(tablero, NULL, pantalla, &rect);
SDL_Flip(pantalla);
La variable “rect” es de tipo SDL_Rect, y define un área rectangular de la pantalla. El área rectangular empieza en las coordenadas (10, 10) (esquina superior izquierda de la pantalla) y mide 400 píxels de ancho y 400 de alto, es decir, termina en (410, 410)
SDL_BlitSurface() es la función que se encarga de mostrar en la pantalla un sprite. La variable “tablero” es de tipo SDL_Surface*, y debe ser la que nos devolvió SDL_LoadBMP() al cargar la imagen del tablero. La variable “pantalla” también es una SDL_Surface*, y debe ser la que nos devolvió SDL_SetVideoMode() al inicializar la pantalla gráfica. Ya dijimos que los punteros que nos devuelven estas funciones son imprescidibles y que debíamos definirlos como variables globales. La variable “rect” es el área rectangular que acabamos de definir.
Observe que “rect” es la que indica en qué lugar de la pantalla va a aparecer el sprite. En este ejemplo, aparecerá en (10,10). Se le han reservado 400×400 píxels para dibujarse, es decir, hasta la posición (410, 410). Si el sprite es más pequeño, no pasará nada (ocupará lo que mida realmente). Si es más grande, se truncará.
Por último, SDL_Flip() hace que lo que acabamos de dibujar se muestre realmente en la pantalla.
Control del teclado
Para leer el teclado en una ventana gráfica creada con SDL no se pueden usar las funciones estándar (como getchar() o gets()), sino las propias de SDL. SDL solo permite leer los caracteres de uno en uno, y no muestra eco por la pantalla (si queremos eco, tenemos que mostrar los caracteres nosotros mismos después de leerlos)
La forma de capturar los caracteres tecleados se muestra un el siguiente ejemplo:
SDL_Event evento; // Para leer el teclado
// Leer teclado
if (SDL_PollEvent(&evento)) // Comprobar si se ha pulsado una tecla
{
if (evento.type == SDL_KEYDOWN) // Efectivamente, se ha pulsado una tecla
{
switch (evento.key.keysym.sym) // Vamos a mirar qué tecla es
{
case SDLK_UP: ...acciones...; break; // Flecha arriba
case SDLK_DOWN: ...acciones...; break; // Flecha abajo
case SDLK_LEFT: ...acciones...; break; // Felcha izquierda
case SDLK_RIGHT: ...acciones...; break; // Flecha derecha
case SDLK_RETURN: ...acciones...; break; // Intro
case SDLK_ESCAPE: ...acciones...; break; // ESC
case SDLK_m: ...acciones...; break; // Tecla "m" (menú)
}
}
}
Existen constantes para cualquiera de las otras teclas del teclado. Todas empiezan por “SDLK_”. Por ejemplo, la tecla “a” tendrá el código “SDLK_a”.
Definición de colores
Aunque en general trataremos con imágenes ya creadas (como la del tablero o las de las piezas), es posible que necesites definir algún color para usarlo directamente sobre la pantalla gráfica (por ejemplo, para usar transparencias o para escribir un texto)
En SDL no hay colores predefinidos, como en ncurses. Los colores debemos definirlos nosotros mezclando los colores básicos RGB (rojo, verde y azul)
Hay dos formas de definir un color: con una variable de tipo “SDL_Color” o con una variable de tipo “Uint32”. El uso de una u otra dependerá de para qué queramos usar ese color.
a) Con una variable de tipo SDL_Color
Se usaría así:
SDL_Color color;
color = (SDL_Color) {50, 150, 200, 255};
Los cuatro números definen el color. Deben ser números comprendidos entre 0 y 255. El primero es el nivel de rojo (R), el segundo el nivel de verde (G) y el tercero, el nivel de azul (B). El cuarto número es el brillo. El color definido en este ejemplo tiene mucho azul, bastante verde y poco rojo. El resultado debe ser un azul amarillento.
b) Con una variable de tipo Uint32
Uint32 color;
color = SDL_MapRGB(pantalla->format, 50, 150, 200);
En esta ocasión, “pantalla” debe ser un puntero a una imagen SDL_Surface que hayamos cargado previamente. Los tres valores siguientes son los niveles RGB. No hay nivel de brillo, porque éste se toma de la imagen apuntada por “pantalla”.
De las dos maneras se pueden definir colores para usarlos posteriormente. Si el color lo necesitamos para una transparencia, recurriremos al segundo método (de hecho, ya vimos un ejemplo de ello al estudiar cómo se cargaban y mostaban las imágenes en SDL; allí usamos el color negro como transparencia). Si el color lo necesitamos para escribir un texto en la pantalla gráfica, usaremos el primer método (como se podrá ver en el siguiente apartado)
Mostrar texto en la pantalla gráfica: la librería SDL_TTF
La librería SDL no permite directamente la escritura de texto en la pantalla gráfica. Esto se debe a que la pantalla gráfica, por definición, no admite caracteres, sino únicamente imágenes.
Por fortuna, a la sombra de SDL se han creado multitud de librerías adicionales que, partiendo de SDL, complementan y mejoran sus prestaciones. Una de ellas es SDL_TTF.
La libería SDL_TTF permite cargar fuentes true type que estén guardadas en archivos “.ttf” y manejarlas como si fueran imágenes BMP en la pantalla gráfica generada por SDL. Necesitamos SDL_TTF, por lo tanto, para escribir los mensajes de usuario, las opciones del menú, etc.
Instalación, compilación y enlace de SDL_TTF
La instalación de la librería SDL_TTF es similar a la de SDL, tanto en Linux como en Windows, de modo que puede remitirse al apartado correspondiente para recordar cómo se hacía.
En cuanto a la compilación y enlace, sólo tiene que añadir la opción “-lSDL_ttf” a la línea de compilación del Makefile:
gcc -g `opciones de SDL` -o ajedrez ajedrez.o movs.o... `más opciones de SDL` -lSDL_ttf
Si estamos compilando en Windows con Dev-C++, agregaremos “-lSDL_ttf” a Opciones del Proyecto / Parámetros / Linker
Inicialización de SDL_TTF
Igual que SDL, la librería SDL_TTF necesita ser inicializada antes de usarla, y finalizada antes de terminar el programa para liberar los recursos adquiridos.
Como SDL_TTF corre por debajo de SDL, debe ser inicializada después de SDL, y debe ser terminada antes que SDL.
La inicialización de SDL_TTF se hace simplemente así:
if (TTF_Init() == -1) {
printf("Fallo al inicializar SDL_TTF");
exit(-1);
}
Inmediatamente después podemos cargar una fuente true type de un archivo TTF, así:
TTF_Font* fuente;
....
fuente = TTF_OpenFont("arial.ttf", 14);
if(fuente == NULL) {
printf("Fallo al abrir la fuente");
exit(-1);
}
TTF_SetFontStyle(fuente, TTF_STYLE_BOLD);
La variable “fuente” es un puntero a la estructura TTF_Font. La función TTF_OpenFont() abre el archivo “arial.ttf” y carga el tipo de letra Arial en tamaño 14 para su uso en el programa. Después es conveniente comprobar que el puntero “fuente” contenga un valor válido y no NULL.
Por último, la función TTF_SetFontStyle() puede usarse para determinar el estilo de la fuente. Tenemos varias posibilidades: TTF_STYLE_BOLD (negrita), TTF_STYLE_ITALIC (cursiva), TTF_STYLE_UNDERLINE (subrayado) y TTF_STYLE_NORMAL. Si queremos combinar varios estilos, podemos separarlos por el operador “|”. Por ejemplo, para poner la fuente en negrita y cursiva escribiríamos esto:
TTF_SetFontStyle(fuente, TTF_STYLE_BOLD | TTF_STYLE_ITALIC);
Finalización de SDL_TTF
El proceso de finalización es inverso y complementario al de inicialización. Primero habrá que liberar todas las fuentes cargadas durante la inicialización, y luego hay que terminar el subsistema SDL_TTF.
Para liberar una fuente escribiremos sencillamente:
TTF_CloseFont(fuente);
La variable “fuente” será de tipo TTF_Font*, y debe coincidir con la que nos devolvió la función TTF_OpenFont(). Esta operación la repetiremos con cada una de las fuentes que hayamos cargado.
Después finalizaremos SDL_TTF escribiendo:
TTF_Quit();
Recuerda que esto debe hacerse ANTES de SDL_Quit(), ya que SDL_TTF depende de SDL.
Escribir texto con SDL_TTF
Todo esto lo hacemos con un objetivo: poder escribir texto en la pantalla gráfica y sustituir así todas las funciones printf() y similares.
Para escribir un texto hay que hacer dos cosas: primero, convertirlo en una imagen; segundo, mostrar la imagen en la pantalla.
La conversión de un texto en una imagen se hace con la función TTF_Render():
SDL_Color color;
SDL_Surface* txt_img;
color = (SDL_Color) {255,100,100,255};
txt_img = TTF_RenderText_Blended(fuente, "Hola mundo", color);
if(txt_img == NULL) {
printf("Fallo al renderizar el texto");
exit(-1);
}
Como ve, hay que hacer bastantes cosas para mostrar un texto en la pantalla gráfica, pero todo es acostumbrarse. Primero, hay que definir un color para el texto (cómo se definen los colores es algo que vimos en el epígrafe anterior). En este caso, hemos escogido un rojo brillante.
Después se invoca a TTF_RenderText(), pasándole como parámetros el puntero a la fuente que obtuvimos con TTF_OpenFont(), el texto que queremos mostrar y el color. La función nos devuelve un puntero de tipo SDL_Surface* que, si recuerdas, es exactamente el mismo que usábamos con las imágenes cargadas desde un archivo BMP.
En realidad, la función TTF_RenderText() tiene tres formas:
- TTF_RenderText_Solid(): realiza una conversión del texto en imagen rápida pero de poca calidad.
- TTF_RenderText_Shaded(): la imagen resultante es de gran calidad pero tiene un recuadro negro alrededor
- TTF_RenderText_Blended(): la imagen resultante es de gran calidad y sin recuadro negro
En general preferiremos el modo “Blended”, que es el que proporciona mejores resultados. El modo “Shaded” se puede usar en determinados lugares (si no hay otra imagen debajo del texto). El modo “Solid” sólo debe usarse si hay que mostrar mucho texto y el modo “Blended” se revela demasiado lento.
Hasta aquí, sólo hemos convertido el texto “Hola mundo” en una imagen, pero aún no la hemos mostrado en la pantalla. Para hacerlo procederemos como con cualquier otra imagen:
// Mostramos el texto como si fuera una imagen
rect = (SDL_Rect) { 500, 280, 100, 30 };
SDL_BlitSurface(txt_img, NULL, pantalla, &rect);
SDL_Flip(scr);
Se supone que “rect” es de tipo SDL_Rect y que pantalla es el puntero a SDL_Surface* que nos devolvió SDL_SetVideoMode() al inicializar SDL. Así, el texto “Hola mundo” se mostrará en la posición (500, 280) de la pantalla gráfica, reservándose para él 100 píxels de ancho y 30 de alto.
Últimos comentarios