Comunidad de diseño web y desarrollo en internet online

Botones en movieclip resizable se arrastren al hacer drag

Citar            
MensajeEscrito el 23 Jun 2010 09:07 pm
Buenas a todos, soy novato en esto del AS3 y estoy desarrollando una aplicación para ser usada como autoejecutable (sin navegador). La aplicación tiene botones en un menú que llaman movieclips de la biblioteca (tipo ventanas de Windows) y las carga en un contenedor, éstos se pueden mover, minimizar, nuevamente abrir, cerrar y escalar presionando un botón ubicado en la esquina inferior derecha del movieclip. El código del resizer de la ventana (movieclip) está en la propia línea de tiempo del movieclip (que para el ejemplo voy a llamar Ventana).
El problema que tengo es que cuando los botones (minimizar, maximizar, cerrar y resizer) del movieclip “Ventana” son tipo clip de película al pulsarlos se mueven, por el drag, independientemente del resto del movieclip, si les coloco la propiedad como “botón” funcionan perfecto pero entonces me sale el siguiente error:

ReferenceError: Error #1069: No se encontró la propiedad startDrag en flash.display.SimpleButton y no hay ningún valor predeterminado.
at Ventana/Arrastrar()
ReferenceError: Error #1069: No se encontró la propiedad startDrag en flash.display.SimpleButton y no hay ningún valor predeterminado.
at PruebaAS3_fla::MainTimeline/Arrastrar()
ReferenceError: Error #1069: No se encontró la propiedad stopDrag en flash.display.SimpleButton y no hay ningún valor predeterminado.
at PruebaAS3_fla::MainTimeline/Soltar()


De hecho, cuando abro el swf o el .exe y pulso uno de estos botones me sale un cuadro de diálogo con el Error de actionsript que ya escribí, y claro, si pulso el botón de descartar todo funciona muy bien. ¿Cómo soluciono este error?

Este es el código en el movieclip:

stop();
import flash.display.DisplayObject;
import flash.events.MouseEvent;

//////////////

var clickX;
var clickY;

resizer.addEventListener(MouseEvent.MOUSE_DOWN , onResizerPress );

function onResizerPress(e:MouseEvent)
{
clickX = this.x + this.width - this.parent.mouseX;
clickY = this.y + this.height - this.parent.mouseY;
this.parent.setChildIndex( this , this.parent.numChildren-1);
addEventListener(Event.ENTER_FRAME , onResizerFrame );
resizer.addEventListener(MouseEvent.MOUSE_UP , onResizerRelease );
this.parent.stage.addEventListener(MouseEvent.MOUSE_UP , onResizerRelease );
}

function onResizerRelease(e:MouseEvent)
{
if (hasEventListener(Event.ENTER_FRAME))
{
removeEventListener(Event.ENTER_FRAME , onResizerFrame );
}
if (resizer.hasEventListener(MouseEvent.MOUSE_UP))
{
resizer.addEventListener(MouseEvent.MOUSE_UP ,onResizerRelease );
}
if (this.parent.stage.hasEventListener(MouseEvent.MOUSE_UP))
{
this.parent.stage.removeEventListener(MouseEvent.MOUSE_UP , onResizerRelease );
}
}
function onResizerFrame(e:Event)
{
var w = this.parent.mouseX - this.x + clickX;
var h = this.parent.mouseY - this.y + clickY;
width = w;
scaleY = scaleX;
}

//////

this.addEventListener(MouseEvent.MOUSE_DOWN, Arrastrar);
this.addEventListener(MouseEvent.MOUSE_UP, Soltar);

function Arrastrar(e:MouseEvent)
{
e.target.startDrag();
this.parent.setChildIndex(this, this.parent.numChildren-1);
}
function Soltar(e:MouseEvent)
{
stopDrag();
}

//////////////

minimizar_mc.addEventListener(MouseEvent.CLICK, ClickMinimizar);
function ClickMinimizar(event:MouseEvent):void
{
this.gotoAndStop(2);
}
minimizar_mc.buttonMode = true;


salir_mc.addEventListener(MouseEvent.CLICK, ClickSalir);
function ClickSalir(event:MouseEvent):void
{
MovieClip(parent).removeChild(this);
}
salir_mc.buttonMode = true;



