viernes, julio 18, 2008

El juego del gato, 4 (flash game)

Lista con los nombres de los objetos que pueden caer:
var ap:Array = ["", "crok1", "bolsa1", "bull1", "crok2", "bolsa2", 
"cocker1", "crok3", "pastor1", "crok4", "bull1-2", "crok5", "pastor1-2"];


Estos objetos son los nombres de las figuras que están en la biblioteca (library), con la opción "Export for ActionScript". "crok1" a "crok5" son las croquetas (comida), 2 bolsas de croquetas y los demás son los perros.


Lista de las 7 posiciones:
var al1:Array = [0, 0, 0, 0, 0, 0, 0];


Al inicio todas las posiciones están vacías (tienen un "cero"). Cuando se ocupen, contendrán un "1". Usé también una lista donde están las coordenadas de cada posición (pixeles en el eje "x"):

var al2:Array = [85, 190, 295, 400, 505, 615, 715];



Para la rutina de los "volados", comenté con León el asunto y me dijo: "Acá tengo un libro de Director que tiene una rutina para eso". Y aunque estaba en "Lingo" la rutina, era muy fácil de entender, y más sencilla de lo que pensé. Después de prueba y error llegué a los números que usé finalmente:

// esto va al principio del código
var vel:Number = 30;

// dentro de la rutina juego va esto, 
// después de decrementar el cronómetro
// rutina para crear otro objeto que cae
if (randRange(1, home.vel) == 5) {
  crea_ll(); // aquí creo otro objeto
}


Genero un número aleatorio entre 1 y 30, y si ese número es "5", dejo caer otro objeto. Esta rutina se encuentra dentro de la rutina "juego", justo al terminar de decrementar el cronómetro.

La rutina "crea_ll" será la encargada de dejar caer otro objeto.

So far, so good.

La rutina que deja caer otro objeto debe buscar una posición vacía, y si la hay, seleccionar un objeto al azar de la lista de objetos.

Mi primer intento "rastreaba" la lista de posiciones vacías de "izquierda a derecha", pero después decidí variar un poco. Aquí echo otro volado para decidir si busco de izquierda a derecha o de derecha a izquierda.

// esto va al principio del código
var llenos:Number = 0;
var nper:Number = 0;

// esta función NO va dentro de la rutina "juego"
function crea_ll() {
// obtengo nueva coordenada para lluvia de objetos
pn = 7;
if (randRange(0, 1) == 1) {
// de izquierda a derecha
  for (jcl=0; jcl<7; jcl++) {
    pn = jcl;
    if (home.al1[pn] == 0) {
      break;
    }
  }
} else {
// de derecha a izquierda
  for (jcl=6; jcl>=0; jcl--) {
    pn = jcl;
    if (home.al1[pn] == 0) {
      break;
    }
  }
}
// una ves obtenido un lugar vacío, selecciono un objeto al azar 
// y lo dibujo en la coordenada "x" de ese lugar vacío
if (pn<=6) {
  s = personaje(); // aquí selecciono un objeto 
  // de la lista de objetos que caen
  home.al1[pn] = home.nper;
  home.llenos++;
  if (home.llenos>6) {
    home.llenos = 6;
  }
  px = home.al2[pn];
  home.attachMovie(s,"mc"+pn+"_mc",100+pn);
  home["mc"+pn+"_mc"]._x = px-(home["mc"+pn+"_mc"]._width/2);
  home["mc"+pn+"_mc"]._y = home.ytop;
  home.nmc++;
  } else {
    // todas las posiciones llenas, no creo personaje nuevo
  }
}

// esta función NO va dentro de la rutina "juego"
// selecciono un objeto al azar
function personaje():String {
  i = randRange(1, 12);
  home.nper = i;
  return home.ap[i];
}


OK, una ves dibujado el objeto, en un lugar disponible, hay que comenzar a "bajarlo", aumentando su coordenada "y" cada determinado tiempo. Y al llegar al fondo, borrar el objeto. Checar si al llegar abajo le "pega" al gato. Si el objeto es una croqueta, aumentar 1 punto al score. Si el objeto es una bolsa de comida, aumentar 5 puntos. Si es un perro, restar puntos: cocker 3 puntos, bull 4 puntos, pastor alemán 5 puntos.

Pero una cosa a la vez: bajar el objeto y desaparecerlo al llegar al fondo. Justo debajo de la rutina para crear otro objeto que cae.

// esto va al principio del código
var vel2:Number = 3;

// dentro de la rutina juego va esto
// justo debajo de la rutina que crea otro objeto que cae
for (j=0; j<7; j++) { // checo cada una de las 7 posiciones
  if (home.al1[j] != 0) {  // si esta llena la posición...
    with (home["mc"+j+"_mc"]) {
      _y += home.vel2; //... bajo el objeto
      // aqui desaparezco el objeto si llega al fondo
      if (_y>=home.ymax) {
        removeMovieClip(home["mc"+j+"_mc"]);
        home.al1[j] = 0;  // libero la posición
        home.llenos--; // cantidad de posiciones llenas
        if (home.llenos<0) {
          home.llenos = 0;
        }
      }
    }
  }
}


UF!!!!!

A probar a ver si funciona todo este choro mareador...

No hay comentarios.: