¿Qué hará esta versión?

Veamos una forma de conseguirlo...

Permitir una cantidad distinta de enemigos en cada nivel

La idea no es difícil: en vez de que haya un único enemigo declarado en la clase Partida, cada Nivel contendrá un array de enemigos. La partida lo que hará es recorrer esos enemigos, preguntando al nivel actual (o a la clase Mapa, que es la que lo oculta). Por ejemplo, se podrían mostrar en pantalla los enemigos así:

for (int i = 0; i < miPantallaJuego.GetNumEnemigos(); i++)
    miPantallaJuego.GetEnemigo(i).DibujarOculta();
 
 

El mapa necesitaria una función que devolviera la cantidad de enemigos y otra que devolviera uno de ellos. Ambas funciones realmente se apoyarían en la clase Nivel:

public int GetNumEnemigos()
{
    return nivelActual.GetNumEnemigos();
}
 
public Enemigo GetEnemigo(int i)
{
    return nivelActual.GetEnemigo(i);
}
 
 

La clase Nivel prepararía un array, que se "rellenará" desde cada nivel concreto:

 
protected int numEnemigos;
protected Enemigo[] listaEnemigos;
...
 
public int GetNumEnemigos()
{
   return numEnemigos;
}
 
public Enemigo GetEnemigo(int i)
{
   if (numEnemigos > i)
       return listaEnemigos[i];
 
   return null;
}
 
 

Por ejemplo, para el nivel 1, se podría hacer algo como:

numEnemigos = 2;
listaEnemigos = new Enemigo[numEnemigos];
 
listaEnemigos[0] = new Enemigo(miPartida);
listaEnemigos[0].MoverA(400, 352);
listaEnemigos[0].SetVelocidad(4, 0);
listaEnemigos[0].SetAnchoAlto(36, 48);
listaEnemigos[0].CambiarDireccion(ElemGrafico.DERECHA);
 
listaEnemigos[1] = new Enemigo(miPartida);
listaEnemigos[1].MoverA(200, 150);
listaEnemigos[1].SetVelocidad(-4, 0);
listaEnemigos[1].SetAnchoAlto(36, 48);
listaEnemigos[1].CambiarDireccion(ElemGrafico.IZQUIERDA);
 

(En el juego original sólo había un enemigo en el primer nivel, pero así podemos probar las novedades con facilidad; ya buscaremos más adelante la fidelidad al juego original)

Hay que hacer algún otro cambio pequeño, como que la clase Enemigo no prefije las coordenadas X e Y, para que podamos tener distintos enemigos en distintas posiciones. Puedes consultar los fuentes completos para ver todos los detalles.

Que cada enemigo pueda tener movimiento lineal, distinto de los demás

Tampoco es difícil: desde hace varias entregas, el método "Mover" de la clase Enemigo ya lo movía de forma horizontal entre dos coordenadas prefijadas...

public new void Mover() 
{
    x += incrX;
    SiguienteFotograma();
 
    if ((x < 100) || (x > 700))
    {
        incrX = (short)(-incrX);
        if (incrX < 0)
            CambiarDireccion(IZQUIERDA);
        else
            CambiarDireccion(DERECHA);
    }
}
 
 

Ahora podríamos hacer eso mismo, tanto en vertical como en horizontal, y entre dos valores minX y maxX, minY y maxY, que se puedan modificar:

public new void Mover() 
{
    if (incrX != 0)
    {
        x += incrX;
        SiguienteFotograma();
 
        if ((x < minX) || (x > maxX))
        {
            incrX = (short)(-incrX);
            if (incrX < 0)
                CambiarDireccion(IZQUIERDA);
            else
                CambiarDireccion(DERECHA);
        }
    }
    if (incrY != 0)
    {
        y += incrY;
        SiguienteFotograma();
 
        if ((y < minY) || (y > maxY))
        {
            incrY = (short)(-incrY);
            if (incrY < 0)
                CambiarDireccion(ARRIBA);
            else
                CambiarDireccion(ABAJO);
        }
    }
}
 
 
 

De modo que esos minX, maxX, minY, maxY los poríamos definir en la clase ElemGrafico, junto con algún metodo Set, que permitiera darles valor, y así cuando creamos un nivel haríamos algo como:

numEnemigos = 2;
listaEnemigos = new Enemigo[numEnemigos];
 
listaEnemigos[0] = new Enemigo(miPartida);
listaEnemigos[0].MoverA(400, 352);
listaEnemigos[0].SetVelocidad(4, 0);
listaEnemigos[0].setMinMaxX(100, 700);
[...]
 
listaEnemigos[1] = new Enemigo(miPartida);
listaEnemigos[1].MoverA(200, 150);
listaEnemigos[1].SetVelocidad(0, 4);
listaEnemigos[1].setMinMaxY(100, 300);
[...]
 
 

En este caso, el primer enemigo se movería en horizontal entre las coordenadas 100 y 700, y el segundo en vertical entre la 100 y la 300.


Como es habitual, la versión 0.14 completa está en la página del proyecto en Google Code.

Siguiente entrega...