El código en la línea principal que llama los movieclips es este:

Menu_mc.boton01_mc.addEventListener(MouseEvent.CLICK, ClickVentana01);
function ClickVentana01(event:MouseEvent):void
{
var Ventana01_mc:Ventana = new Ventana();
Ventana01_mc.x = 170;
Ventana01_mc.y = 40;
contenedor01.addChild(Ventana01_mc);
}
Menu_mc.boton01_mc.addEventListener.buttonMode = true;


De antemano gracias por la ayuda que me puedan dar.

Por Josalv

9 de clabLevel



 

msie8
Citar            
MensajeEscrito el 23 Jun 2010 09:19 pm
Hola,
el problema es que los objetos SimpleButton no tienen el método startDrag, y por eso te da ese error. Es mejor que sigas usando MovieClips, pero si quieres que se arrastre la ventana completa y no sólo los botones individualmente, cambia esta línea dentro de la función Arrastrar:

Código ActionScript :

e.target.startDrag();

Por esta otra:

Código ActionScript :

e.currentTarget.startDrag();

Por isidoro

Claber

498 de clabLevel

2 tutoriales

Genero:Masculino  

firefox
Citar            
MensajeEscrito el 23 Jun 2010 09:31 pm
Gracias por contestar Isidoro, hice lo que sugieres pero aun así los botones se arrastran individualmente. ¿Qué puedo hacer?

Por Josalv

9 de clabLevel



 

msie8
Citar            
MensajeEscrito el 23 Jun 2010 09:38 pm
Y algo más. La función que se activa al presionar el botón resizer (en tipo movieclip) ya no permite ampliar el movieclip ventana, solo lo permite reducir y volverlo a su tamaño original pero no amplía, mientras que como botón funciona muy bien.

Por Josalv

9 de clabLevel



 

msie8
Citar            
MensajeEscrito el 23 Jun 2010 09:52 pm
Pues lo acabo de probar y a mí sí que me funciona, pero hay un pequeño problema del que no me había percatado, y es que haciendo eso se arrastra toda la ventana pero los botones no responden a su función, así que olvida lo que te he puesto antes y cambia esa misma línea por esta otra:

Código ActionScript :

if (e.target == this) e.target.startDrag();

Por isidoro

Claber

498 de clabLevel

2 tutoriales

Genero:Masculino  

firefox
Citar            
MensajeEscrito el 23 Jun 2010 10:15 pm
Perfecto!!!!! Eso funcionó muy bien. Muchas gracias.

Otra cosa, ¿Cómo hago para que el botón que llama al movieclip "Ventana" al ser pulsado por segunda vez no vuelva a llamar otro movieclip "Ventana" y así indefinidamente, y que sólo lo llame si lo he removido del contenedor?

Por Josalv

9 de clabLevel



 

msie8
Citar            
MensajeEscrito el 23 Jun 2010 10:28 pm
Y algo más, si quiero aplicar la función de arrastrar también a todo el contenedor en la línea principal como cuando tienes un mapa y quieres moverlo todo junto (los movieclips "Ventanas" abiertos que se pueden arrastrar y el contenedor que también se puede arrastrar) por qué deja de funcionar la función resizer?

Por Josalv

9 de clabLevel



 

msie8
Citar            
MensajeEscrito el 24 Jun 2010 07:18 am
Lo cierto es que para hacer lo que pides sería mejor que creases una clase para tu objeto Ventana en un archivo .as aparte, pero bueno, aquí te dejo un pequeño apaño que te servirá. Fíjate en los listener MOUSE_DOWN y MOUSE_UP que he añadido a contenedor01 para que no de el problema al arrastrarlo. Además deberías revisar las funciones onResizerPress y onResizerRelease, porque puedes evitar usar el ENTER_FRAME.
En el clip Ventana:

Código ActionScript :

stop();
import flash.display.DisplayObject;
import flash.events.MouseEvent;

//////////////

var clickX;
var clickY;

resizer.addEventListener(MouseEvent.MOUSE_DOWN , onResizerPress );

function onResizerPress(e:MouseEvent)
{
   clickX = this.x + this.width - this.parent.mouseX;
   clickY = this.y + this.height - this.parent.mouseY;
   this.parent.setChildIndex( this , this.parent.numChildren-1);
   addEventListener(Event.ENTER_FRAME , onResizerFrame );
   resizer.addEventListener(MouseEvent.MOUSE_UP , onResizerRelease );
   this.parent.stage.addEventListener(MouseEvent.MOUSE_UP , onResizerRelease );
}

