Comunidad de diseño web y desarrollo en internet

Cómo eliminar objetos del escenario con removeChildAt()

Muy buenas, esta es mi primera aportación a la web de Cristalab, que tantas cosas me ha dado y que tan poco le he agradecido; ya iba siendo hora :-P. Como he empezado recientemente a dar mis primeros pasos en ActionScript 3, me surgió un problema durante el desarrollo de una clase, y he considerado que sería útil compartirlo por si a alguien le surge la misma duda.

Como sabemos, la forma de añadir MovieClips al escenario en AS3 ha cambiado. Ahora utilizamos la función DisplayObjectContainer.addChild() para añadir un clip de película, y la profundidad (los que recuerden attachMovie sabrán a lo que me refiero) es asignada ahora automáticamente. Esto, al utilizar varios clips y querer después eliminarlos, puede llevarnos a un pequeño quebradero de cabeza.

Por ejemplo, imaginemos que queremos añadir mediante código diez MCs idénticos. Generalizando, escribiríamos algo como esto (susceptible de correcciones):

Código :

x_MC = 50;
y_MC = 100;
for (i = 0; i < 10; i++) {
var my_MC:MovieClip = new MovieClip();
my_MC.x = x_MC;
my_MC.y = y_MC;
stage.addChild(my_MC);
x_MC += 20;
}

Con lo cual tenemos 10 MCs genéricos (que según lo que he escrito aquí me parece que muchos colorines no iban a tener) en el escenario (stage). Ahora, si quisiéramos eliminarlos, podríamos escribir algo como esto:

Código :

for (i = 0; i < stage.numChildren; i++)
{
stage.removeChildAt(i);
}


Pero comprobaríamos, que sólo se eliminarían la mitad. Incluso si almacenamos en una variable el valor de stage.numChildren antes de comenzar el bucle, este producirá un error de desbordamiento. ¿Por qué?

Como los índices de profundidad son asignados automáticamente por Flash, si teníamos diez MCs de profundidades 0, 1, 2, 3, 4, 5, 6, 7, 8, 9; al eliminar el primero, se reorganizan y quedan todos como 0, 1, 2, 3, 4, 5, 6, 7, 8 y no empezando por 1 y acabando por 9, como me pensaba yo que pasaría. Sucesivamente, a medida que eliminemos los MCs del principio quedarán como 0, 1, 2, 3, 4, 5, 6, 7; 0, 1, 2, 3, 4, 5, 6; etc. Y por eso el valor de la variable i terminará o bien sobrepasando al número de objetos en el escenario o bien saliéndose de la sucesión de profundidades.

Solución: Eliminar los MCs hacia atrás.

Código :

for (i = stage.numChildren; i > 1; i--)
{
stage.removeChildAt(i - 1);
}


Es una completa estupidez, pero como dije al principio, me pareció una de esas cosas tontas que pueden tenerte más tiempo del deseable buscando un error.

Espero haber ayudado con el aporte :-).

¿Sabes SQL? ¿No-SQL? Aprende MySQL, PostgreSQL, MongoDB, Redis y más con el Curso Profesional de Bases de Datos que empieza el martes, en vivo.

Publica tu comentario

o puedes...

¿Estás registrado en Cristalab y quieres
publicar tu URL y avatar?

¿No estás registrado aún pero quieres hacerlo antes de publicar tu comentario?

Registrate