Comunidad de diseño web y desarrollo en internet online

me presento y ya de paso pues pido un manazo

Citar            
MensajeEscrito el 05 May 2009 11:00 pm
hola que tal buenas tardes como estan, soy skauci y como pueden ver soy nuevo por aca asi que me presento, soy nuevo no solo en el foro si no tambien en as3 (actionScript 3) yo ya venia haciendo las cosas en as2 pero ahora hay que renovar.

primero pido paciencia si es que esto no va en este apartado del foro pero como ya dije soy novato.

quiero pedirles echen un ojo a este codigo y me digan en que estoy fallando por favor.
tratare de ser lo mas descriptivo posible, descripcion:
tengo un boton creado en la biblioteca el cual vincule con nombre de clase menuBtn y de clase base le puse una que formé para que haga el roll over y el roll out y esa clase extiende de movieClip. (hasta aqui no hay ningun problema).
Luego con codigo coloco ese boton en la biblioteca, le pongo etiqueta de un xml, lo duplico, le doy un event listener para que reaccione al click y lo coloco dentro de un contenedor tipo sprite llamado menuBtns el cual tambien creo con codigo y coloco en el escenario hasta ahi todo va bien (bueno al menos eso creo), el problema viene en esto:
mi objetivo es que cuando uno de los botones sea presionado quiero que se desactive pero active los otros dos si esque estaban desactivados, es decir cuando yo oprimo el boton 1 ese se desactiva pero boton 2 y boton 3 siguen funcionando entonces cuando yo oprimo boton 2 se desactiva pero activa el boton 1 y el 3 pues sigue estando activado, ese es mi problema intente con mouseEnabled pero solo funciona con el target osea el que dispara el evento. pongo el codigo a continuacion:

Código :

//carga del xml de los botones

var loader:URLLoader = new URLLoader();
loader.addEventListener(Event.COMPLETE, xmlComplete);
loader.load(new URLRequest("xmls/menu.xml"));

function xmlComplete(event:Event):void
{
   var myXML:XML = new XML(event.target.data);
   
// creo el sprite que contendra los botones

        var menuBtns:Sprite = new Sprite();
   menuBtns.x = 259;
   menuBtns.y = 166;
   addChild(menuBtns);
   
// creo los botones

   for (var i:int = 0; i < myXML.boton.length(); i++)
   {
      var btn:menubtn = new menubtn();
      btn.titulo.textoBtn.text = myXML.boton[i].@texto;
      btn.titulo.textoBtn.autoSize = TextFieldAutoSize.LEFT;
      var posicionInicial:Number = (btn.width * i);
      if(i==0){
         btn.x = posicionInicial;
         var posicionPrimerBoton:Number = (btn.x + btn.width) + 10;
      }else{
         btn.x = posicionPrimerBoton;
         posicionPrimerBoton = (btn.x + btn.width) + 10; 
      }
      btn.ruta = myXML.boton[i].@seccion;
      btn.addEventListener(MouseEvent.CLICK, onClick);
      menuBtns.addChild(btn);

// esto lo puse segun para poner el nombre de instancia de cada boton asi lo hacia en as2 pero creo que no funcionó

      btn.name  = "btn" + i;
      }
// esta es la funcion que se manda llamar cuando se hace click sobre alguno de los botones
      
   function onClick(event:MouseEvent): void
   {
      var btnNombres:Array = new Array("btn0","btn1","btn2");
      for(var i:Number = 0; i < btnNombres.length; i++)
      {   

// aqui intento hacer lo de activar y desactivar 

         if(event.target.name != btnNombres[i])
         {

// ese trace lo puse para ver que si los activa o no y la logica funciona bien pero al momento de aplicarla ......

            trace(menuBtns.getChildByName(btnNombres[i]).name + " esta activado");

// a qui es precisamente donde creo que esta el error pero no se como resolverlo 

            menuBtns[btnNombres[i]].mouseEnabled = true;
            
         }
         else
         {
            event.target.mouseEnabled = false;
         }
      }
      
   }
   
}



bueno de entrada no me marca ningun error de sintaxis al correrlo y lo corre bien pero cuando presiono algun boton me devuelve de error esto:

btn1 esta activado
ReferenceError: Error #1069: No se encontró la propiedad btn1 en flash.display.Sprite y no hay ningún valor predeterminado.
at MethodInfo-4()

nota: lo de btn1 esta activado no hagan caso eso es del trace que meti.

de antemano agradesco a los que le hechen un ojo y me puedan ayudar, como lo dije antes soy nuevo en as3 asi que agrdeceria si no usan un lenguaje tan tecnico ni clases ya que esto lo tengo en la linea principal de tiempo y aun no se manejar bien las clases aun sigo intentando aprender y no quiero darme por vencido.