function onResizerRelease(e:MouseEvent)
{
   if (hasEventListener(Event.ENTER_FRAME))
   {
      removeEventListener(Event.ENTER_FRAME , onResizerFrame );
   }
   if (resizer.hasEventListener(MouseEvent.MOUSE_UP))
   {
      resizer.addEventListener(MouseEvent.MOUSE_UP ,onResizerRelease );
   }
   if (this.parent.stage.hasEventListener(MouseEvent.MOUSE_UP))
   {
      this.parent.stage.removeEventListener(MouseEvent.MOUSE_UP , onResizerRelease );
   }
}
function onResizerFrame(e:Event)
{
   var w = this.parent.mouseX - this.x + clickX;
   var h = this.parent.mouseY - this.y + clickY;
   width = w;
   scaleY = scaleX;
}

//////

this.addEventListener(MouseEvent.MOUSE_DOWN, Arrastrar);
this.addEventListener(MouseEvent.MOUSE_UP, Soltar);

function Arrastrar(e:MouseEvent)
{
   if (e.target == this) e.target.startDrag();
   this.parent.setChildIndex(this, this.parent.numChildren-1);
}
function Soltar(e:MouseEvent)
{
   stopDrag();
}

//////////////

minimizar_mc.addEventListener(MouseEvent.CLICK, ClickMinimizar);
function ClickMinimizar(event:MouseEvent):void
{
   this.gotoAndStop(2);
}
minimizar_mc.buttonMode = true;

salir_mc.buttonMode = true;

En la línea de tiempo principal:

Código ActionScript :

var Ventana01_mc:Ventana;

Menu_mc.boton01_mc.addEventListener(MouseEvent.CLICK, ClickVentana01);
function ClickVentana01(event:MouseEvent):void
{
   if (Ventana01_mc != null) return;
   Ventana01_mc = new Ventana();
   Ventana01_mc.x = 170;
   Ventana01_mc.y = 40;
   Ventana01_mc.salir_mc.addEventListener(MouseEvent.CLICK, ClickSalir);
   contenedor01.addChild(Ventana01_mc);
}
Menu_mc.boton01_mc.buttonMode = true;



function ClickSalir(event:MouseEvent):void
{
   contenedor01.removeChild(Ventana01_mc);
   Ventana01_mc = null;
}


contenedor01.addEventListener(MouseEvent.MOUSE_DOWN, contenedor01MouseDown);
contenedor01.addEventListener(MouseEvent.MOUSE_UP, contenedor01MouseUp);
function contenedor01MouseDown(event:MouseEvent):void
{
   event.target.startDrag();
}

function contenedor01MouseUp(event:MouseEvent):void
{
   event.target.stopDrag();
}

Por isidoro

Claber

498 de clabLevel

2 tutoriales

Genero:Masculino  

firefox
Citar            
MensajeEscrito el 25 Jun 2010 08:57 pm
Hola isidoro, gracias por contestar. Ayer no pude conectarme y no había visto tu post. Bueno, te cuento que modifiqué el código como lo sugeriste pero los movieclips minimizar, salir y resizer volvieron a moverse individualmente. También confieso que no entiendo muy bien el AS3 por lo que no estoy muy seguro de lo que significan algunos de los cambios. He estudiado varios cursos y tutoriales que me han enseñado a usar el código que he encontrado googleando, pero aun me falta mucho por comprender, por lo que te pregunto si hay algún tutorial que explique el cómo y por qué se usa el código para obtener este tipo de resultados.

También te solicito que te pases por otro tema que abrí en el foro: "Al minimizar el video me saca la aplicacion de Fullscreen" lo cual necesito para hacer funcionar completamente mi aplicación.

