Tengo un problema que me está volviendo loco. He buscado más de 8 horas alguna solución y después de probar infinidad de ellas me he dado por vencido, no digo que la solución no esté publicada, pues es obvio que lo estará, pero con el cansancio que llevo encima no he conseguido llegar a buen puerto y ya me he desesperado.
Estoy creando una clase en AS2, que se encarga de leer un XML y después monta botones sobre un MovieClip y estos botones se encargarán de mover diferentes anuncios.
Bueno, he conseguido crear los botones, leer el XML y cargar los datos, pero ahora estoy intentando crear el rollOver ó MouseOver ó como diablos haya que llamarlo de los botones y no lo consigo.
El código es este:
Código ActionScript :
import mx.utils.Delegate; class Anuncios { // VARIABLES GENERALES private static var ancho:Number = Stage.width; private static var alto:Number = Stage.height; private var contenedor:MovieClip; private var boton:MovieClip; private var anuncios:MovieClip; private var pie:MovieClip; var archivo:XML; // VARIABLES DEL XML private var categoria:String; private var nombre:String; private var fabricante:String; private var url:String; private var mejoresVentas:Boolean; private var productoNuevo:Boolean; // VARIABLES COLORES private static var blanco:Number = 0xFFFFFF; private static var negro:Number = 0x000000; private static var claroTexto:Number = 0xAAD1E8; private static var azulOscuro:Number = 0x346C96; private static var azulClaro:Number = 0x2197D3; // CONSTRUCTOR DE LA CLASE public function Anuncios (nombre:String, padre:MovieClip, archivoXML:String) { anuncios = padre.createEmptyMovieClip("anuncios", 1); contenedor = padre.createEmptyMovieClip (nombre, 2); pie = contenedor.createEmptyMovieClip("pie", -1); reposicionar(contenedor, 0, 0); reposicionar(pie, 0, (alto-50)); rellenar(contenedor, ancho, alto, blanco, 0); rellenar(pie, ancho, 50, azulOscuro, 100); cargarXML(archivoXML); } //--funcion public function cargarXML (archivoXML:String) :Void { archivo = new XML(); archivo.ignoreWhite = true; archivo.onLoad = Delegate.create(this, crearBotones); archivo.load(archivoXML); } //--funcion public function crearBotones() { // CREO LAS VARIABLES NECESARIAS var suma:Number; var banner:MovieClip; var ruta:XMLNode = new XMLNode(); ruta = archivo.firstChild; // CREO EL BUCLE DE MONTAJE for (var i:Number = 0; i < ruta.childNodes.length; i++){ if (suma > (ancho-100)) { trace("sobrepasado"); return; } var capa:Number = 0; var nombre_btn:String = "boton" + i; var nombre_ban:String = "banner" + i; // INSTANCIO LOS OBJETOS boton = contenedor.createEmptyMovieClip(nombre_btn, i); banner = anuncios.createEmptyMovieClip (nombre_ban, i); // CREO LAS CAJAS DE TEXTO boton.createTextField ("categoria_txt", capa, 10, 2, 0, 0); capa++; boton.createTextField ("fabricante_txt", capa, 10, 15, 0, 0); capa++; boton.createTextField("nombre_txt", capa, 10, 28, 0, 0); // CREO LOS TEXTOS boton.categoria_txt.text = ruta.childNodes[i].attributes.cat; boton.fabricante_txt.text = ruta.childNodes[i].attributes.fab; boton.nombre_txt.text = ruta.childNodes[i].attributes.nom; // APLICO FORMATOS formato(boton.categoria_txt, "Sommet", 11, claroTexto, 0); formato(boton.fabricante_txt, "Sommet", 11, claroTexto, 0); formato(boton.nombre_txt, "SommetB", 12, blanco, 0); var a:Number = boton.categoria_txt._width; var b:Number = boton.nombre_txt._width; var c:Number = boton.fabricante_txt._width; var max = Math.max(a, b, c); var anchoCaja:Number = (Math.round(max) + 20) - 1; if (i == 0) { boton._x = 0 suma = anchoCaja; } else { boton._x = suma; suma += anchoCaja; } boton._y = alto-50; rellenar(boton, anchoCaja, 50, azulOscuro, 100); boton.onRollOver = Delegate.create(boton, encima); } } private function encima () :Void { trace(this); } //--funcion private function reposicionar (objeto:MovieClip, x:Number, y:Number) :Void { objeto._x = x; objeto._y = y; } //--funcion private function rellenar (objeto:MovieClip, an:Number, al:Number, color:Number, transp:Number) :Void { objeto.beginFill(color, transp); objeto.moveTo (0, 0); objeto.lineTo(an, 0); objeto.lineTo(an, al); objeto.lineTo(0, al); objeto.endFill(); } //--funcion private function formato (objeto:TextField, fuente:String, tamano:Number, color:Number, kerning:Number) :Void { // VALORES DE LA CAJA DE TEXTO objeto.background = false; objeto.border = false; objeto.selectable = false; objeto.multiline = false; objeto.embedFonts = true; objeto.html = true; objeto.autoSize = "left"; objeto.antiAliasType = "advanced"; // FORMATO DEL TEXTO var formato:TextFormat = new TextFormat(); formato.font = fuente; formato.size = tamano; formato.color = color; formato.letterSpacing = kerning; objeto.setTextFormat(formato); } }
Y el problema lo tengo en este trozo como habréis observado:
Código ActionScript :
boton._y = alto-50; rellenar(boton, anchoCaja, 50, azulOscuro, 100); boton.onRollOver = Delegate.create(boton, encima); } } private function encima () :Void { trace(this); }
Si alguien fuera ta amable de explicarme cómo puedo hacer el evento MouseOver en los botones dinámicamente le estaría eternamente agradecido.
La clase delegate me valdría, el problema es que no puedo pasarle parámetros y es imperativo que los pase.
No sólo he probado con la clase delegate, también he probado con un listener, con un eventListener, con función rollOver, MouseOver y más maneras que ahora mismo no me acuerdo pues he hecho cientos de cambios sobre estos métodos y ahora mismo tengo el cerebro como una loncha de bacon bien frita.
Bueno,
Muchas gracias a todos,
Un saludo.