Comunidad de diseño web y desarrollo en internet online

addChild y removeChild

Citar            
MensajeEscrito el 08 Ene 2009 04:18 am
Saludos.

Lo que tengo es muy sencillo pero no he podido remover un elemento traido de la librería mediante addChild.

en un botón tengo lo siguiente:
var MC1:mc1=new mc1 ;
parent.addChild(MC1);

Con otro botón lo intento remover:
parent.removeChild (MC1)

...pero no funciona, alguna solución?

Mil Gracias.

John Martin

Por JOHNMARTIN

Claber

1222 de clabLevel

4 tutoriales
4 articulos
2 ejemplos

Genero:Masculino  

||| BOGOTA COLOMBIA |||

firefox
Citar            
MensajeEscrito el 08 Ene 2009 05:10 am
Podrías eliminarlo por nombre

var MC1:mc1=new mc1;
MC1.name="mc1";


y lo borras con
this.removeChild(this.getChildByName("mc1"));

Por bryanisimo

664 de clabLevel



Genero:Masculino  

Geek

clabbrowser
Citar            
MensajeEscrito el 08 Ene 2009 05:46 am
Gracias Bryan.

Me saca este error al intentarlo de esa manera:
1119: Acceso a una propiedad name posiblemente no definida mediante una referencia con tipo estático Class.

El código que me envia no considera parent para la eliminación por nombre, será este el problema? Por favor mire el código mío y ahí verá que uso parent para el addChild.

Gracias de nuevo!

John Martin

Por JOHNMARTIN

Claber

1222 de clabLevel

4 tutoriales
4 articulos
2 ejemplos

Genero:Masculino  

||| BOGOTA COLOMBIA |||

firefox
Citar            
MensajeEscrito el 08 Ene 2009 07:45 am
John, varias cosas
1.-DEBE ser

Código ActionScript :

var MC1:mc1=new mc1() ; //<---los paréntesis

2.-La propiedad "name" es sólo para MovieClips, con lo que dará ese error en caso de que tu clase "mc1" no extienda de MovieClip, sino, p.e. de Sprite.
3.-Se acostumbra a nombrar las Clases, la primera con mayúsculas. Así, es mejor tener una Clase que se llame Mc1 (en lugar de mc1)
4.-Efectivamente, si le pudiéramos dar nombre debería ser

Código ActionScript :

parent.removeChild(parent.getChildByName("mc1")); 


Y ahora el problema (o algo de filosofía -lo siento-)
El problema de AS.3 es que la idea de "nombre de instancia" se pierde un poco. AS.3 simplemente maneja "variables que hacen referencia a MCs -o a Sprites, Shapes, etc-. Así que hay que tener en cuenta dónde definimos las variables, para saber si nos sirven para toda nuestra clase o sólo dentro de una función. Veamos un ejemplo

Código ActionScript :

   var mc1:Mc1=null; //<---variable tipo Mc1 que nos sirve en cualquier sitio
   boton1.addEventListener(MouseEvent.MOUSE_DOWN,anadirMCs)
   boton2.addEventListener(MouseEvent.MOUSE_DOWN,quitarMCs)

   function anadirMCs(e:Event):void{
          mc1=new Mc1();
          var mc2:Mc1=new Mc1();  //<--sólo tendrá sentido DENTRO de anadirMCs
          addChild(mc1)
          addChild(mc2)
  }
   function quitarMCs(e:Event):void{
          removeChild(mc1) //<--funciona porque "mc1" tiene valor
          removeChild(mc2) //<--NO funciona porque "mc2" NO tiene ningún valor
                                    //fuera de la función anadirMCs, que es donde la hemos declarado
  }

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 08 Ene 2009 11:47 pm
Hola.

Mil y mil gracias, finalmente saqué de la función la creación de la variable y ahora puedo eliminarla desde otro sitio.

Tengo un problema desencadenado de esto, me carga bien de la librería y lo elimina, pero al cargar, me carga un movieclip en su último frame, es decir, "si lo que cargo es un movieclip desde la librería y este tiene una animación de 20 frames, me lo carga en el último"...

Alguna solución?

Gracias nuevamente, John Martin

Por JOHNMARTIN

Claber

1222 de clabLevel

4 tutoriales
4 articulos
2 ejemplos

Genero:Masculino  

||| BOGOTA COLOMBIA |||

firefox
Citar            
MensajeEscrito el 09 Ene 2009 07:36 am
Realmente no te lo carga en el último frame. Lo que ocurre es que nada más crear el objeto (vamos, al hacer el new)

Código ActionScript :

var mc1:MC1=new MC1()

el "mc1" empieza a correr, con lo que, cuando lo añadamos con addChild estará en el frame que sea.
No debería ser mayor problema si inmediatamente después de crear el MC, lo añadimos al stage. Si, por cualquier motivo no es así tenemos varias posibles soluciones:

1.-En la definición de la Clase pararlo al principio y crear el evento ADD

Código ActionScript :

/**En el fichero MC1.as**/
public class MC1 extends MovieClip{
     public function MC1(){
          stop();
          addEventListener(Event.ADDED,start) //ó en el evento Event.ADDED_TO_STAGE
     }
     private function start():void{
         play()
     }
}

