Curso programación de videojuegos con SDL – Moviendo una imagen por la pantalla

Tras cargar la imagen y quedarse estática en la pantalla os darán ganas de moverla. Aprendamos a como moverla por la pantalla con las flechas del teclado. Aprovecharemos para cambiar la forma de salirnos de la aplicación, ahora lo podremos hacer mediante la tecla ESC o haciendo clic en el cierre de la ventana. Veamos como en el caso anterior lo que debemos incluir:

  1. Declaramos un entero para las coordenadas X e Y de nuestro avión:int posicionJugadorX=320, posicionJugadorY=40;
  2. Declaramos un puntero, para que se almacene un vector dinámico con las teclas pulsadas:Uint8* teclas;
  3. Cambiamos la estructura del programa. Ahora, tras inicializar todo, parte que terminamos cambiando el título a la ventana, pasamos a hacer un bucle para que el programa se ejecute hasta que el jugador quiera salir.while(!terminar)
  4. Usamos la variable posicion tanto para dibujar el fondo como el avión en cada paso del bucle:SDL_BlitSurface(fondo, NULL, screen, &posicion); …posicion.x=posicionJugadorX; posicion.y=posicionJugadorY; SDL_BlitSurface(jugador, NULL, screen, &posicion);
  5. Bucle para detectar salidas (pulsación de ESC o de la cruz de cerrar programa):while ( SDL_PollEvent(&event) ) {if(event.type == SDL_QUIT || event.key.keysym.sym == SDLK_ESCAPE)terminar = 1;}
  6. Finalmente, el resto de las teclas:teclas = SDL_GetKeyState(NULL);if(teclas[SDLK_UP]) { posicionJugadorY -= 2; }if(teclas[SDLK_DOWN]) { posicionJugadorY += 2;}if(teclas[SDLK_LEFT]) { posicionJugadorX -= 2; }if(teclas[SDLK_RIGHT]) { posicionJugadorX += 2; }

De esta manera conseguiremos que nuestro avión se mueva a través de la pantalla siguiendo nuestras órdenes. Modificaremos nuestro fichero Makefile para poder compilar este ejemplo. El resultado es el mismo que antes pero podemos mover nuestro avión. El código completo:

#include <stdio.h>
#include <stdlib.h>
#include <SDL/SDL.h>
#define MASK 255, 255, 255

int main()
{
SDL_Surface *screen;
SDL_Surface *fondo;
SDL_Surface *jugador;
SDL_Event event;
int terminar=0;
SDL_Rect posicion;
int i, j;
int posicionJugadorX=320, posicionJugadorY=40;
Uint8* teclas;

if (SDL_Init(SDL_INIT_VIDEO) < 0)
{
printf("No se pudo inicializar SDL: %sn", SDL_GetError());
exit(1);
}

fondo = SDL_LoadBMP("fondo.bmp");
jugador = SDL_LoadBMP("avion.bmp");

SDL_SetColorKey (jugador, SDL_SRCCOLORKEY, SDL_MapRGB (jugador->format, MASK));

screen = SDL_SetVideoMode(640, 480, 16, SDL_HWSURFACE );

if( screen == NULL )
{
  printf( "Error al entrar a modo grafico: %sn", SDL_GetError() );
  SDL_Quit();
  return -1;
}

SDL_WM_SetCaption( "Moviendo nuestro avion", "Moviendo nuestro avion" );

while(!terminar)
{
  for (i=0; i<10; i++)
    for (j=0; j<10; j++)
    {
      posicion.x=64*i;
      posicion.y=48*j;
      SDL_BlitSurface(fondo, NULL, screen, &posicion);
    }

  posicion.x=posicionJugadorX;
  posicion.y=posicionJugadorY;
  SDL_BlitSurface(jugador, NULL, screen, &posicion);

  SDL_Flip(screen);

  /*salida con ESC o cerrar ventana*/
  while ( SDL_PollEvent(&event) )
  {
    if (event.type == SDL_QUIT || event.key.keysym.sym == SDLK_ESCAPE)
      terminar = 1;
  }

  /* Vemos el estado indivudal de las teclas de la cruceta */
  teclas = SDL_GetKeyState(NULL);

  if (teclas[SDLK_UP]) { posicionJugadorY -= 2; }
  if (teclas[SDLK_DOWN]) { posicionJugadorY += 2;}
  if (teclas[SDLK_LEFT]) { posicionJugadorX -= 2; }
  if (teclas[SDLK_RIGHT]) { posicionJugadorX += 2; }
}

SDL_Quit();

return 0;
}

Entradas relacionadas:

  1. Curso programación de videojuegos con SDL – Cargando imágenes con SDL
  2. Curso programación de videojuegos con SDL – ¡Hola mundo!
  3. Curso programación de videojuegos con SDL – Allegro, otra librería para el desarrollo de videojuegos
  4. Curso programación de videojuegos con SDL – Introducción
  5. Curso programación de videojuegos con SDL – ¿Qué es SDL?

Acerca de F. Javier Carazo Gil

Casi Ingeniero Informático, co-fundador y administrador de Linux Hispano, co-fundador de Red de Autores y Geometrio, puedes saber más sobre mí, mi vida laboral, mis libros, mis artículos y mi día a día en @fjcarazo y en mi perfil público de LinkedIn.
  • Pingback: Bitacoras.com

  • javier parra rico

    gracias carazo a ver si lo ponemos en practica

    salu2

  • http://www.jcarazo.com F. Javier Carazo Gil

    @javier parra: Gracias por seguirnos, en breve os traeré más entregas.

  • ubuntero

    solo una duda ¿donde ubico las imagenes? probe en varios luagares y nada :( , hasta que defini su ruta “/home/usuario/proyecto/fondo.bmp” por ejemplo, pero me queda la duda

  • http://www.jcarazo.com F. Javier Carazo Gil

    @ubuntero: En los ejemplos que hago, como los estamos compilando a “pelo” sin usar un IDE (Anjuta no estaría mal para este caso) pon las imágenes en el mismo directorio que tienes el binario que generas.