Comunidad de diseño web y desarrollo en internet

Aparecer elementos de una grilla hasta completarla con AS3

Este código sirve para hacer aparecer elementos de una grilla al azar hasta completarla. Cuando me ví con este problema intenté hacerlo primero con un array normal pero, al buscar un método que me permitiera eliminar un elemento cualquiera (no sólo el último, con pop()) y al mismo tiempo actualizar los índices de los otros elementos, no lo encontré (será que no busqué bien :S).

Entonces me dí cuenta que la display list hacía todo este trabajo por mí y puse manos a la obra.

Lo que hace la función básicamente es escoger un child al azar de una display list y lo elimina, actualizando de esta manera el rango en que trabajará la función random. Al mismo tiempo, añade estos elementos en otro container.

En el código tienen comentarios que aclaran todo.

Espero les sirva, saludos.

Código :

//estos son los movieclips que usaremos como contenedores
var container1:MovieClip=new MovieClip();
addChild(container1);
var container2:MovieClip=new MovieClip(); 
addChild(container2);

//colocamos los cuadrados en una grilla, puede ser de tantas filas y columnas como deseen.
//al mismo tiempo, los colocamos dentro de container1.
for(var i:uint=0;i<6;i++)
{
   for(var u:uint=0;u<6;u++)
   {
      var b:box=new box();
      b.x=(b.width+10)*u;
      b.y=(b.height+10)*i;
      b.visible=false;
      container1.addChild(b);
   }
}

//esta es la función que hace todo funcionar. Le pasamos como parámetro los dos clips y la
//duración del efecto.
function appear(clip1:MovieClip,clip2:MovieClip,duration:Number):void
{
   var total:Number=clip1.numChildren;
   //este es la duracion entre cada apricion individual, simplemente dividimos la duracion
   //total entre el num de children del clip1
   var apptime:Number=duration*1000/total;
   //llamamos un timer con los datos que hemos obtenido
   var timer:Timer=new Timer(apptime,total);
   timer.addEventListener(TimerEvent.TIMER,onTimer);
   timer.start();
   //esta funcion es llamada periodicamente por el timer, tantas veces como cuadritos hayan
   //en la grilla
   function onTimer(evt:TimerEvent):void
   {
      //obtenemos un indice al azar del clip1, actualizandose en cada pasada de acuerdo al 
      //numChildren
      var index:uint=Math.floor((Math.random())*clip1.numChildren);
      //almacenamos ese child en una var temporal
      var tmp:DisplayObject=clip1.getChildAt(index);
      //borramos ese child del clip1, asi su display list se actualiza y su propiedad
      //numChildren tambien, a cada pasada tiene uno menos
      clip1.removeChildAt(index);
      //añadimos el child elegido al clip2 y lo hacemos visible
      clip2.addChild(tmp);
      tmp.visible=true;
   }
}
//llamamos la funcion
appear(container1,container2,2)

¿Sabes SQL? ¿No-SQL? Aprende MySQL, PostgreSQL, MongoDB, Redis y más con el Curso Profesional de Bases de Datos que empieza el martes, en vivo.

Publica tu comentario

o puedes...

¿Estás registrado en Cristalab y quieres
publicar tu URL y avatar?

¿No estás registrado aún pero quieres hacerlo antes de publicar tu comentario?

Registrate