En últimas la aplicación que estoy desarrollando busca llamar varios movieclips tipo ventana que traen una información relativamente corta o una ilustración o animación que permite ir armar un mapa conceptual de un tema en particular y que permite por este medio facilitar la exposición de ese tema, por lo que deseo que el contenedor pueda moverse con las ventanas y hacerle zoom al mismo (con botones + y -) permitiendo agregar más ventanas para completar el mapa conceptual y tener "en frente" todo el material necesario para su estudio y exposición. El Menú principal tiene los temas principales (botones) que llevan a cada frame donde se encuentran un menú con los botones para cada "ventana" de ese tema que se cargan en un contenedor por cada frame. Esa es la idea a grandes rasgos. Ya pasé un buen tiempo buscando y haciendo funcionar el código que posteé con mi pregunta inicial, así que después de probar el código que me hace falta estaré preguntando cuando no pueda hacerlo funcionar.

Nuevamente gracias por sacar tiempo para contestar mis inquietudes y las de tantas personas. Estaré pendiente a tus sugerencias, a ver cómo se puede dragar el contenedor y que funcione la función resizer correctamente.

Ah, otra cosa, la aplicación correrá como un autoejecutable por lo que pensé que era mejor que no tuviera que importar una clase externa, para solo tener un archivo, no es así? Gracias por tu ayuda.

Por Josalv

9 de clabLevel



 

msie8
Citar            
MensajeEscrito el 28 Jun 2010 02:09 pm
Alguien puede ayudarme?

Por Josalv

9 de clabLevel



 

msie8
Citar            
MensajeEscrito el 01 Jul 2010 11:12 pm
Tienes razón, el código que te puse no evita el drag de los botones, se podría hacer así (he cambiado el evento enterFrame):
En el MovieClip de la ventana:

Código ActionScript :

import flash.display.DisplayObject;
import flash.events.MouseEvent;

var clickX:Number;
var clickY:Number;

this.addEventListener(MouseEvent.MOUSE_DOWN, Arrastrar);
this.addEventListener(MouseEvent.MOUSE_UP, Soltar);

resizer.addEventListener(MouseEvent.MOUSE_DOWN , onResizerPress);

minimizar_mc.addEventListener(MouseEvent.CLICK, ClickMinimizar);
minimizar_mc.buttonMode = true;

salir_mc.buttonMode = true;

function onResizerPress(e:MouseEvent):void
{
   clickX = this.x + this.width - this.parent.mouseX;
   clickY = this.y + this.height - this.parent.mouseY;
   this.parent.setChildIndex(this, this.parent.numChildren-1);
   this.stage.addEventListener(MouseEvent.MOUSE_MOVE, onResizerMove);
   this.stage.addEventListener(MouseEvent.MOUSE_UP , onResizerRelease);
}

function onResizerRelease(e:MouseEvent):void
{
   this.stage.removeEventListener(MouseEvent.MOUSE_MOVE, onResizerMove);
   this.stage.removeEventListener(MouseEvent.MOUSE_UP , onResizerRelease);
}

function onResizerMove(e:MouseEvent):void
{
   var w:Number = this.parent.mouseX - this.x + clickX;
   //var h:Number = this.parent.mouseY - this.y + clickY;
   width = w;
   scaleY = scaleX;
}

function Arrastrar(e:MouseEvent):void
{
   if (e.target is Ventana) e.target.startDrag();
   this.parent.setChildIndex(this, this.parent.numChildren-1);
}

function Soltar(e:MouseEvent):void
{
   stopDrag();
}

function ClickMinimizar(event:MouseEvent):void
{
   this.gotoAndStop(2);
}

En la escena principal:

Código ActionScript :

var Ventana01_mc:Ventana;

Menu_mc.boton01_mc.addEventListener(MouseEvent.CLICK, ClickVentana01);
function ClickVentana01(event:MouseEvent):void
{
   if (Ventana01_mc != null) return;
   Ventana01_mc = new Ventana();
   Ventana01_mc.x = 170;
   Ventana01_mc.y = 40;
   Ventana01_mc.salir_mc.addEventListener(MouseEvent.CLICK, ClickSalir);
   contenedor01.addChild(Ventana01_mc);
}
Menu_mc.boton01_mc.buttonMode = true;



function ClickSalir(event:MouseEvent):void
{
   contenedor01.removeChild(Ventana01_mc);
   Ventana01_mc = null;
}

contenedor01.mouseChildren = true;
contenedor01.addEventListener(MouseEvent.MOUSE_DOWN, contenedor01MouseDown);
contenedor01.addEventListener(MouseEvent.MOUSE_UP, contenedor01MouseUp);
function contenedor01MouseDown(event:MouseEvent):void
{
   if (event.target is Contenedor) event.target.startDrag();
}

