25 noviembre 2008

Remake (parcial) de Fruity Frank... 18 - Distintos niveles de juego

El siguiente paso es tener distintos niveles ("pantallas") en nuestro juego, de modo que cuando recojamos todos los "premios" del primer nivel, pasemos a un segundo nivel, y después a un tercero, y así sucesivamente.

En principio, la idea es sencilla: en vez de un único array para representar el mapa de un nivel, tendremos varios arrays, uno para cada para mapa (en realidad, sería una solución más razonable tener un array multidimensional, pero no lo haremos así por ahora):

  string[] mapa1 = {
"XCXXMXXX XMCXXX",
"MXXCXXXX XMXCMM",
"XMCXXXXX XCXXXC",
"XXCXCXCX XXXXCX",
" ",
"XXMCXMXX XCXXXX",
"XXXXXXXX XXXMXX",
"XXXXXCXX XXXXXX",
"XXXXXCXX XXXCXX",
"XXXXXXXX CXCXXC"
};

string[] mapa2 = {
"YCYYMY YYYMCYYY",
"MYYCYY YYYMYCMM",
"YMCYYY YYYCPYYC",
"YYCYCY CYYYYYCY",
" ",
"YYMCYM YYYCYYYY",
"YYYYYY YYYYYMYY",
"YYYPYC YYYYYYYY",
"YYPYYC YYYYYCYY",
"YYYYYY YYCYCYYC"
};

string[] mapa3 = {
"ZCZZMZZZ ZPCZZM",
"MZZCZZPZ ZMZCMM",
"ZMCZZZZZ ZCPZZC",
" ",
"ZZCZCZCZ ZZZZCZ",
"ZZMCZMZZ ZCZZZZ",
"ZZZZZZZZ ZZZMZZ",
"ZZZPZCMZ ZZZZZZ",
"ZZPZZCZZ ZZMCZZ",
"ZZZZZZZZ CZCZZC"
};


Tendremos un cuarto mapa, vacío, que representará en cada momento al nivel actual. Antes de empezar cada nivel, volcaremos el mapa de ese nivel en el mapa "en uso". Lo podemos declarar con:

  string[] mapa = new string[MAXFILAS];


Y podemos volcar los datos en él así:

  for (i=0; i<MAXFILAS; i++)
mapa[i] = mapa1[i];


Para saber cuándo pasar de un nivel a otro, podemos contar los "premios" que quedan por recoger. Si no quedan premios en el nivel actual, es el momento de pasar al siguiente nivel:

  // Si no quedan frutas, avanzo de nivel
if (numFrutas == 0)
siguienteNivel();


Y esa función "siguienteNivel" mostraría un aviso o una animación, cargaría el mapa del nuevo nivel en el mapa en uso, restauraría las posiciones iniciales de los enemigos y de nuestro personaje, etc.


En nuestro caso, tenemos varios posibles mapas de nivel, así que tendremos que asignar el que corresponda. Si fuera un array multidimensional, usaríamos como índice el número de nivel; como no es nuestro caso, tendremos que usar varios "if" encadenados. De hecho, crearemos sólo 3 niveles, pero haremos que se puedan jugar en más de 3 pantallas, haciendo que tras la tercera se vuelva a la primera, así:

  // Por ahora solo hay tres niveles, así que alterno:
if (nivel % 3 == 1)
for (i=0; i<MAXFILAS; i++)
mapa[i] = mapa1[i];
else if (nivel % 3 == 2)
for (i=0; i<MAXFILAS; i++)
mapa[i] = mapa2[i];
else for (i=0; i<MAXFILAS; i++)
mapa[i] = mapa3[i];



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