01 noviembre 2008

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

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