function contenedor01MouseUp(event:MouseEvent):void
{
   event.target.stopDrag();
}

Para que funcione tienes que abrir las propiedades del movieclip "contenedor", activar la casilla exportar para ActionScript, y donde pone Class pones Contenedor.
Por cierto, el hecho de que importes clases externas no quiere decir que se vayan a crear varios swf. De hecho es exactamente lo mismo que poner el código referente a cada MovieClip dentro de su propia línea de tiempo, pero todo estará más ordenado, y cuando comienzes a programar usando POO verás los beneficios que tiene hacerlo de esta forma.

Por isidoro

Claber

498 de clabLevel

2 tutoriales

Genero:Masculino  

firefox
Citar            
MensajeEscrito el 02 Jul 2010 12:03 am
Muchas gracias, voy a probarlo y te comento

Por Josalv

9 de clabLevel



 

msie8
Citar            
MensajeEscrito el 02 Jul 2010 09:51 pm
EXCELENTE Isidoro !!!!!!
Lo probé y funciona perfecto. Muchísimas gracias.
Eres un genio.

Ahora voy a incorporarle unos botones que me permitan:

- Hacer zoom in y zoom out al contenedor,
- Resetear la posición y zoom del contenedor y
- Borrar todo el contenido del contenedor

Te comentaré cómo me va con eso. Gracias de nuevo!!!!

Por Josalv

9 de clabLevel



 

msie8
Citar            
MensajeEscrito el 15 Jul 2010 12:14 am
Hola Isidoro, tengo dos problemas asociados al código anterior (por lo menos uno de ellos):

1. En la aplicaión tengo varios fotogramas cada uno con su contenedor. Descubrí que cuando cambio de frame sin cerrar los clips "Ventanas" y vuelvo al frame inicial y pulso un botón para llamar un movieclip que ya había llamado antes ya no me aparece más, solo aparecen los clips que no haya llamado previamente o que haya cerrado desde el botón salir.

¿Por qué pasa esto, y qué debo hacer?

2. Si tengo tres o cuatro Clips de película ("Ventanas") abiertos en un contenedor cómo los puedo remover todos desde un botón "borrar_mc".

De antemano gracias por tu ayuda.

Por Josalv

9 de clabLevel



 

msie8
Citar            
MensajeEscrito el 15 Jul 2010 09:03 am
Lo cierto es que la mejor forma de hacer lo que pretendes es crear clases para todos los objetos que usas, pero eso implicaría cambiar casi todo lo que llevas hecho hasta ahora.
No entiendo eso que dices de tener 3 o 4 Ventanas abiertas en un Contenedor, ¿no se suponía que querías que en cada Contenedor sólo se pudiese abrir 1 Ventana?
Aparte de eso, si vas a tener varios contenedores, y cada uno va a gestionar su propia ventana, tienes que crear la Ventana (o las Ventanas) dentro del propio objeto Contenedor. Más o menos sería así:
En la línea de tiempo principal:

Código ActionScript :

//NOTA: Esto se haría mejor creando una clase Menu que gestionase los eventos de los botones del menú:
Menu_mc.boton01_mc.buttonMode = true;
Menu_mc.boton01_mc.addEventListener(MouseEvent.CLICK, ClickVentana01);

function ClickVentana01(event:MouseEvent):void
{
   contenedor01.addVentana();
}

En el clip "Contenedor" (ahora se gestiona aquí la Ventana):

Código ActionScript :

var ventana:Ventana;

this.mouseChildren = true;
this.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
this.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);

function addVentana():void
{
   if (ventana != null) return;
   ventana = new Ventana();
   ventana.addEventListener("close", closeVentanaHandler);
   ventana.x = 170;
   ventana.y = 40;
   this.addChild(ventana);
}

function closeVentanaHandler(event:Event):void
{
   ventana.removeEventListener("close", closeVentanaHandler);
   this.removeChild(ventana);
   ventana = null;
}

function mouseDownHandler(event:MouseEvent):void
{
   //this.setChildIndex(ventana, this.numChildren - 1);
   event.target.startDrag();
}

