Comunidad de diseño web y desarrollo en internet

Insertar una var dentro del nombre de una instancia de un mc AS 3.0

Citar            
MensajeEscrito el 14 Jul 2017 07:31 pm
Buenas, tengo un gran dilema. estoy haciendo un rompecabezas para una clase de mi Universidad. y ya lo tengo pero son 16 piezas y tengo que copiar el código 16 veces, asi que lo quiero hacer mas facil, en caso de que tenga unas 100 piezas. solo modificando la secuencia de las piezas de esta manera:

ESTE ES EL CODIGO PARA LA PIEZA #1:
-------------------------------------------------------------------------

Código ActionScript :

import flash.events.MouseEvent;

//Pieza 1
_1.addEventListener(MouseEvent.MOUSE_DOWN, m1);
function m1(e: MouseEvent): void {
   this.setChildIndex(e.currentTarget as DisplayObject, this.numChildren - 1);
   _1.startDrag();
}
_1.addEventListener(MouseEvent.MOUSE_UP, s1);
function s1(e: MouseEvent): void {
   _1.stopDrag();
}

EXPLICACIÓN:
• Cada pieza se llama: _1, _2, _3....etc. hasta la _16.
• Tengo creado el 1er listener que es m1 para mover y el 2do que se llama s1 para soltar. y como es para la pieza1, pues a todo le pongo 1, osea _1, m1, s1. y para la pieza 2 le cambio solo el numero 2.

Quiero saber como puedo hacerlo por medio de algun for o algun while, de manera que en me reconozca el nombre de instancia de la pieza, teniendo en cuenta que la variable que se va sumando sea: i asi:

_1 sea igual a ["_"+i]
y para los listener ["m"+i] y ["s"+i]
pero no se de que manera ponerlos. si usar un OnEnterFrame o algo asi.

e buscado por todos lados y no hay de esa manera. por ahi vi un video que usaban algo asi como lo que puse arriba para armar un nombre personalizado de instancia con una variable dentro por ejemplo

//teniendo en cuenta que eso esta dentro de un for con la variable i.
pieza1.startDrag();
que quede algo asi.
["pieza"+i].startDrag();
pero no me sirve asi. no se por que.

Les quedo muy agradecido de antemano por el apoyo que me puedan brindar.

Por Jorgecombest

2 de clabLevel



 

chrome
Citar            
MensajeEscrito el 02 Ago 2017 01:52 pm
Te falta la palabra clave this para fijar el scope

this["pieza"+i].startDrag();

Jorge

Por solisarg

BOFH

13361 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 02 Ago 2017 08:08 pm
Excelente, si me sirve para el

this["p"+1].startDrag();

pero si meto todo este codigo (el de abajo) dentro de un for, tambien tengo que cambiar los nombres de los eventos como ves abajo. Ej.: en lugar de m1, le pongo ["m"+1], donde 1 sería el i del for. pero no me sirve. Tu metodo solo me sirve para la acción del boton. pero en mi caso sería lo mismo que nada porque tambien tengo que cambiar los nombres de los listeners, osea todo lo que tenga el numero 1, como hago ahi?

Te quedo muy agradecido de antemano.

Código ActionScript :

//Pieza 1
p1.addEventListener(MouseEvent.MOUSE_DOWN, ["m"+1]);
function ["m"+1](e: MouseEvent): void {
   this.setChildIndex(e.currentTarget as DisplayObject, this.numChildren - 1);
   this["p"+1].startDrag();
}
p1.addEventListener(MouseEvent.MOUSE_UP, s1);
function s1(e: MouseEvent): void {
   this["p"+1].stopDrag();
}

Por Jorgecombest

2 de clabLevel



 

chrome
Citar            
MensajeEscrito el 02 Ago 2017 09:24 pm
No, un tipico loop de callback usa el event.target para apuntar a la instancia, incluso se usa un array para manejar la cola, te dejo un ejemplo colocando elementos en posiciones aleatorias ... el array ... por ahora no tiene utilidad, pero en cuanto avances e funcionalidad veras que te resulta muy util

Código ActionScript :

function hola(evt:MouseEvent){
  trace("Hola soy "+evt.target.name)
}
var cola:Array = []
for(var i:int = 0; i<100; i++){
 var item = new myObject();
 cola.push(item);
 item.name = "item"+i
 addChild(item);
 item.y = Math.random()*300
 item.x = Math.random() * 300;
 item.addEventListener(MouseEvent.CLICK, hola);
}


Jorge

Por solisarg

BOFH

13361 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 03 Ago 2017 05:33 pm
comprendo, pero entonces: como puedo hacer que este codigo (el de abajo) me sirva para las 16 piezas, uso un OnEnterFrame? o un For o un while?... como me recomiendas usarlo? para no tener que repetirlo 16 veces. ?

Código ActionScript :

//Pieza 1
_1.addEventListener(MouseEvent.MOUSE_DOWN, m1);
function m1(e: MouseEvent): void {
   this.setChildIndex(e.currentTarget as DisplayObject, this.numChildren - 1);
   _1.startDrag();
}
_1.addEventListener(MouseEvent.MOUSE_UP, s1);
function s1(e: MouseEvent): void {
   _1.stopDrag();
}

Por Jorgecombest

2 de clabLevel



 

chrome
Citar            
MensajeEscrito el 03 Ago 2017 05:59 pm
Pues es el mismo caso, solo tienes que usar el evento en vez de hardcodear nombre

Código ActionScript :

//Piezas
for(var i:int = 1; i<100; i++)   {
     this['pieza'+i].addEventListener(MouseEvent.MOUSE_DOWN, onClick);
      this['pieza'+i].addEventListener(MouseEvent.MOUSE_UP, onRelease);
}
function onClick(e: MouseEvent): void {
   this.setChildIndex(e.currentTarget as DisplayObject, this.numChildren - 1);
   this.startDrag();
}

function onRelease(e: MouseEvent): void {
  this.stopDrag();
}


Jorge

Por solisarg

BOFH

13361 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 18 Ago 2017 04:19 pm
Bro, en serio muchas gracias, me has ayudado mucho, asi que dando y dando pajarito volando...

el codigo estaba bien con el FOR, pero el Stardrag me puse a investigar y funciona asi de esta manera. Muchas gracias en serio.

Código ActionScript :

stop();
stage.displayState = StageDisplayState.FULL_SCREEN;
import flash.events.MouseEvent;
var i = 1;
//Piezas
for (i; i < 100; i++) {
   this['p' + i].addEventListener(MouseEvent.MOUSE_DOWN, onClick);
   this['p' + i].addEventListener(MouseEvent.MOUSE_UP, onRel);

   function onClick(e: MouseEvent): void {
      this.setChildIndex(e.currentTarget as DisplayObject, this.numChildren - 1);
      e.target.startDrag()
   }

   function onRel(e: MouseEvent): void {
      e.target.stopDrag();
   }
}

Por Jorgecombest

2 de clabLevel



 

chrome

   Página 1 de 1

 

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