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
. 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

Juanlu_001 :
_________________
Volviendo al Tema: Buen aporte !!!...
M@U :
Juanlu_001 :
Lo es..., de cualquier forma son equivalentes
Es que yo muchas veces trate de hacer un for para borrar todo. Y ahí es donde estaba el error.
No creo que sea estúpido tu tip, por el contrario. ¿Como supiste que los Niveles se reorganizaban?
(Supongo que google)
Realmente lo averigüé utilizando muchos trace y razonando mucho, aunque (y esto va a quitarme muchos méritos
[OffTopic]Me puse a dar saltos de alegría cuando vi mi tip en la portada de Cristalab.
Juanlu_001 :
Realmente lo averigüé utilizando muchos trace y razonando mucho, aunque (y esto va a quitarme muchos méritos
[OffTopic]Me puse a dar saltos de alegría cuando vi mi tip en la portada de Cristalab.
Tengo el flash en ingles, y existen cosas que no entiendo.
Por HernanRivas (logout) el 09 de Febrero de 2008
Código :
while (stage.numChildren > 0) { stage.removeChildAt (0); }Código :
//--------------------------------------------------------- //stage.numChildren-1= numero de objetos en el escenario //--------------------------------------------------------- while (stage.numChildren-1 > 0) { stage.removeChildAt(1); }y con for:
Código :
//--------------------------------------------------------- //limite = numero de objetos en el escenario //--------------------------------------------------------- var limite:int=stage.numChildren-1; for (var j:int=0; j<limite; j++) { stage.removeChildAt(1); }para evitar el for de reversa.
Código :
for (i = stage.numChildren; i > 1; i--) { stage.removeChildAt(i - 1); }Por alex el 11 de Febrero de 2008
Por tutor29 el 11 de Febrero de 2008
Por Ivan el 11 de Febrero de 2008
Ivan_blog :
Por Pablo Mercado el 11 de Febrero de 2008
numFichas = new int(fichasContenedor.numChildren);
for (var i:int = 0; i < numFichas; i ) { fichasContenedor.removeChildAt(0);
}
Por Pablo Mercado el 11 de Febrero de 2008
Por HernanRivas (logout) el 11 de Febrero de 2008
Es más, muchos compiladores (creo que el de Flash también) reemplazan los fors con whiles.
Por julieth el 13 de Mayo de 2008
Por oscarlosan el 28 de Agosto de 2008
for (;stage.numChildren > 0
{
stage.removeChildAt (0);
}
Por Carlos Villena el 31 de Agosto de 2008
function RemoveObjectType(_container:DisplayObjectContainer, _type:String):void{
var _vault:Array = new Array();
for(var i:int=0; i<_container.numChildren; i++)
if(_container.getChildAt(i).toString()==("[object "+_type+"]"))
_vault.push(_container.getChildAt(i));
for(var index in _vault)
_container.removeChild(_vault[index]);
}
RemoveObjectType(this,"MovieClip");
Por maitane el 17 de Septiembre de 2008
Me has solucionado un fallo que llevo intentando solucionar varios dias.
Gracias
Por Leo el 06 de Octubre de 2008
Por Juan el 21 de Diciembre de 2008
Por JaRiGoF el 20 de Enero de 2009
Gracias por decir de ir del final hacia el principio.
Saludos!
Por DAEG el 08 de Abril de 2009
Por LeoBaraldi el 11 de Marzo de 2010
Por coast el 10 de Agosto de 2010
use este codigo en el boton
ilustracion_btn.addEventListener(MouseEvent.CLICK, cargarPel);
function cargarPel(event:MouseEvent):void {
var urlSwf:URLRequest = new URLRequest("portafolio.swf");
var cargarSwf:Loader = new Loader();
cargarSwf.load(urlSwf);
this.addChild(cargarSwf);
}
Por ten3301 el 28 de Septiembre de 2010