function mouseUpHandler(event:MouseEvent):void
{
   event.target.stopDrag();
}

En el clip "Ventana":

Código ActionScript :

import flash.display.DisplayObject;
import flash.events.MouseEvent;

var clickX:Number;
var clickY:Number;

minimizar_mc.buttonMode = true;
salir_mc.buttonMode = true;

resizer.addEventListener(MouseEvent.MOUSE_DOWN , onResizerPress);
salir_mc.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
salir_mc.addEventListener(MouseEvent.CLICK, salirClickHandler);
minimizar_mc.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
minimizar_mc.addEventListener(MouseEvent.CLICK, ClickMinimizar);

function onResizerPress(event:MouseEvent):void
{
   event.stopImmediatePropagation();
   clickX = this.x + this.width - this.parent.mouseX;
   clickY = this.y + this.height - this.parent.mouseY;
   //this.parent.setChildIndex(this, this.parent.numChildren-1);
   this.stage.addEventListener(MouseEvent.MOUSE_MOVE, onResizerMove);
   this.stage.addEventListener(MouseEvent.MOUSE_UP , onResizerRelease);
}

function onResizerRelease(event:MouseEvent):void
{
   this.stage.removeEventListener(MouseEvent.MOUSE_MOVE, onResizerMove);
   this.stage.removeEventListener(MouseEvent.MOUSE_UP , onResizerRelease);
}

function onResizerMove(event:MouseEvent):void
{
   var w:Number = this.parent.mouseX - this.x + clickX;
   //var h:Number = this.parent.mouseY - this.y + clickY;
   width = w;
   scaleY = scaleX;
}

function ClickMinimizar(event:MouseEvent):void
{
   mouseDownHandler(event);
   this.gotoAndStop(2);
}

function salirClickHandler(event:MouseEvent):void
{
   mouseDownHandler(event);
   dispatchEvent(new Event("close"));
}

function mouseDownHandler(event:MouseEvent):void
{
   event.stopImmediatePropagation();
}

De todos modos, es mejor que antes de ponerte a escribir código te hagas un esquema de lo que quieres hacer.

Por isidoro

Claber

498 de clabLevel

2 tutoriales

Genero:Masculino  

firefox
Citar            
MensajeEscrito el 16 Jul 2010 05:11 pm
Isidoro, gracias por contestar.

Yo he hecho lo que dices, he creado clases para cada objeto usando el código que me has ayudado a pulir. En cada frame tengo un contenedor los cuales están situados en una capa inferior a los menús de la aplicación. El contenedor recibe entre 3 a 5 Clips de película (llamados Ventana01 a Ventana05, para el ejemplo). Como cada Clip puede ser arrastrado, el botón del menú que lo llama seguía colocando ese Clip (Ventana) tantas veces como se pulsara. Eso se solucionó con esta línea de código que me proporcionaste:

if (ventana != null) return;

Y funcionó perfecto. Pero esto hizo que al cambiar de frame sin cerrar el MovieClip (pulsando el botón “salir” del movieclip Ventana) cuando volvía a ese frame ya no pudiera llamarlo o visualizar más. Por eso te escribí el último post.

O sea que he planeado tener un solo contenedor por frame, y el código ha funcionado bien con la excepción que te comenté. Y otra cosa que no he logrado es que al pulsar un botón “Borrar” (por ejemplo), pueda remover todos los clips Ventanas que tenga abierto en el contenedor.

Por Josalv

9 de clabLevel



 

msie8
Citar            
MensajeEscrito el 19 Jul 2010 09:05 am
El código que he puesto es para crear una ventana por cada contenedor. Si has hecho algún cambio postea tu código, porque si no es imposible que pueda saber dónde está el problema.
De todos modos, si vas a crear de 3 a 5 ventanas por contenedor, en lugar de la variable "ventana" que hay dentro del objeto Contenedor deberías usar un Array de objetos Ventana, para eliminar todos los objetos ventana puedes usar un bucle, y para saber cuántos objetos Ventana hay creados sólo tendrías que comprobar el length del array de ventanas.

Por isidoro

Claber

498 de clabLevel

2 tutoriales

Genero:Masculino  

