AnteriorPosterior

5. Cómo escribir texto

  Curso: Introducción a los gráficos en C con SDL

5. Cómo escribir texto


Escribir texto con SDL no es algo "trivial". No existen funciones predefinidas que muestren una frase en ciertas coordenadas de la pantalla.

Por eso, tenemos que hacerlo "a mano": preparar una imagen que tenga las letras que queremos mostrar, y tratarlas como si fuera una imagen.

Si queremos que no todo sean textos predefinidos, tendremos también que crearnos nuestras propias funciones. La forma más habitual es comenzar por incluir todas las letras en una imagen:

Fuente Arial

Tendríamos ciertos datos predefinidos sobre nuestra fuente, como el ancho total o el ancho de cada letra:

struct tipoFuente{
SDL_Surface
*imagen;
int ancho, alto;
int anchoLetra, altoLetra;
int primeraLetra;
} fuente;


Después, para mostrar cada letra, deberíamos calcular en qué posición se encuentra y extraerla. Una forma muy detallada de conseguirlo sería

int escribirLetra(int x, int y, char letra) {
SDL_Rect destino
, origen;
int fila, columna;
int letrasPorFila, letrasPorColumna;

letrasPorFila
= fuente.ancho/fuente.anchoLetra;
letrasPorColumna
= fuente.alto/fuente.altoLetra;
fila
= letra / letrasPorColumna;
columna
= letra % letrasPorColumna;
origen
.x = columna * fuente.anchoLetra;
origen
.y = fila * fuente.altoLetra;
origen
.w = 16;
origen
.h = 16;
destino
.x = x;
destino
.y = y;
SDL_BlitSurface
(fuente.imagen, &origen, screen, &destino);
}


Y para escribir toda una frase habría que hacerlo letra a letra:

 int escribirFrase(int x, int y, char *frase) {
int i;
for (i=0; i<strlen(frase); i++)
escribirLetra
(x+i*fuente.anchoLetra, y, frase[i]);
}



El programa completo podría ser así

  1: /*******************************************
2: * Introduccion a SDL - 5 *
3: * Curso de C, Nacho Cabanes *
4: *******************************************/

5:
6: #include
<stdlib.h>
7: #include
<string.h>
8: #include
<SDL/SDL.h>
9:
10:
/* Variables: */
11: SDL_Surface
*screen; /* La pantalla */
12:
13:
14:
/* Esta va a ser nuestra "fuente" */
15: struct tipoFuente
{
16: SDL_Surface
*imagen;
17:
int ancho, alto;
18:
int anchoLetra, altoLetra;
19:
int primeraLetra;
20:
} fuente;
21:
22:
/* ----- Funciones auxiliares para fuentes ----*/
23:
/* Leer una fuente desde fichero */
24:
int leerFuente(char nombre[]) {
25: fuente
.imagen = SDL_LoadBMP(nombre);
26:
/* Los siguientes valores son prefijados para la fuente
27: de ejemplo: 16x16 caracteres, cada uno de 16x16 pixels;
28: habria que modificarlo si se usan fuentes de otro tamño */

29: fuente
.ancho=256;
30: fuente
.alto=256;
31: fuente
.anchoLetra=16;
32: fuente
.altoLetra=16;
33: fuente
.primeraLetra=0;
34:
}
35:
36:
/* Mostrar toda la fuente en pantalla,
37: sólo como auxiliar */

38:
int mostrarFuente(int x, int y) {
39: SDL_Rect destino
;
40: destino
.x = x;
41: destino
.y = y;
42: SDL_BlitSurface
(fuente.imagen, NULL, screen, &destino);
43:
}
44:
45:
/* Escribir una letra */
46:
int escribirLetra(int x, int y, char letra) {
47: SDL_Rect destino
, origen;
48:
int fila, columna;
49:
int letrasPorFila, letrasPorColumna;
50:
51: letrasPorFila
= fuente.ancho/fuente.anchoLetra;
52: letrasPorColumna
= fuente.alto/fuente.altoLetra;
53: fila
= letra / letrasPorColumna;
54: columna
= letra % letrasPorColumna;
55: origen
.x = columna * fuente.anchoLetra;
56: origen
.y = fila * fuente.altoLetra;
57: origen
.w = 16;
58: origen
.h = 16;
59: destino
.x = x;
60: destino
.y = y;
61: SDL_BlitSurface
(fuente.imagen, &origen, screen, &destino);
62:
}
63:
64:
/* Escribir una frase */
65:
int escribirFrase(int x, int y, char *frase) {
66:
int i;
67:
for (i=0; i<strlen(frase); i++)
68: escribirLetra
(x+i*fuente.anchoLetra, y, frase[i]);
69:
}
70:
71:
/* ------ Fin de funciones para fuentes ------ */
72:
73:
74:
75:
/* Cuerpo del programa */
76:
int main(int argc, char *argv[])
77:
{
78:
/* Tratamos de inicializar la biblioteca SDL */
79:
if (SDL_Init(SDL_INIT_VIDEO) < 0) {
80: printf
("No se pudo inicializar SDL: %s\n", SDL_GetError());
81: exit
(1);
82:
}
83:
84:
/* Si todo ha ido bien, hacemos algo:
85: entrar a modo grafico y cambiar el titulo de la ventana */

86: screen
= SDL_SetVideoMode( 640, 480, 16, SDL_HWSURFACE );
87:
if( screen == NULL ) {
88: printf
( "Error al entrar a modo grafico: %s\n", SDL_GetError() );
89: SDL_Quit
();
90:
return -1;
91:
}
92:
93:
94:
/* Cambiamos el texto de la ventana */
95: SDL_WM_SetCaption
( "Hola texto!", "Hola texto!" );
96:
97:
/* Leemos la fuente, la mostramos y tomamos una letra */
98: leerFuente
("font_arial.bmp");
99: mostrarFuente
(10, 10);
100: escribirLetra
(400, 10, 'A');
101: escribirFrase
(400, 30, "Hola");
102:
103:
/* Actualizamos la pantalla */
104: SDL_Flip
(screen);
105:
106:
/* Esperamos 5 segundos */
107: SDL_Delay
( 5000 );
108:
109:
/* Finalmente, preparamos para salir */
110: SDL_Quit
();
111:
return 0;
112:
}

Y en pantalla aparecería algo como


sdl 5

Actualizado el: 31-05-2006 18:50

AnteriorPosterior