2.-Después de añadirlo, hacerlo correr desde el primer frame

Código ActionScript :

/**En la película principal**/
var mc1:MC1=new MC1();
addChild(mc1);
mc1.gotoAndPlay(1);

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 11 Ene 2009 06:26 pm
Saludos Eliseo, mi y mil gracias!

Ya vamos progresando con este tema...ahora solo me queda una pregunta...bueno, más bien es un problema generado por querer hacer uso adecuado de as3.

Idea general: tengo un boton dentro de un mc y espero con ese botón presionarlo y sacar algo de la librería y ponerlo en el escenario, por fuera del mc donde se encuentra el botón. El código es el siguiente:

###################
//en el escenario donde está el mc, genero el contenedor donde de lo que saque de la librería:
var elcontenedor:MovieClip = new MovieClip();
addChild(elcontenedor);

//dentro del mc que está en escenario, programo el boton.
//Ya el elemento en la librería tiene su nombre de clase "Clip".
boton_btn.addEventListener(MouseEvent.CLICK, mostrar);
var clip:Clip = new Clip();
function mostrar(event:MouseEvent):void {
parent.contenedor.addChild(clip);
}

Pero me gerera el errrrrrror:
1061: Llamada a un método MovieClip posiblemente no definido mediante una referencia con tipo estático flash.display:DisplayObjectContainer.
###################

Que estoy haciendo mal?

Gracias.

John Martin

Por JOHNMARTIN

Claber

1222 de clabLevel

4 tutoriales
4 articulos
2 ejemplos

Genero:Masculino  

||| BOGOTA COLOMBIA |||

firefox
Citar            
MensajeEscrito el 11 Ene 2009 07:36 pm
Necesitas hacer una "conversión de cast".
Flash, no sabe si "parent" es un MovieClip o no. Sólo sabe que es un DisplayObject. Vamos, tu MC podría estar dentro de un Shape o de un Sprite, p.e. Así que tenemos que escribir

Código ActionScript :

boton_btn.addEventListener(MouseEvent.CLICK, mostrar);
var clip:Clip = new Clip();
function mostrar(event:MouseEvent):void {
   MovieClip(parent).contenedor.addChild(clip);
}

NOTA1:Si no quieres tener en una variable fuera el "clip" puedes escribir

Código ActionScript :

boton_btn.addEventListener(MouseEvent.CLICK, mostrar);
function mostrar(event:MouseEvent):void {
   var clip:Clip=new Clip()
   MovieClip(parent).contenedor.addChild(clip);
}

Como supongo que en "contenedor" sólo va a haber un único clip cada vez, lo puedes eliminar con un

Código ActionScript :

MovieClip(parent).contenedor.removeChildAt(0)

NOTA2:El motivo de hacer la conversión de cast a MovieClip, es porque MovieClip es la única clase de AS.3 NO sellada. Esto es, que se le pueden añadir propiedades o variables

Por Eliseo2

710 de clabLevel



 

msie7
Citar            
MensajeEscrito el 12 Ene 2009 07:41 am
Creo que por fin voy organizando mi archivo, mil gracias Eliseo.

Ahora me queda un último detalle:

Si tengo más de 1 botón que trae "su respectivo" contenido de la librería, necesariamente tengo que poner esta línea para cada botón, con la idea que en contenedor solo haya un elemento y no se acumulen:

Código :

MovieClip(parent).contenedor.removeChildAt(0)

...pero entonces, al presionar cada botón automáticamente me elimina lo que haya en contenedor, es decir que no me cargará nada porque al mismo tiempo agrega contenido y lo elimina.

Entonces, como debo poner esa linea para que de manera excluyente remueva el contenido de contenedor?

Mil Gracias, espero me entiendan!

John Martin

Por JOHNMARTIN

Claber

1222 de clabLevel

4 tutoriales
4 articulos
2 ejemplos

Genero:Masculino  

||| BOGOTA COLOMBIA |||

firefox
Citar            
MensajeEscrito el 12 Ene 2009 08:01 am
1.-Comprueba primero si exite algo, si es así, lo eliminas
2.-Después de eliminar, añadimos el nuevo Clip

Código ActionScript :

function mostrar(e:Event){
if (MovieClip(parent).contenedor.numChildren>0){ //<--si tiene algo
    MovieClip(parent).contenedor.removeChildAt(0) //<--lo eleiminamos
}
var clip:Clip=new Clip()  //<--en cualquier caso, añadimos nuestro "clip"
MovieClip(parent).contenedor.addChild(clip)
}

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 14 Ene 2009 10:38 pm
Finalmente estoy cargando todo sin tener repeticiones, todo claro...pero falta un detallito ya de "carpintería":

Tengo la función completa así, pero el pedacito en donde quiero animar en el frame 1 de mc1, no me inicia y además me arroja error:

Código ActionScript :