muchas gracias

Por skauci

2 de clabLevel



 

firefox
Citar            
MensajeEscrito el 06 May 2009 10:15 am
Lo tienes en el trace:

menuBtns.getChildByName(btnNombres[i]).mouseEnabled = true

Si te da error que no encuentra el método, haz un cast a lo que sea, por ejemplo

menubtn(menuBtns.getChildByName(btnNombres[i])).mouseEnabled = true

¿No sería enabled en vez de mouseEnabled?

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 06 May 2009 02:35 pm
jorge muchisimas gracias tu concejo (menubtn(menuBtns.getChildByName(btnNombres[i])).mouseEnabled = true) me funciono de maravilla, de nuevo muchisimas gracias man te debo una.

oye man aprovechandome de tu generosisdad, seria mucho pedirte si me explicaras que fue lo que hiciste? osea esto menubtn(menuBtns.getChildByName(btnNombres[i])).mouseEnabled = true ..... que significa hacer cast?, y que significa esa instruccion que funciono de maravilla, si me lo puedes explicar con detalle te lo agradecere eternamente man por que estoy aprendiendo.

de nuevo muchas muchas gracias :D

Por skauci

2 de clabLevel



 

firefox
Citar            
MensajeEscrito el 06 May 2009 02:52 pm
Hacer un cast es indicarle al compilador de que tipo es un objeto (si el compilador no conoce de que tipo es, desconoce métodos invocados en el objeto)
mouseEnabled le indica que sea sensible o no al Mouse

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 06 May 2009 07:49 pm
hoooo y como se indica el cast? oye perdon por darte tanta lata man pero esque en serio si ando sacado de onda con esto del as3 y no quiero quedarme con dudas.

lo del mouseEnabled si lo tenia entendido mas bien yo me referia a esto:

menubtn(menuBtns.getChildByName(btnNombres[i]))

lo que esta en negritas, osea que significa encerrar lo de menuBtns.........................btnNombres[i] osea que pasa cuando metes el sprite y su contenido dentro de menubtn(.....)

mmm no se si me explico man eso fue la solucion a mi problema que me pase horas y horas investigando sin encontrar nada hasta que tu me hisiste el grandisimo favor de resolver y quiero entender bien bien que paso.

otra ves muchas muchas pero muchisimas gracias man y perdoname por estarte molestando a cada rato :lol:

Por skauci

2 de clabLevel



 

firefox
Citar            
MensajeEscrito el 07 May 2009 11:25 am
Skauci, cuando hacemos getchildByName, el compilador entiende que lo que devuelves es un "DisplayObject"
Vamos, Si te fijas en la ayuda de la función verás que pone

public function getChildByName(name:String):DisplayObject

Así que el compilador sólo sabe que es un displayObject. Eso hace que sólo podamos usar los métodos y propiedades de un displayObject (x, y, height, rotation,name, stage,....) pero NINGUNA más
La "propiedad" mouseEnabled es una propiedad de los InteractiveObject (que es una clase que extiende de la Clase DisplayObject y que, además de todas las propiedades y métodos de los DisplayObjects, tiene las propiedades "contextMenu,dobleClickEnabled,focusRect,mouseEnabled, tabenabled y tabIndex) Así que de algún modo le tenemos que decir al compilador que "nuestro DisplayObject es algo más que un displayObject".
Eso es la conversión de cast. Vamos, debemos escribir

Código ActionScript :

InteractiveObject(menuBtns.getChildByName(btnNombres[i])).mouseEnabled=true
//en dos pasos
var io:InteractiveObject=InteractiveObject(menuBtns.getChildByName(btnNombres[i]));
io.mouseEnabled=true
//ó en dos pasos con "as"
var io:InteractiveObject=  menuBtns.getChildByName(btnNombres[i]) as InteractiveObject;
io.mouseEnabled=true;

Vale, la conversión de cast la podemos hacer con respecto a cualquier clase que extienda de DisplayObject o de InterActiveObject -tú lo has hecho respecto a tu clase menubtn-

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 07 May 2009 04:22 pm
hoooo muchisimas gracias Eliseo 2 perfectamente bien explicado y ahora si todo me quedo claro es cosa de las famosas erencias de clases del as3 ahora todo esta claro como el agua man muchas gracias a los dos por aclarar mis dudas que les aseguro no seran las unicas que tenga asi que apuesten que mas adelante les estaré preguntando mas cosas.
pero por el momento es todo, muchas pero muchas gracias.

tema resuelto ya lo pueden cerrar.

gracias !!!

Por skauci

2 de clabLevel



 

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.