Comunidad de diseño web y desarrollo en internet online

Como evitar removeChild si se repite

Citar            
MensajeEscrito el 13 May 2010 02:03 pm
Hola, tengo el siguiente codigo:
for (var ii:int = 0; ii < mteyArray.length; ii++)
{
mteyArray[ii].parent.removeChild(mteyArray[ii]);
}
}
el cual SI me elimina, pero el for es llamado varias veces, y me marca error porque ya se eliminaron, Como puedo checar que ya estan borrados y saltarme la linea? intente lo siguiente, pero fallo:

for (var ii:int = 0; ii < mteyArray.length; ii++)
{
if (mteyArray[ii] != null)
mteyArray[ii].parent.removeChild(mteyArray[ii]);
}
}

Como referencia, les comento que, el contenido del arreglo son sprites de este tipo:
var littleSquare:Sprite = new Sprite();
drawBoard.addChild(littleSquare);
littleSquare.graphics.beginFill(0x0000FF);
littleSquare.graphics.drawCircle(0, 0, 3);
littleSquare.graphics.endFill();
littleSquare.x = datos_separados[0]*factor1;
littleSquare.y = (yMax - datos_separados[1]) * factor1;
mteyArray.push(littleSquare); // <------AQUI GUARDO EL SPRITE EN EL ARREGLO

muchas gracias
mariobi40

Por mariobi40

13 de clabLevel



 

msie7
Citar            
MensajeEscrito el 13 May 2010 02:37 pm
Mediante el método "contains" puedes saber si está o no en la "displayList" del objeto si conocemos el objeto. También podemos comprobor "si tiene padre"

Código ActionScript :

//Si sabemos que está (o no) en "drawBoard"
for (var ii:int = 0; ii < mteyArray.length; ii++)
{
   if (drawBoard.contains(mteyArray[ii])){
         mteyArray[ii].parent.removeChild(mteyArray[ii]);
   }
}
//si queremos preguntar por su "padre"
for (var ii:int = 0; ii < mteyArray.length; ii++)
{
   if (mteyArray[ii].parent != null){
         mteyArray[ii].parent.removeChild(mteyArray[ii]);
   }
}

NOTA1: Te puedes preguntar por qué pasa esto. bien, cuando hacemos un removeChild SÓLO lo quitamos de la "displayList" (vamos, sólo se deja de ver). Pero el objeto sigue existiendo. Por ejemplo, si tuviéramos un objeto al que le añadimos un ENTER_FRAME, el ENTER_FRAME seguiría corriendo -y consumiendo recursos- Lo puedes comprobar en una película en la que tienes un botón llamado "boton1" Escribimos en el único frame de nuestra película

Código ActionScript :

var mc:MovieClip = new MovieClip();
mc.graphics.beginFill(0xffff00);
mc.graphics.drawRect(0, 0, 10,10);
addChild(mc);
mc.addEventListener(Event.ENTER_FRAME, moverMc)
boton1.addEventListener(MouseEvent.CLICK,botonOnClick)
function botonOnClick(e:MouseEvent){
     if (mc.parent!=null){
         removeChild(mc)
     }else{
         addChild(mc)
     }
}
function moverMc(e:Event){
   this.target.x++
}

Verás que, la primera vez que pulsas el botón desaparece, pero cuando lo vuelves a pulsar otra vez, el Mc está "movido"

NOTA2:Cuando tenemos un montón de MCs (o de Sprites o de lo que sea) DENTRO de otro. Se suelen eliminar todos con un

Código ActionScript :

while (drawBoard.numChildren){
     drawBoard.removeChildAt(0)
}

NOTA3:Idénticamente podemos referirnos a TODOS los MCs DENTRO de otro con un bucle

Código ActionScript :

