3 Texto

La librería SDL 2 no dispone de funciones para mostrar texto en la ventana, por lo tanto tendremos que acudir a la librería SDL_ttf.

Al contrario de lo que sucede con SDL_image, con SDL_ttf será necesario inicializar la librería antes de usarla, y liberarla al terminar, usando las funciones TTF_Init y TTF_Quit.

La librería SDL_ttf, como su nombre indica, utiliza fuentes TrueType, que son escalables, aunque también puede usar fuentes no escalables (las que tienen extensión .fon), por lo que será necesario que nuestro programa pueda acceder a los ficheros que contienen esas fuentes.

Abrir una fuente

Windows almacena las fuentes en una carpeta llamada "fonts" en el directorio del sistema, pero si queremos asegurarnos de que nuestros programas SDL tienen acceso a las fuentes que utiliza, no es mala idea copiarlas a la misma carpeta que la aplicación.

Lo primero que tenemos que hacer es abrir una fuente para nuestro texto. Esto se consigue con la función TTF_OpenFont, a la que pasaremos dos parámetros: el fichero de la fuente y el tamaño. Esta función nos devolverá un puntero a una estructura opaca TTF_Font, que usaremos como manipulador para referirnos a ella en las funciones que la usen.

Las fuentes creadas utilizan recursos del sistema, por lo que deberemos asegurarnos de liberarlas, o cerrarlas, cuando ya no las necesitemos, y antes de cerrar la librería, usando la función TTF_CloseFont.

Crear un texto

Las imágenes que contienen el texto se almacenan en una estructura SDL_Surface, por lo que primero deberemos convertirlas a texturas para después copiarlas al contexto de renderizado.

Disponemos de un montón de funciones para crear texto, que podemos clasificar en cinco grupos: Glypth32, Glyph, Text, UNICODE, y UTF8.

Cada grupo tiene cuatro variantes: Blended, LCD, Shaded y Solid, o sea, mezclado, LCD, sombreado y sólido.

Los grupos Text, UNICODE, y UTF8 disponen además de una variante para estas cuatro, Wrapped, o sea, envuelto.

Esto nos da un total de treinta y dos funciones.

Grupos

Grupo Glyph32
Toman como parámetro un único carácter de 32 bits.
Grupo Glyph
Toman como parámetro un único carácter de 16 bits. A partir de la versión 2.0.18 de SDL_ttf no tiene sentido usar este grupo de funciones, y es preferible usar Glyph32.
Grupo Text
Toman como parámetro una cadena de texto C, un char*, en codificación Latin1. Esta es la codificación normal por defecto en Windows, al menos en español e inglés.
Grupo UNICODE
Toman como parámetro una cadena de caracteres Uint16*, en codificación UCS-2.
Grupo UTF8
Toman como parámetro una cadena de caracteres de 8 bits, en codificación UTF8. Por compatibilidad, tal vez sea la mejor opción, siempre que escribamos nuestro código con codificación UTF8.

Variantes

Variante Blended
Crea superficies ARGB, es decir, de 32 bits, incluyendo el canal alfa.
Variante LCD
Crea superficies ARGB, es decir, de 32 bits, incluyendo el canal alfa, pero en calidad subpixel.
Variante Solid
Crea superficies de ocho bits, con paleta, lo que es más rápido.
Variante Shaded
Crea superficies de ocho bits, con paleta, igual que Solid, pero admite un parámetro extra para el color de fondo.

Variante Wrapped

Permite dividir el texto en varias líneas. Requiere un parámetro extra para indicar la longitud máxima de cada línea.

Funciones

Estas son todas las funciones disponibles para generar superficies a partir de texto:

Blended
Wrapped
LCD
Wrapped
Shaded
Wrapped
Solid
Wrapped
Glyph32TTF_RenderGlyph32_BlendedTTF_RenderGlyph32_LCDTTF_RenderGlyph32_ShadedTTF_RenderGlyph32_Solid
GlyphTTF_RenderGlyph_BlendedTTF_RenderGlyph_LCDTTF_RenderGlyph_ShadedTTF_RenderGlyph_Solid
TextTTF_RenderText_Blended
TTF_RenderText_Blended_Wrapped
TTF_RenderText_LCD
TTF_RenderText_LCD_Wrapped
TTF_RenderText_Shaded
TTF_RenderText_Shaded_Wrapped
TTF_RenderText_Solid
TTF_RenderText_Solid_Wrapped
UNICODETTF_RenderUNICODE_Blended
TTF_RenderUNICODE_Blended_Wrapped
TTF_RenderUNICODE_LCD
TTF_RenderUNICODE_LCD_Wrapped
TTF_RenderUNICODE_Shaded
TTF_RenderUNICODE_Shaded_Wrapped
TTF_RenderUNICODE_Solid
TTF_RenderUNICODE_Solid_Wrapped
UTF8TTF_RenderUTF8_Blended
TTF_RenderUTF8_Blended_Wrapped
TTF_RenderUTF8_LCD
TTF_RenderUTF8_LCD_Wrapped
TTF_RenderUTF8_Shaded
TTF_RenderUTF8_Shaded_Wrapped
TTF_RenderUTF8_Solid
TTF_RenderUTF8_Solid_Wrapped

A estas funciones hay que añadir las tres macros incluidas por retrocompatibilidad: TTF_RenderText, TTF_RenderUNICODE y TTF_RenderUTF8. Que son alias para las funciones TTF_RenderText_Shaded, TTF_RenderUNICODE_Shaded y TTF_RenderUTF8_Shaded, respectivamente.

Modificadores

Ejemplo fuente Arial, 72p, italic, outline, hueca.
Ejemplo fuente Arial, 72p, italic, outline, hueca.

Una vez abierta una fuente tenemos varias opciones para modificarla.

Podemos cambiar la dirección del texto, mediante la función TTF_SetFontDirection.

Podemos modificar el estilo, con la función TTF_SetFontStyle.

También podemos modificar el tamaño, con TTF_SetFontSize.

Para modificar el contorno podemos usar la función TTF_SetFontOutline.

Podemos establecer diferentes opciones de fuentes huecas mediante TTF_SetFontHinting, combinando con TTF_SetFontOutline.

Obtener el tamaño de un texto

Es posible obtener el tamaño de una cadena antes de renderizarla. Para ello disponemos de tres funciones: TTF_SizeText, TTF_SizeUNICODE y TTF_SizeUTF8.

Mostrar el texto

Las funciones de renderizado de texto crean una superficie, pero no podemos mostrar superficies directamente en la ventana, antes tendremos que convertirlas en texturas.

Para convertir una superficie en una textura usaremos la función SDL_CreateTextureFromSurface.

Y para calcular las dimensiones de una textura usaremos la función SDL_QueryTexture.

    SDL_Rect rTexto;
...
    superficie = TTF_RenderUTF8_Blended(fuente, "Hola, SDL 2.", blanco);
    texture = SDL_CreateTextureFromSurface(renderer, superficie);
    SDL_QueryTexture(texture, NULL, NULL, &rTexto.w, &rTexto.h);
    rTexto.x = rTexto.y = 30;
    SDL_RenderCopy(renderer, texture, NULL, &rTexto);

Ejemplo 2

Nombre Fichero Fecha Tamaño Contador Descarga
Ejemplo 2 sdl_002.zip 2024-01-07 1947028 bytes 32