Remake (parcial) de Fruity Frank... 11 - Varios enemigos distintos

(Volver al índice)

Si queremos tener varios enemigos, cada uno de los cuales tenga una posición, una velocidad distinta, etc., una forma sencilla de hacerlo es crear un "array de structs". El "struct" representará los datos que vamos a guardar de cada uno de nuestros enemigos. Por ejemplo:

struct enemigo
{
    int x;       // Posicion horizontal
    int y;       // Posicion vertical
    int ancho;   // Ancho en pixeles
    int incrX;   // Incremento horiz (velocidad)
    int tipo;    // Tipo de enemigo: Pepino, narizotas, etc
    bool activo; // Vivo o muerto?
};

Y el array guardará esos datos para una serie de enemigos:

const int NUMENEMIGOS = 5;
enemigo enemigos[NUMENEMIGOS];

Antes preparábamos una serie de datos iniciales para un único enemigo:

    // Posicion inicial y tamaño del enemigo
    int xEnemigo1=250, yEnemigo1=250;
    int anchoEnemigo1=40;
    int incrEnemigo=3;

Ahora tendremos que preparar datos iniciales para varios enemigos, así que lo podemos hacer de forma repetitiva, con un "for":

    // Posicion inicial y tamaño de los enemigos
    enemigo enemigos[NUMENEMIGOS];
    for (i=0; i<NUMENEMIGOS; i++)
    {
        enemigos[i].x = 250 + i*40;
        enemigos[i].y = 250 + i*30;
        enemigos[i].ancho = 40;
        enemigos[i].incrX = 3;
        if (i<3)
          enemigos[i].tipo = TIPOENEMIGOPEPINO;
        else
          enemigos[i].tipo = TIPOENEMIGONARIZ;
        enemigos[i].activo = true;
    }

De igual modo, antes dibujábamos un único enemigo:

   SDLA_dibujarImagenOculta(enemigo1, xEnemigo1, yEnemigo1);

y ahora dibujaremos varios, que además pueden ser de distintos tipos, y estar activos ("vivos") o no ("muertos"):

        for (i=0; i<NUMENEMIGOS; i++)
        {
          if (enemigos[i].activo)
          {
            if (enemigos[i].tipo == TIPOENEMIGOPEPINO)
              enemigo = enemigoPepino;
            else
              enemigo = enemigoNariz;
            SDLA_dibujarImagenOculta(enemigo, enemigos[i].x,enemigos[i].y);
          }
        }

Y tras cada fotograma deberemos mover los enemigos, cada uno de ellos con su propia posición y velocidad (incremento de posición). Antes era así

        // Movimiento de enemigo (de momento: lado a lado)
        xEnemigo1 += incrEnemigo;

        if (xEnemigo1 < xIniPantalla) {
          xEnemigo1 = xIniPantalla;
          incrEnemigo = -incrEnemigo;
        }
        if (xEnemigo1 > xFinPantalla-anchoEnemigo1) {
          xEnemigo1 = xFinPantalla-anchoEnemigo1;
          incrEnemigo = -incrEnemigo;
        }

Y ahora será parecido, pero repetitivo y accediendo a los campos de cada "struct", así:

        // Movimiento de enemigos (de momento: lado a lado)
        for (i=0; i<NUMENEMIGOS; i++)
        {
            enemigos[i].x  += enemigos[i].incrX;

            if (enemigos[i].x < xIniPantalla) {
              enemigos[i].x = xIniPantalla;
              enemigos[i].incrX = -enemigos[i].incrX;
            }
            if (enemigos[i].x > xFinPantalla-enemigos[i].ancho) {
              enemigos[i].x = xFinPantalla-enemigos[i].ancho;
              enemigos[i].incrX = -enemigos[i].incrX;
            }
        }

Como siempre, el resto del proyecto está en: code.google.com/p/fruityfrank

(Volver al índice)