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;
}
}
}Código :
establecerEstado(mc, false, false);
Código :
establecerEstado(mc, false, null);
Código :
//Ingreso el valor booleano(que debe tener los botones) en el useHandCursor del boton obj.useHandCursor = valorBoton;
Código :
obj.enabled = valorBoton;
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);
Código :
tuboton.onRelease = function()
{
_root.establecerEstado(_root.fondo.stripe_inf , false, false);
}