AnteriorPosterior

3. Moviendo algo por la pantalla

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

3. Moviendo algo por la pantalla


Ya sabemos cómo dibujar un fondo repetido en la pantalla, y como situar nuestro protagonista encima de él.

La siguiente mejora necesaria es poder mover a ese protagonista por encima del fondo.

Para eso necesitamos poder comprobar qué teclas se están pulsando. Lo podemos conseguir haciendo:

        teclas = SDL_GetKeyState(NULL);
        if (teclas[SDLK_UP]) { y -= 2; }

Por cierto, la variable "teclas", será un array de "unsigned int". La forma normal de declararla será ésta:

  Uint8* teclas;


Eso sí, antes de poner acceder al estado de cada tecla, deberemos poner en marcha todo el sistema de comprobación de sucesos ("events", en inglés). Al menos deberemos comprobar si hay alguna petición de abandonar el programa (por ejemplo, pulsando la X de la ventana). De paso, podríamos comprobar en este mismo paso si se ha pulsado la tecla ESC, que es otra forma razonable de indicar que queremos terminar el programa:

        while (SDL_PollEvent(&suceso)) {
          if (suceso.type == SDL_QUIT)    terminado = 1;      
          if (suceso.type == SDL_KEYDOWN)
            if (suceso.key.keysym.sym == SDLK_ESCAPE)  terminado = 1; 
        }

donde la variable suceso se declararía con

SDL_Event suceso;

Si añadimos todo esto al fuente (y la posibilidad de repetirse hasta que indiquemos que queremos salir), tendríamos:

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

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

34: screen = SDL_SetVideoMode( 640, 480, 16, SDL_HWSURFACE );
35: if(screen == NULL) {
36: printf( "Error al entrar a modo grafico: %s\n", SDL_GetError() );
37: SDL_Quit();
38: return -1;
39: }
40:
41: /* Titulo de la ventana */
42: SDL_WM_SetCaption( "Hola mundo 3!", "Hola Mundo 3!" );
43:
44: /* Parte repetitiva: hasta que se elija terminar */
45: while(terminado == 0) {
46:
47: /* Dibujamos la imagen de fondo */
48: /* Como tiene 207 x 211 pixeles, la repetimos varias veces */
49: for (i=0; i<3; i++)
50: for (j=0; j<3; j++) {
51: destino.x=207*i;
52: destino.y=211*j;
53: SDL_BlitSurface(fondo, NULL, screen, &destino);
54: }
55:
56: /* Dibujamos el protagonista */
57: destino.x=xProt;
58: destino.y=yProt;
59: SDL_BlitSurface(protagonista, NULL, screen, &destino);
60:
61: /* Actualizamos la pantalla */
62: SDL_Flip(screen);
63:
64: /* Miramos si hay algun suceso pendiente,
65: entre ellos, peticion de abandonar el programa
66: (pulsar la X de la ventana) o tecla ESC */

67: while (SDL_PollEvent(&suceso)) {
68: if (suceso.type == SDL_QUIT) terminado = 1;
69: if (suceso.type == SDL_KEYDOWN)
70: if (suceso.key.keysym.sym == SDLK_ESCAPE) terminado = 1;
71: }
72:
73: /* Vemos el estado indivudal de las demas teclas */
74: teclas = SDL_GetKeyState(NULL);
75: if (teclas[SDLK_UP]) { yProt -= 2; }
76: if (teclas[SDLK_DOWN]) { yProt += 2; }
77: if (teclas[SDLK_LEFT]) { xProt -= 3; }
78: if (teclas[SDLK_RIGHT]) { xProt += 3; }
79:
80: /* Y esperamos 50 ms antes de repetir */
81: SDL_Delay( 50 );
82: }
83:
84: /* Finalmente, preparamos para salir */
85: SDL_Quit();
86: return 0;
87: }



(la apariencia de nuestro programa es igual que la de antes... pero ahora nuestra nave SÍ se puede mover).


Por supuesto, queda mucho por hacer: el fondo se borra en los alrededores de la nave, no hay enemigos, no hay puntuación, no hay niveles con dificultad creciente...

Todo llegará... esperemos...


Actualizado el: 31-05-2006 16:39

AnteriorPosterior