¿Quieres registrarte?

Deshabilitar todos los botones interiores de un MovieClip

Por: wawi
15 de Junio del 2009
253 de clabLevel
Otros artículos de wawi
1,967 visitas

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!

Enviar a twitter Enviar a facebook


También te interesa


Etiquetas actionscript_3

Comentarios | Enviar un comentario
Interesante solución, gracias por compartirla ;)
Por: Zguillez
Yo uso esto en el "root" :D

mouseChildren = false;
Por: Iván-blog
nice :D
Por: k4rkuxx
faltaria esto al codigo:

Código :

//Ingreso el valor booleano(que debe tener los botones) en el useHandCursor del boton
obj.useHandCursor = valorBoton;


debajo de el

Código :

obj.enabled = valorBoton;


si un admin lo ve si puede corrijalo ^^

esto sirbe porque si se desactiva el boton que esta abajo del cursor, que es el que preciono, el cursor de seleccion no se va, pero con el useHandCursor si

note que el tip esta en la categoria AS3, yo lo programe en AS2 no se si servira para as3

Byee Saludos!
Por: wawi
al que le interese, mejore el codigo:

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();

   //clips ya Analizados(muy importante para no repetir el mismo objeto y crear un bucle inifinito)

   //(esto sucede cuando utilizamos variables con referencia a objetos de clip)

   var clipsAnalizados:Array = new Array();

   //Agruego el clip recibido a la lista de arrays 

   clipsAnalizar.push(clip);

   //determina si se detecto el final de la busqueda

   finalDetectado = false;

   

   //mientras que no se encuentre el final de la busqueda 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();

         

         //Indico inicialmente que el clip a analizar ya se analizo por si me vuelvo a encontrar con el

         //en esta busqueda y lo agruego otra vez

         clipsAnalizados.push(clipAnalizar);

         

         //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;

                  //Ingreso el valor booleano(que debe tener los botones) en el useHandCursor del boton

                  obj.useHandCursor = valorBoton;

               }

            }

            

            //Si el elemento es un MovieClip(Si el elemento fue instanciado de la clase Button) procedo

            if(obj instanceof MovieClip)

            {

               //recorro los clips analizados

               for(var i = 0; i < clipsAnalizados.length; i++)

               {

                  //si el objeto ya se encuentra analizado no lo agruego a la lista

                  if(clipsAnalizados[i] == obj)

                  {

                     break;

                  }

                  //Si compruebo que el clip no fue analizado procedo

                  if(i + 1 == clipsAnalizados.length)

                  {

                     //si el clip resivido es diferente a root y el clip analizando tambien es diferente procedo

                     if(clip != _root && obj != _root)

                     {

                        //agruego el clip al final de la lista de clips a analizar

                        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;

      }

   }

}



//para invocarla, por ejemplo sería:

//establecerEstado(clip_cartelera, false, false);



el codigo evita los bucles infinitos que seproducen cuando quedan varaibles de _root colgadas

byee Saludos!
Por: wawi
Hola gente!
Tengo unos botones con la siguiente ruta: _root.fondo.stripe_inf.stripe_doble.stripe.instanciaboton y me gustaría que al presionar uno de estos botones, se desactiven todos los botones que hay dentro de _root.fondo.stripe_inf
¿cómo tendría que aplicar este AS? en el frame principal de la movie y en el boton? q AS tengo que poner en cada cual?

muchas gracias por vuestra ayuda
Por: euflipo
hola eufilpio, mira primero copia la funcion establecerEstado en la primera linea de tiempo de tu proyecto, y luego desde donde quieras la llamas con _root.establecerEstado, para tu caso la funcion seria:

Código :

tuboton.onRelease = function()
{
    _root.establecerEstado(_root.fondo.stripe_inf , false, false);
}


para volverlo a habilitar todo pones los dos flase en true, recuerda que con esta funcion no se te ban a deshabilitar los elementos que tengas solo en _root.fondo.stripe_inf, sino los que tienes en este y si hay clips en el mismo los botones que hay dentro de ellos y asi el codigo va recorriedo toda las ramas.

espero haberte ayudado

byee Saludos!
Por: wawi
Hola wawi!
Muchísimas gracias por tu rápida ayuda :)
Ya lo había probado asi, pero no me funcionaba, el problema estaba en que dentro de un clip tenía otro clip copiado 2 veces y en las dos copias tenía puesta la instancia.... Lo que hice, fue dejar una copia sin instancia y asi funciona a la perfección!!

Mil graciasss ;)
Por: euflipo
Deja un comentario
IMPORTANTE

Recuerda ser respetuoso, no insultes a otras personas, ni uses palabrotas, hay una persona al otro lado de la pantalla.

Habla bien, NO ESCRIBAS EN MAYUSCULA TODO, no escribas como en un SMS, evita cosas como "ke", "x q" y demás abreviaciones.

Aquí funcionan las etiquetas de los foros, puedes usar [b] para negrita, [img] para las imágenes, [url] para los enlaces, etc.

Si tienes preguntas técnicas, envíalas mejor al foro.