Os voy a poner en antecedentes.
Estoy haciendo una aplicación en la que se podrán crear instancias de imágenes en la pantalla al pulsar un botón. Cada una de estas imágenes debe ser arrastrable, escalable y rotable.
Gracias a NESTORRENTE, pude hacer la función de escalado en un movieclip puesto a mano en la pantalla (funciona perfectamente, por cierto); lo de moverlo y rotarlo iba a dejarlo para más adelante. Ahora quería probar el escalado en un movieclip creado dinámicamente, pero como soy UN ZOTE DE CUIDADO, no lo consigo.
Os explico cómo creo que debía hacerse y si después de leer esto tenéis tiempo y ganas de explicarme cómo se hace de verdad, os lo agradeceré. Empezamos.
Cada movieclip debe llevar una imagen y unos "tiradores" de transformación similares a los que puede llevar un bitmap cuando lo importas en word. De esta forma, si hacemos "drag" sobre la imagen, el movieclip se desplaza, si hacemos "drag" sobre el tirador de abajo a la derecha, se escala y si hacemos "drag" sobre el superior central, gira.
En estos momentos lo único que me importa es conseguir hacer un movieclip que me carge la imagen especificada, que contenga los tiradores y que se escale. Una vez conseguido esto, creo que agregar lo demás será más de lo mismo.
El movieclip (al que llamaré elMc) creo que debe estar compuesto por la imagen en sí y otro movieclip que representa los tiradores de transformación. Por lo tanto, elMc tiene dentro de sí el loader de la imagen y el movieclip de transformación. Si llamamos a los tiradores de transformación "transform_mc" y el loader de la imagen "img_ldr", debería encontrarme con una serie de movieclips que, a su vez, contendrían instancias de estos últimos que os he comentado.
Para generar el "transform_mc" he dibujado un rectángulo del tamaño de la imagen mediante "graphics.lineTo" y los cuadritos de las esquinas están insertados de la biblioteca. En la biblioteca tengo dos símbolos:"tirador" y "tiradorN". Están vinculados a actionscript con estos nombres desde su panel de propiedades. Esto es porque sólo quiero que se escale desde la esquina inferior derecha, por lo que he creado unos tiradores negros pequeñitos (tiradorN) de 6X6 píxels y un cuadrito balnco más grande (tirador) que es el que hará las veces de "escalador" de 10X10 píxels.
Teniendo esto, dentro elMc, deberían estar img_ldr y transform_mc. Por lo tanto, y desde mi antigua visión de AS2, debería poder acceder a los elementos de esta forma:
elMc.transform_mc - para acceder al transform_mc de cada movieclip que tenga creado.
Obviamente, no funciona. Consigo crear el movieclip principal con su imagen y con sus tiradores, pero no consigo controlar cada parte y, por lo tanto, no consigo asignarles acciones de arrastrar o pulsar o lo que sea.
Os voy a poner el engendro de código que he perpetrado y, por favor, si podéis y tenéis tiempo y ganas, me ilumináis un poco.
Al pulsar el botón de crear mc, se llama a la función cargaIMG que llama a la función posicionaIMG, la cual finaliza la creación:
Código :
//con esta función cargo la imagen function cargaIMG () { var img:URLRequest = new URLRequest("imagenes/chamarra1.png"); root["img_ldr"] = new Loader(); this.img_ldr.contentLoaderInfo.addEventListener (Event.COMPLETE,posicionaIMG); this.img_ldr.load (img); }
como véis, he creado el img_ldr en root porque si no, desde la función "posicionaIMG" no podía cargarla en el movieclip contenedor. Sigo con la función "posicionaIMG":
Código :
function posicionaIMG (e:Event) { var elMc = new MovieClip(); //El moviuclip contenedor tendrá el nombre "elMc" //Lo que sigue es para saber el ancho y largo de la imagen cargada. Después, como tiene que llevar //el margen necesario para colocar el mc de transformación, le sumo 10 píxels. Después, coloco la //imagen cargada dentro de "elMc", en las coordenadas deseadas. var anchura = this.img_ldr.width + 10;//el margen de 10 es para dar 5 px por cada lado de la imagen var altura = this.img_ldr.height + 10; this.img_ldr.x = 5; this.img_ldr.y = 5; elMc.addChild (this.imgLDR); //creo un mc de transformación para poder ocultarlo y mostrarlo y manipularlo de forma independiente var transform_mc = new MovieClip(); //Hago el dibujo del marco en función de las medidas de anchura y altura que he calculado en el paso anterior transform_mc.graphics.lineStyle (0, 0x555555, 1, true, LineScaleMode.NONE, CapsStyle.SQUARE); transform_mc.graphics.moveTo (2,2); transform_mc.graphics.lineTo ((anchura-5),2); transform_mc.graphics.lineTo ((anchura-5),(altura-5)); transform_mc.graphics.lineTo (2,(altura-5)); transform_mc.graphics.lineTo (2,2); //creo los cuadraditos de control en base a instancias de los símbolos que tengo creados en la biblioteca //y los coloco en las 4 esquinas de "transform_mc" var tirador1:MovieClip = new tiradorN(); tirador1.x = 0; tirador1.y = 0; transform_mc.addChild (tirador1); var tirador2:MovieClip = new tiradorN(); tirador2.x = anchura - 8; tirador2.y = 0; transform_mc.addChild (tirador2); var tirador3:MovieClip = new tiradorN(); tirador3.x = 0; tirador3.y = altura - 8; transform_mc.addChild (tirador3); var tiradorB:MovieClip = new tirador(); tiradorB.x = anchura - 10; tiradorB.y = altura - 10; transform_mc.addChild (tiradorB); //Ahora que ya está completo el "transform_mc", lo coloco dentro de "elMc" elMc.addChild(transform_mc); addChild (elMc); }
Tras ejecutar esto, me aparece en pantalla un hermoso movieclip con un cuadro de transformación y una preciosa chamarra en el medio.
Mi problema viene ahora. He creado unas funciones de escalado que funcionan muy bien en un movieclui creado "a mano". Ahora, necesito asignar esas funciones al "tiradorB" que se encuentra dentro del "transform_mc", dentro de "elMc". Obviamente no existe elMc.transform_mc.tiradorB (que es como lo haría en AS2).
Si hago un numChildren de elMc, me devuelve 2 (lógico, porque están ahí y se ven en pantalla). Si pregunto por el 0, me dice que es un objeto loader y si le pregunto por el 1 me dice que es un movieclip. Bien, eso es lo que tenía que ser. La cuestión es que si le pregunto por el nombre del child[1], me dice que es instance5, por lo que deduzco que mi "transform_mc" no se llama así, sino "instance5".
Entonces, ¿cómo diantre hago para que los movieclips que creo tengan el nombre que deseo para poder controlarlos independientemente? y ¿cómo hago para asignarles los comportamientos que deben llevar?
Gracias por vuestra paciencia y ayuda.