Problemas de paternidad en AS3
Yo sigo con conflictos entre papis e hijos...
Seguro que estoy cometiendo algún absurdo error , pero soy nueva programando y me quedo atascada muy facilmente...
A ver, estoy creando un menú en flash, con un mónton de botones que van a cargar diferentes swf's cada uno.
Los añado en el nivel 1 con addChildAt y luego quiero añadir un botón en el nivel 2 para que el usuario en cualquier momento pueda regreasr al menú principal.
Añado el swf sin problema, pero cuando intento añadir el botón me sale este error y no entiendo muy bien que hago mal...
TypeError: Error #2007: Parameter child must be non-null.
at flash.display::DisplayObjectContainer/addChildAt()
at flash.display::Stage/addChildAt()
at MenuPrincipal_fla::MainTimeline/frame175()
os pongo el código que en principio no debería resultarme tan complicado... nu se...
PB1_btn.addEventListener(MouseEvent.CLICK, cargarSwf1);
function cargarSwf1 (event:MouseEvent):void {
var req:URLRequest = new URLRequest ("01_PB.swf");
var loader:Loader = new Loader();
loader.load(req);
stage.addChildAt(loader, 1);
}
stage.addChildAt(volver_btn, 2);
this.volver_btn.addEventListener(MouseEvent.CLICK, volverAlMenu);
function volverAlMenu(event:MouseEvent): void {
stage.removeChildAt(1);
}
Cualquier idea es muuuuuuuy agradecida.
evabites
Vale, cosas raras de la programación que superan mi comprensión...
Ya he dado con la solución por si alguien está en mi misma situación o en una parecida.
La función que llamaba a la carga del swf externo y lo añadía al stage en el nivel 1 estaba en un botón
Lo único que he hecho, es sacar el código del botón y colocarlo en el siguiente frame.
El botón lo único que hace es mandarnos al siguiente frame y cuando el cabezal llega allí se ejecutan las acciones directamente y... VOILÁ! funciona...
... no me preguntéis por qué... pero bueno
Graaaaaaaaasias
evabites
lo decía de coña!!! jajaja que amable!
te lo he pasado al correo, vete mandandome el briefing!!
;P
Diego Lorenzo
Tienes un mail con el FTP
evabites
uff... como no tengas un ftp... ESTO PESA UN COJ..
dios! con lo feliz que era yo pintando con mis capitas de photoshop!
Diego Lorenzo
Jajaja, está complicado entonces. Los errores que te dan son de que volver_btn es nulo, ese es el problema.
Fíjate que el setChildIndex lo tienes que hacer después de cargar el swf que tapa todo.
Si quieres, pásame el .fla al correo y te lo corrijo enseguida, que por aquí es complicado.
Saludos
evabites
... esto es... casi
A ver el tema es que tengo un swf con muchos botones, cuando el usuario pulse un botón se carga en un nivel superior un swf externo que tapa por completo al anterior.
El botón volver debe estar por encima del swf cargado, en el nivel 2, para que el usuario pueda pulsarlo en cualquier momento. Lo que debería hacer ese botón es eliminar el swf cargado del nivel 1, para que se pueda volver a ver el menu inicial con los trescientosmil botones restantes que a su vez cargaran otros swf en el nivel 1...
por eso la función a la que llama el botón volver_btn usa un removeChildAt(1), para que vacie ese nivel... o al menos eso es lo que pretendo con ese código...pero ni siquiera soy capaz de que aparezca por encima del swf recien cargado...
he probado con
stage.setChildIndex(volver_btn, 2) -> para traerlo al frente, pero cuando se carga el swf, sigue tapando al botón... y por supuesto me sigue dando ese error...
TypeError: Error #2007: Parameter child must be non-null.
at flash.display::DisplayObjectContainer/setChildIndex()
at flash.display::Stage/setChildIndex()
at MenuPrincipal_fla::MainTimeline/frame175()
...
socorro!
Diego Lorenzo
Ah vale, ya he entendido lo que quieres hacer. Entonces el problema es que intentas añadir algo al escenario que ya existe en el escenario, y lo que necesitas es cambiar la profundidad. Eso lo puedes hacer así:
En AS2:
volver_btn.swapDepths( 2 ) -> para traerlo al frente
volver_btn.swapDepths( 1 ) -> para volver a enviarlo atrás.
En AS3:
stage.setChildIndex(volver_btn, 2) -> para traerlo al frente
stage.setChildIndex(volver_btn, 1) -> para volver a enviarlo atrás.
De todas formas, también puedes jugar con la propiedad visible del movieclip del botón
Con esto puedes eliminar las líneas donde haces el addChildAt y removeChildAt de volver_btn.
Saludos.
evabites
Si, tienes razón, pero en realidad no se va a subir a la red, se trata de unos ejecutables para un curso de formación y se utilizarán siempre en local, pero de todos modos es mejor acostumbrarse a hacer las cosas bien... me queda muchísimo que aprender...
En realidad volver_btn es un botón que ya está en el escenario, pero que al cargarse el swf en el nivel 1 queda tapado, por eso le he dado ese nombre de instancia y quiero subirlo al nivel 2...
¿te refieres a que lo exporte para action script?... creo que se a lo que te refieres pero no estoy muy segura...
Gracias de nuevo...
Diego Lorenzo
Sí, puede ser que ahora te funcionara, probablemente al probarlo en local la carga sea inmediata, pero al subirlo a la web había muchas probabilidades de que fallara.
Respecto a las líneas que comentas, por la descripción del error, se me ocurre preguntarte si volver_btn es una variable o un moviclip. En caso de que sea una variable está fallando por no estar inicializada.
Si es un movieclip, ¿lo has exportado para actionscript para poder referenciarlo desde la biblioteca?
Saludos
evabites
Muchas gracias, pero aún así, si quito la segunda parte es decir si quito este código:
stage.addChildAt(volver_btn, 2);
this.volver_btn.addEventListener(MouseEvent.CLICK, volverAlMenu);
function volverAlMenu(event:MouseEvent): void {
stage.removeChildAt(1);
}
no me da ningún error y el swf se reproduce perfectamente, el error me ha salido al añadir el resto...
creo el error lo da al añadir el botón... porque de hecho no me lo mete en el nivel 2, ya que no lo veo...
de todas maneras he añadido lo que me dices, parece mucho más solido de esa manera...
Gracias!
Diego Lorenzo
Hola,
El error está aquí:
loader.load(req);
stage.addChildAt(loader, 1);
Tienes que añadir un listener para cuando se completa la carga de ese loader. Tal como lo tienes ahora, añades el objeto que cargas en el loader antes de que se cargue, por lo que estás añadiendo un objeto nulo.
Saludos