Curso programación de videojuegos con SDL – Incluyendo enemigos

¿Qué sería de un videojuego de este tipo sin enemigos? La verdad es que es difícil de imaginar por lo que aunque de una manera no demasiado cuidada vamos a incluirlos. Sabiendo ya incluir imágenes y moverlas, la operación es sencilla:

  1. Creamos una nueva estructura de datos para guardar la posición de los enemigos más cómodamente:
    struct posicion{
    int x;
    int y;
    };
  2. El correspondiente puntero para referencia el vector de posiciones:struct posicion *posicionesEnemigos;
  3. Un entero para el número de enemigos: int numeroEnemigos=10;
  4. Un doble puntero para referenciar un vector con los punteros a los enemigos: SDL_Surface **enemigos;
  5. Reservamos memoria para ambos:
    enemigos=(SDL_Surface**)malloc(sizeof(SDL_Surface*)*numeroEnemigos);
    posicionesEnemigos=(struct posicion*)malloc(sizeof(struct posicion)*numeroEnemigos);
  6. Cargamos los mapas de bits, con transparencia, para cada uno de los enemigos. Además inicializamos las posiciones de los enemigos de la siguiente manera:
  • Posición X: Un valor entre 0 y 590 para que quede dentro de la pantalla.
  • Posición Y: Un valor entre 20 y 100 para que no esten todos alineados.

     for(i=0;i<numeroEnemigos;i++)
     {
          enemigos[i]=SDL_LoadBMP(“enemigo.bmp”);
          SDL_SetColorKey (enemigos[i], SDL_SRCCOLORKEY,      SDL_MapRGB (enemigos[i]->format, MASK));
          posicionesEnemigos[i].x=rand()%590+1;
          posicionesEnemigos[i].y=60-rand()%40+1;
     }

  1. Modificamos el título de la ventana: SDL_WM_SetCaption( “Incluyendo enemigos”, “Incluyendo enemigos” );
  2. Dentro del bucle hacemos:
    1. Colocamos las superficies de los enemigos:
      for(i=0;i<numeroEnemigos;i++)
      {
      posicion.x=posicionesEnemigos[i].x;
      posicion.y=posicionesEnemigos[i].y;
      SDL_BlitSurface(enemigos[i], NULL, screen, &posicion);
      }
    2. Le damos velocidad a los enemigos:for(i=0;i<numeroEnemigos;i++){ posicionesEnemigos[i].y+=2;}

    Veamos en una imagen cómo queda:

    Y el código completo serían el siguiente:

    #include <stdio.h> #include <stdlib.h> #include <SDL/SDL.h> #include <time.h> #define MASK 255, 255, 255 struct posicion{ int x; int y; }; int main() { SDL_Surface *screen; SDL_Surface *fondo; SDL_Surface *jugador; SDL_Surface **enemigos; struct posicion *posicionesEnemigos; SDL_Event event; SDL_Rect posicion; int terminar=0; int numeroEnemigos=10; int i, j; int posicionJugadorX=290, posicionJugadorY=430; Uint8* teclas; srand(time(NULL)); if (SDL_Init(SDL_INIT_VIDEO) < 0) { printf("No se pudo inicializar SDL: %s\n", SDL_GetError()); exit(1); } /*creando vector para contener enemigos*/ enemigos=(SDL_Surface**)malloc(sizeof(SDL_Surface*)*numeroEnemigos); /*y vector para posiciones de los mismos*/ posicionesEnemigos=(struct posicion*)malloc(sizeof(struct posicion) *numeroEnemigos); fondo = SDL_LoadBMP("fondo.bmp"); jugador = SDL_LoadBMP("avion.bmp"); SDL_SetColorKey (jugador, SDL_SRCCOLORKEY, SDL_MapRGB (jugador->format, MASK)); /*cargando graficos para enemigos y generando posiciones iniciales para los enemigos*/ for(i=0;i<numeroEnemigos;i++) { enemigos[i]=SDL_LoadBMP("enemigo.bmp"); SDL_SetColorKey (enemigos[i], SDL_SRCCOLORKEY, SDL_MapRGB (enemigos[i]->format, MASK)); posicionesEnemigos[i].x=rand()%590+1; posicionesEnemigos[i].y=60-rand()%40+1; } screen = SDL_SetVideoMode( 640, 480, 16, SDL_HWSURFACE ); if( screen == NULL ) { printf( "Error al entrar a modo grafico: %s\n", SDL_GetError() ); SDL_Quit(); return -1; } SDL_WM_SetCaption( "Incluyendo enemigos", "Incluyendo enemigos" ); 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); for(i=0;i<numeroEnemigos;i++) { posicion.x=posicionesEnemigos[i].x; posicion.y=posicionesEnemigos[i].y; SDL_BlitSurface(enemigos[i], NULL, screen, &posicion); } SDL_Flip(screen); while ( SDL_PollEvent(&event) ) { if (event.type == SDL_QUIT || event.key.keysym.sym == SDLK_ESCAPE) terminar = 1; } 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; } for(i=0;i<numeroEnemigos;i++) { posicionesEnemigos[i].y+=2; } } SDL_Quit(); return 0; } read more

Leer más » 8 Comentarios