function mostrar1(event:MouseEvent):void {
   if (MovieClip(parent).contenedor.numChildren>0) {
      MovieClip(parent).contenedor.removeChildAt(0);
   }
   MovieClip(parent).contenedor.addChild(mc1);
   MovieClip(parent).contenedor.mc1.play();
   creativa_mc.mouseEnabled=true;
   productiva_mc.mouseEnabled=true;
   interactiva_mc.mouseEnabled=false;
}

Y el error:
ReferenceError: Error #1069: No se encontró la propiedad mc1 en flash.display.Sprite y no hay ningún valor predeterminado.
   at menu/mostrar1()


Cómo hago para que me mc1 me inicie la animación?

Gracias.

John Martin

[BOFH]Cuando escribas código AS usa las etiquetas [*as] [*/as] (sin los asteriscos)[/BOFH]

Por JOHNMARTIN

Claber

1222 de clabLevel

4 tutoriales
4 articulos
2 ejemplos

Genero:Masculino  

||| BOGOTA COLOMBIA |||

firefox
Citar            
MensajeEscrito el 15 Ene 2009 07:34 am
A Flash le pasa como a mí, que no sé si contenedor es un MovieClip o un Sprite. Vale, veo que es un Sprite.
Si fuera un MovieClip (o extendiera de MovieClip) sería "dinamic"(*). Esto es, se puede hacer referencia a una variable o a un MovieClip como

Código ActionScript :

contenedor.variable=10 //p.e.
contenedor.mc1.play();  //p.e.

Como no lo es -y realmente no queremos que lo sea, usemos una variable temporal a la hora de hacer el addChild que haga referencia al MC añadido y usémoslá

Código ActionScript :

var ref_temporal:MovieClip=MovieClip(parent).contenedor.addChild(mc1); 
ref_temporal.play(); 


Lo del hacer una variable temporal que haga referencia a un MC se hace mucho. Ya en AS.2 teníamos un MC llamado "mimc" y escribíamos

Código :

//***AS.2***/
var ref_mimc=mimc
//y, a partir de ahora
ref_mimc._x=100
//es lo mismo que
mimc._x=100

//ó en un duplicate
var ref_mimc=original.duplicateMovieClip("copia",1)
//y, a partir de ahora
ref_mimc._x=100
//es lo mismo que
copia._x=100


(*)Al contrario que en AS.2, donde todas las Clases eran "dinamic" en ese sentido, en AS.3 sólo es "dinamic" la Clase MovieClip -y todas las que extiendan de ellas-. Ese es el motivo, por ejemplo, de que cuando tenemos un botón

Código ActionScript :

b1 = new Button();
b1.addEventListener(MouseEvent.CLICK, buttonClick);
private function buttonClick(e:MouseEvent) {
      var button:Button = e.target as Button;
      trace(button.label)
}
//pero NO podemos hacer
b1 = new Button();
b1.id=1 //<-------¡¡ERROR!!
b1.addEventListener(MouseEvent.CLICK, buttonClick);
private function buttonClick(e:MouseEvent) {
      var button:Button = e.target as Button;
      trace(button.id)  //<----¡¡ERROR!!
}

Si en lugar de un botón fuera un MovieClip SÍ se podría hacer

Código ActionScript :

b1 = new MovieClip();
b1.id=1 //<-------Sí, pues es MovieClip
b1.addEventListener(MouseEvent.CLICK, buttonClick);
private function buttonClick(e:MouseEvent) {
      var mc:MovieClip = e.target as MovieClip;
      trace(mc.id) 
}

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 06 Feb 2009 03:21 pm
Pues Sr Eliseo, finalmente tengo todo listo.
Agradezco inmensamente toda la ayuda sobre el tema!!!

John Martin

Por JOHNMARTIN

Claber

1222 de clabLevel

4 tutoriales
4 articulos
2 ejemplos

Genero:Masculino  

||| BOGOTA COLOMBIA |||

firefox
Citar            
MensajeEscrito el 15 Jul 2009 07:53 am
Hola soy nuevo en as3
hola necesito su ayuda soy nuevo en as3 y estoy tratando de cargar un clip externo en un contenedor pero a la vez que el botón que llama al clip descargue el clip externo que estaba antes en el contenedor este es código que estaba usando.

Código ActionScript :

//Boton Contacto

function ircontacto(event:MouseEvent):void 

{ 
   var contenedor = new Loader();
   contenedor.load(new URLRequest("index3.swf"));
   addChild(contenedor);
} 

function clicked(event:MouseEvent):void {
   root.contenedor.unload();
    root.removeChild(contenedor);
}


BTNS.btn_c.addEventListener(MouseEvent.CLICK, ircontacto); 
BTNS.btn_c.addEventListener(MouseEvent.CLICK, clicked); 



la primera vez que cargo el botón me funciona pero cuando lo presionó por segunda vez
me carga encima si eliminar el anterior y me sale este error. La idea es crear ina interface
a mi pagina. para que tengas una idea.

ArgumentError: Error #2025: El objeto DisplayObject proporcionado debe ser un elemento secundario del llamador.
at flash.display::DisplayObjectContainer/removeChild()
at index_fla::MainTimeline/clicked()

saludos :lol:

Por neobiker

1 de clabLevel



 

safari

 

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