for (int i=0;i<drawBoard.numChildren;i++){
     var mc:DisplayObject=drawBoard.getChildAt(i)
     //Ahora podemos, p.e.
     mc.x+=10
     //o lo que queramos
     trace(mc)
}

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 13 May 2010 03:44 pm
Gracias Eliseo, el primer sprite lo quita, pero al seguir avanzando el for (hay elementos intermedios que no tienen nada), o sea
nada
nada
nada
sprite //lo quita no prob
nada
nada
nada
sprite // este no lo quita, truena
etc,etc

problema en la linea ya sea:
if (mteyArray[conta1].parent != null)

o

esta
if (drawBoard.contains(mteyArray[conta1]))

marcandome:
[Fault] exception, information=TypeError: Error #1010: Un término no está definido y no tiene propiedades

El codigo exacto del for es:
conta1 = 1;
for (var kk:int = 1; kk < 500; kk++)
{
while (puntos[conta1] == null)
{
conta1++;
}
if (mteyArray[conta1].parent != null)
{
mteyArray[conta1].parent.removeChild(mteyArray[conta1]);
}
conta1++;
}
Porque me tronara despues del primer sprite eliminado? no es porque se recorren y ya no estan en el arreglo? tengo entendido que el removeChild afecta las depths de los sprites no?
saludos y gracias
mariobi40

Por mariobi40

13 de clabLevel



 

msie7
Citar            
MensajeEscrito el 13 May 2010 04:33 pm
Lo de que un removeChild afecta a las depth es sólo que si tenemos 10 Sprites el las depth 0,1,2,....9. si quitamos el Sprite de la "depth" 4, el que estaba en la posición 5 pasa a la posición 4, el que estaba en la 6 a la 5, etc. Vamos, TODAS las depths desde 0 hasta (numChildren-1) están siempre ocupadas.

Respecto a lo de que "trona" debe ser que
1.-NO existe mteyArray[conta1] porque "conta1" sea mayor o igual que el número de elementos del array (recordemos que los elementos de un array comienzan siempre por 0 y el último es la longitud del array menos uno
2.- mteArray[conta1] es null
3.-Existe mteArray[conta1] y no es nulo, pero NO es un DisplayObject o alguna clase de las que extienda el displayObject (un Sprite, un MovieClip....)

NOTA:Veo algo extraño en el código.
1.-Tu blucle empieza por 1, en lugar de por 0
2.-Supongo que el bucle del while debería estar FUERA del for o que se debería usar dos variables distintas para el array puntos y para el array mteyArray

NOTA sobre mis anteriores post
Imaginemos que queremos eliminar TODOS los Sprites de DENTRO de un MC llamado "drawBoard" pero que sean especiales. Al ser un sprite les podemos dar valor a su propiedad "name" cuando los creamos. Luego podemos usar ese "name" para eliminarlos o no.
Vamos
[as]
//Voy a crear varios Sprites DENTRO de drawBoard
for (i=0;i<10;i++){
var mc:Sprite1=new Sprite1() //<---unos de la Clase "Sprite1"
mc.name="sp1"+i
addChild(mc)
}
for (i=0;i<10;i++){
var mc:Sprite2=new Sprite1() //<---otros de la Clase "Sprite2"
mc.name="sp2"+i
addChild(mc)
}
//Si sólo quiero eliminar los de la Clase "Sprite2"
for (int i=0;i<drawBoard.numChildren;i++){
var mc:DisplayObject=drawBoard.getChildAt(i)
if (mc.name.substr(0,3)=="sp2"){
drawBoard.removeChildAt(i)
i--
}
}
[as]
NOTA2:También puedes, a la vez que haces el removeChild, eliminar el elemento del array

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 13 May 2010 04:35 pm
Resuelto, estaba mal mi logica, el indice debe ser kk, NO conta1.

Código :

   for (var kk:int = 1; kk < son1; kk++)
   {
      while (puntos[conta1] == null)
      {
      conta1++;
      }
      if (mteyArray[kk].parent != null) //<-----DEBE SER KK
      {
         mteyArray[kk].parent.removeChild(mteyArray[kk]); //<-----DEBE SER KK
      }
      conta1++;
      
   }

Por mariobi40

13 de clabLevel



 

msie7

 

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