Comunidad de diseño web y desarrollo en internet online

Problemas con removeChild

Citar            
MensajeEscrito el 18 Sep 2009 03:38 pm
Hola a todos!!

Estoy haciendo un ejercicio en el que pulsando un tecla empieza nervar sobre un paisaje. Los copos son un simple mc en la biblioteca y los controlo con la clase Nieve.as:


Código ActionScript :

package {
   import flash.display.MovieClip;
   import flash.utils.Timer;
   import flash.events.Event;
   import flash.events.TimerEvent;

   public class Nieve extends MovieClip {
            
      //Timer con la "duracion" de la nieve en el suelo
      private var timer:Timer=new Timer(3000);
      
      //A true cuando se ha fundido para removeChild
      private var fundida:Boolean

      public function Nieve() {
         this.setFundida(false)
         addEventListener(Event.ENTER_FRAME, caer);
      }
      
      //Cae la nieve
      public function caer(evento:Event) {         
         x+=Math.random()*10-5; 
         y+=Math.random()*3+2;
         if ( (parent.getChildByName("paisaje").hitTestPoint(x,y,true) ) ) {
            removeEventListener(Event.ENTER_FRAME, caer);
            timer.start();
            timer.addEventListener(TimerEvent.TIMER, funde);
         }
      }
      
      //"Funde" la nieve
      public function funde(evento:TimerEvent):void {
         while (alpha > 0) {
            alpha -= 0.1;
         }
         this.setFundida(true)
      }
      
      private function setFundida(fundida:Boolean):void{
         this.fundida = fundida
      }
      
      public function getFundida():Boolean{
         return this.fundida
      }
   }
}



En el fla tengo:

Código ActionScript :

var n:Nieve;
var nevar:Boolean;

stage.addEventListener(KeyboardEvent.KEY_DOWN, nevada);

function nevada(evento:KeyboardEvent) {
   if (nevar==false) {
      addEventListener(Event.ENTER_FRAME, crearNieve);
      nevar=true;
   } else {
      removeEventListener(Event.ENTER_FRAME, crearNieve);
      nevar=false;
   }
}

function crearNieve(evento:Event) {
   for (var i=0; i<1; i++) {
      n = new Nieve();
      n.scaleX=n.scaleY=Math.random()*0.2+0.2;
      n.y=-10;
      n.x=Math.random()*800;
      n.addEventListener(Event.ENTER_FRAME, quitarNieve);
      addChild(n);
   }
}

//Pasamos el quitanieves :-)
function quitarNieve(evento:Event) {
   if (n.getFundida()){
      trace("se ha fundido y se puede eliminar")
      removeChild(n)
   }
}



Como podeis ver cuando la nieve esta en el suelo 3 segundos se funde...y aqui viene el problema, y es que no se como poder hacer el removeChild para eliminar los copos ya "derretidos". He hecho la funcion quitarNieve() pero no funciona bien, n.getFundida() solo es true cuando "para" de nevar y se "funden" todos los copos. Y cuando pasa eso me da error removeChild(n)


No se si me he explicado bien, por favor alguien me puede ayudar??!!!

Gracias de antemano!

Por Manolito_BCN

25 de clabLevel



 

msie7
Citar            
MensajeEscrito el 18 Sep 2009 04:14 pm
Hola,
yo me olvidaría de los accesor getFundida y setFundida, y lo que usaría es un eventDispatcher en el método funde (cuando el alpha sea igual a 0). Después añades un listener para ese evento en cada instancia de los copos (en el código de tu .fla), y desde ahí sí que podrás eliminarlos perfectamente.
PD: Antes de hacer el dispatchEvent deberías eliminar el evento del timer, para que no quede después de que ya hayas eliminado el copo.

Por isidoro

Claber

498 de clabLevel

2 tutoriales

Genero:Masculino  

firefox
Citar            
MensajeEscrito el 18 Sep 2009 04:15 pm

isidoro escribió:

Hola,
yo me olvidaría de los accesor getFundida y setFundida, y lo que usaría es un eventDispatcher en el método funde (cuando el alpha sea igual a 0). Después añades un listener para ese evento en cada instancia de los copos (en el código de tu .fla), y desde ahí sí que podrás eliminarlos perfectamente.
Gracias por la respuesta Isidoro, me podrias explicar un poco mejor o con un ejemplo lo del eventDispatcher por favor.

Por Manolito_BCN

25 de clabLevel



 

msie7
Citar            
MensajeEscrito el 18 Sep 2009 05:11 pm

Manolito_BCN escribió:

isidoro escribió:

Hola,
yo me olvidaría de los accesor getFundida y setFundida, y lo que usaría es un eventDispatcher en el método funde (cuando el alpha sea igual a 0). Después añades un listener para ese evento en cada instancia de los copos (en el código de tu .fla), y desde ahí sí que podrás eliminarlos perfectamente.
Gracias por la respuesta Isidoro, me podrias explicar un poco mejor o con un ejemplo lo del eventDispatcher por favor.


Asunto arreglado, muchisimas gracias por la ayuda Isidoro final mente quedo asi:


Nieve.as:

Código ActionScript :

package {
   import flash.display.MovieClip;
   import flash.utils.Timer;
   import flash.events.Event;
   import flash.events.TimerEvent;

   public class Nieve extends MovieClip {
            
      //Timer con la "duracion" de la nieve en el suelo
      private var timer:Timer=new Timer(3000);
      
      public function Nieve() {
         addEventListener(Event.ENTER_FRAME, caer);
      }
      
      //Cae la nieve
      public function caer(evento:Event) {         
         x+=Math.random()*10-5; //Viento ;-)
         y+=Math.random()*3+2;
         if ( (parent.getChildByName("paisaje").hitTestPoint(x,y,true) ) ) {
            removeEventListener(Event.ENTER_FRAME, caer);
            timer.start();
            timer.addEventListener(TimerEvent.TIMER, funde);
         }
      }
      
      //"Funde" la nieve
      public function funde(evento:TimerEvent):void {
         while (alpha > 0) {
            alpha -= 0.1;
         }
         dispatchEvent(new Event("fundida"));
      }
   }
}



Archivo fla:


Código ActionScript :

var n:Nieve;
var nevar:Boolean;

stage.addEventListener(KeyboardEvent.KEY_DOWN, nevada);

function nevada(evento:KeyboardEvent) {
   if (nevar==false) {
      addEventListener(Event.ENTER_FRAME, crearNieve);
      nevar=true;
   } else {
      removeEventListener(Event.ENTER_FRAME, crearNieve);
      nevar=false;
   }
}

function crearNieve(evento:Event) {
   for (var i=0; i<1; i++) {
      n = new Nieve();
      n.scaleX=n.scaleY=Math.random()*0.2+0.2;
      n.y=-10;
      n.x=Math.random()*800;
      n.addEventListener("fundida", quitarNieve);
      this.addChild(n);
   }
}

//Pasamos el quitanieves :-)
function quitarNieve(evento:Event) {
   trace("se ha fundido y se puede eliminar");
   evento.target.removeEventListener("fundida", quitarNieve);
   removeChild(evento.target);
}

Por Manolito_BCN

25 de clabLevel



 

msie7

 

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