firefox
Citar            
MensajeEscrito el 19 Jul 2010 02:03 pm
Eso es exactamente. De hecho he usado ya en 5 frames el código que me ayudaste a pulir con 3 a 5 ventanas por contenedor. Y me ha dado el resultado que comenté antes. No sé cómo hacer esto del Array de objetos, ni del bucle para eliminarlos. ¿Puedes ayudarme con esto también?

Por Josalv

9 de clabLevel



 

msie8
Citar            
MensajeEscrito el 20 Jul 2010 09:17 am
Para crear un máximo de 5 ventanas puedes poner:
Línea de tiempo principal:

Código ActionScript :

//NOTA: Esto se haría mejor creando una clase Menu que gestionase los eventos de los botones del menú:
Menu_mc.boton01_mc.buttonMode = true;
Menu_mc.boton01_mc.addEventListener(MouseEvent.CLICK, ClickVentana01);

function ClickVentana01(event:MouseEvent):void
{
   contenedor01.addVentana();
}

Objeto Contenedor:

Código ActionScript :

var ventanas:Array = [];
const maxVentanas:uint = 5;

this.mouseChildren = true;
this.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
this.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);

function addVentana():void
{
   if (ventanas.length >= maxVentanas) return;
   var ventana:Ventana = new Ventana();
   ventana.addEventListener("close", closeVentanaHandler);
   ventana.x = 170;
   ventana.y = 40;
   this.addChild(ventana);
   ventanas.push(ventana);
}

function closeVentanaHandler(event:Event):void
{
   var ventana:Ventana = event.target as Ventana;
   ventana.removeEventListener("close", closeVentanaHandler);
   this.removeChild(ventana);
   ventana = null;
   ventanas.splice(ventanas.indexOf(ventana), 1);
}

function mouseDownHandler(event:MouseEvent):void
{
   //this.setChildIndex(ventana, this.numChildren - 1);
   event.target.startDrag();
}

function mouseUpHandler(event:MouseEvent):void
{
   event.target.stopDrag();
}

Objeto Ventana:

Código ActionScript :

import flash.display.DisplayObject;
import flash.events.MouseEvent;

var clickX:Number;
var clickY:Number;

minimizar_mc.buttonMode = true;
salir_mc.buttonMode = true;

resizer.addEventListener(MouseEvent.MOUSE_DOWN , onResizerPress);
salir_mc.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
salir_mc.addEventListener(MouseEvent.CLICK, salirClickHandler);
minimizar_mc.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
minimizar_mc.addEventListener(MouseEvent.CLICK, ClickMinimizar);

function onResizerPress(event:MouseEvent):void
{
   mouseDownHandler(event);
   clickX = this.x + this.width - this.parent.mouseX;
   clickY = this.y + this.height - this.parent.mouseY;
   //this.parent.setChildIndex(this, this.parent.numChildren-1);
   this.stage.addEventListener(MouseEvent.MOUSE_MOVE, onResizerMove);
   this.stage.addEventListener(MouseEvent.MOUSE_UP , onResizerRelease);
}

function onResizerRelease(event:MouseEvent):void
{
   this.stage.removeEventListener(MouseEvent.MOUSE_MOVE, onResizerMove);
   this.stage.removeEventListener(MouseEvent.MOUSE_UP , onResizerRelease);
}

function onResizerMove(event:MouseEvent):void
{
   var w:Number = this.parent.mouseX - this.x + clickX;
   //var h:Number = this.parent.mouseY - this.y + clickY;
   width = w;
   scaleY = scaleX;
}

function ClickMinimizar(event:MouseEvent):void
{
   mouseDownHandler(event);
   this.gotoAndStop(2);
}

function salirClickHandler(event:MouseEvent):void
{
   mouseDownHandler(event);
   dispatchEvent(new Event("close"));
}

function mouseDownHandler(event:MouseEvent):void
{
   event.stopImmediatePropagation();
}

Para borrar todas las ventanas puedes usar un bucle for que recorra todos los elementos del array, ir haciendo un removeChild de cada uno, y después lo eliminas del array.

Por isidoro

Claber

498 de clabLevel

2 tutoriales

Genero:Masculino  

firefox
Citar            
MensajeEscrito el 20 Jul 2010 12:08 pm
Gracias por tu respuesta. Haré el ajuste de código y te comento.

Por Josalv

9 de clabLevel



 

msie8

 

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