Comunidad de diseño web y desarrollo en internet online

Deshabilitar todos los botones interiores de un MovieClip

A la hora de programar siempre tenemos clips que es están dentro de otros clips y estos tienen a su vez más clips. El problema comienza en la presencia de botones cuando tenemos que deshabilitar todo. La mayoría en un principio intenta haciendo un mc.enabled = false; pero se da cuenta de que solo deshabilita los eventos de ese clip. Para solucionarlo unos empiezan a hacer funciones que van des/habilitando conjuntos de botones y en un proyecto grande termina escribiendo unas 500 líneas de código (otros optan por opciones más desesperadas como poner botones con alpha 0 encima de todos esos conjuntos).

Bueno pude encontrar una solución con solo 1 línea de código. Muchos se deben querer tirar por la ventana como yo por bueno mejor tarde que nunca es el dicho.

Solo se necesita el siguiente método:

Código :

//metodo que des/habilita un clip definitivamente
//   clip: clip a des/hablitar
//   valorBoton: valor booleano que tendran los botones dentro del clip
//   valorClip: valor booleano que tendran los clips dentro del clip
establecerEstado = function( clip, valorBoton, valorClip )
{
   //clips a Analizar
   var clipsAnalizar:Array = new Array();
   //Agruego el clip recibido a la lista de arrays 
   clipsAnalizar.push( clip );
   //determina si se detecto el final de la búsqueda
   finalDetectado = false;
   //mientras que no se encuentre el final de la búsqueda procedo
   while ( finalDetectado == false )
   {
      //si tengo clips a analizar procedo
      if ( clipsAnalizar.length != 0 )
      {
         //extraigo(eliminandolo de la lita) el primer valor de la lista
         var clipAnalizar = clipsAnalizar.shift();
         //Recoro los elementos del clip analizando
         //nota: la variable objeto no me devuelve un objeto, si no el nombre del objeto
         //      es por eso que mas adelante lo extraigo y no hago algo de mas
         for ( objeto in clipAnalizar )
         {
            //extraigo del clip analizando el objeto analizando
            var obj = clipAnalizar[ objeto ];
            //Si el elemento es un boton(Si el elemento fue instanciado de la clase Button) procedo
            if ( obj instanceof Button )
            {
               //Si tengo los valores recibidos para el boton procedo
               if ( valorBoton != null )
               {
                  //Ingreso el valor booleano(que deben tener los botones) en el enabled del boton
                  obj.enabled = valorBoton;
               }
            }
            //Si el elemento es un MovieClip(Si el elemento fue instanciado de la clase Button) procedo
            if ( obj instanceof MovieClip )
            {
               //Agruego el clip a la lista de clips al final de la lista
               clipsAnalizar.push( obj );
               //Si tengo los valores recibidos para el clip procedo
               if ( valorClip != null )
               {
                  //Ingreso el valor booleano(que deben tener los clips) en el enabled del clip
                  obj.enabled = valorClip;
               }
            }
         }
      }
      //Si no me quedan mas clips por analizar procedo
      else
      {
         //Indico que termino la busqueda
         finalDetectado = true;
      }
   }
}


Y luego cada vez que quieran des/habilitar un clip solo tienen que llamarlo de la siguiente forma:

Código :

establecerEstado(mc, false, false);

mc no es el nombre de instancia de un clip sino el clip en si, por eso es que va sin comillas

También se puede des/habilitar los eventos de los clips que tenga ese clip. Soporta el ingreso null, por ejemplo si queremos solo des/habilitar los botones y no los clips:

Código :

establecerEstado(mc, false, null);

Estoy seguro que en la mayoría de los casos lo van a dejar los dos en false. Pero por las dudas se lo implemente.

No sé si hay otra forma más fácil de hacerlo, como todos empecé buscando y no encontré nada así que decidí rebuscármelas.

Byee Saludos!

¿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

El autor de este artículo ha cerrado los comentarios. Si tienes preguntas o comentarios, puedes hacerlos en el foro

Entra al foro y participa en la discusión

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