AnteriorPosterior

2. Mostrando una imagen en pantalla

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

2. Mostrando una imagen en pantalla


Mostrar una imagen en pantalla puede ser muy fácil, si nos lo dan hecho, o muy complejo, si necesitamos conocer perfectamente cómo es internamente el fichero que queremos representar.

La mayoría de las bibliotecas de funciones permiten mostrar al menos algún tipo de imágenes, aunque a veces se trate sólo de las BMP sin comprimir y/o de las PCX, que son los dos formatos más sencillos.

En el caso de SDL, podemos cargar en memoria una imagen BMP con la orden SDL_LoadBMP:

fondo = SDL_LoadBMP("fondo.bmp");

donde esa imagen se debe haber definido primero como una variable del tipo SDL_Surface (realmente, un puntero a este tipo):

SDL_Surface *fondo;

Para volcar la imagen en pantalla tenemos la orden SDL_BlitSurface, que tiene cuatro parámetros:
  • La imagen a volcar
  • Un "rectángulo" opcional, si queremos sólo volcar parte de la imagen
  • La imagen sobre la que queremos colocarla
  • Un rectángulo que indique la posición en la que queremos colocarla

Ese tipo "rectángulo" existe en SDL, se llama SDL_Rect, y se trata de un registro (struct), que tiene como campos:
  • x: posición horizontal
  • y: posición vertical
  • w: anchura (width)
  • h: altura (height)

Por tanto, mostraríamos nuestra imagen en las coordenadas (0,0) de la pantalla haciendo:

SDL_Rect destino;
destino.x=0;
destino.y=0;
SDL_BlitSurface(fondo, NULL, screen, &destino);

Finalmente, debemos asegurarnos de que la pantalla se actualiza, con la orden SDL_Flip:

SDL_Flip(screen);

Si juntamos todo esto, nuestro segundo fuente quedaría así:

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

5:
6: #include <stdio.h>
7: #include <stdlib.h>
8: #include <SDL/SDL.h>
9:
10: int main()
11: {
12: SDL_Surface *screen;
13: SDL_Surface *fondo;
14: SDL_Surface *protagonista;
15: SDL_Rect destino;
16: int i, j;
17:
18: /* Tratamos de inicializar la biblioteca SDL */
19: if (SDL_Init(SDL_INIT_VIDEO) < 0) {
20: printf("No se pudo inicializar SDL: %s\n", SDL_GetError());
21: exit(1);
22: }
23:
24: /* Preparamos las imagenes a mostrar */
25: fondo = SDL_LoadBMP("fondo.bmp");
26: protagonista = SDL_LoadBMP("protag.bmp");
27:
28: /* Si todo ha ido bien, hacemos algo:
29: entrar a modo grafico y cambiar el título de la ventana */

30: screen = SDL_SetVideoMode( 640, 480, 16, SDL_HWSURFACE );
31: if( screen == NULL ) {
32: printf( "Error al entrar a modo grafico: %s\n", SDL_GetError() );
33: SDL_Quit();
34: return -1;
35: }
36:
37: /* Titulo de la ventana */
38: SDL_WM_SetCaption( "Hola mundo 2!", "Hola Mundo 2!" );
39:
40: /* Dibujamos la imagen de fondo */
41: /* Como tiene 207 x 211 pixeles, la repetimos varias veces */
42: for (i=0; i<3; i++)
43: for (j=0; j<3; j++) {
44: destino.x=207*i;
45: destino.y=211*j;
46: SDL_BlitSurface(fondo, NULL, screen, &destino);
47: }
48:
49: /* Dibujamos el protagonista */
50: destino.x=320;
51: destino.y=400;
52: SDL_BlitSurface(protagonista, NULL, screen, &destino);
53:
54: /* Actualizamos la pantalla */
55: SDL_Flip(screen);
56:
57: /* Y esperamos antes de salir */
58: SDL_Delay( 5000 );
59:
60: /* Finalmente, preparamos para salir */
61: SDL_Quit();
62: return 0;
63: }


que en pantalla se vería

Segundo ejemplo


Nota: las dos imágenes que se han usado en este ejemplo son éstas (las que puedes ver son en formato PNG, ya que el formato BMP no es estándar en Internet; si las quieres como BMP, las tienes como enlace un poco más abajo, o puedes convertir éstas):

Fondo: [fondo] Protagonista: [protag.]

(Fondo en BMP)
(Protagonista en BMP)

Actualizado el: 06-06-2006 12:38

AnteriorPosterior