Comunidad de diseño web y desarrollo en internet online

Ayuda Urgente Flash CS4!!!!!!!!

Citar            
MensajeEscrito el 10 Abr 2010 11:11 pm
No se si el tema valla aqui antes que nada, y si no va pido disculpas y que lo muevan a donde debe.
Bueno tengo una duda en flash, realize un tutorial de internet de como crear nieve, hasta ahi todo bien, el problema resulta cuando quiero eliminar toda la nieve, no encuentro manera de hacerlo, alguien me podria ayudar???
Aqui anexo la clase en AS3:

Código ActionScript :

package 
{
    import flash.display.*;
    import flash.events.*;

    public class SnowFlake extends MovieClip
    {
        private var xPos:Number = 0;
        private var yPos:Number = 0;

        private var xSpeed:Number = 0;
        private var ySpeed:Number = 0;

        private var radius:Number = 0;

        private var scale:Number = 0;
        private var alphaValue:Number = 0;
        
        private var maxHeight:Number = 0;
        private var maxWidth:Number = 0;
        
        public function BlueCircle()
        {
            
        }
        
        public function SetInitialProperties()
        {
            //Setting the various parameters that need tweaking 
            xSpeed = .05 + Math.random()*.1;
            ySpeed = .1 + Math.random()*3;
            radius = .1 + Math.random()*2;
            scale = .01 + Math.random();
            alphaValue = .1 + Math.random();

            var stageObject:Stage = this.stage as Stage;
            maxWidth = stageObject.stageWidth;
            maxHeight = stageObject.stageHeight;
            
            this.x = Math.random()*maxWidth;
            this.y = Math.random()*maxHeight;
            
            xPos = this.x;
            yPos = this.y;
            
            this.scaleX = this.scaleY = scale;
            this.alpha = alphaValue;
            
            this.addEventListener(Event.ENTER_FRAME, MoveSnowFlake);
        }

        function MoveSnowFlake(e:Event)
        {
            xPos += xSpeed;
            yPos += ySpeed;
            
            this.x += radius*Math.cos(xPos);
            this.y += ySpeed;
            
            if (this.y - this.height > maxHeight)
            {
                this.y = -10 - this.height;
            }
        }
    }
}


y Aqui donde la llamo ya en el archivo flash.

Código ActionScript :

function MakeItSnow(event:Event)
{
    
    
    for (var i:int = 0; i <.000000005; i++)
    {
        var newCircle:SnowFlake = new SnowFlake();
        this.addChild(newCircle);

        newCircle.SetInitialProperties();
    }
}

function Comienzo()
{
    control.addEventListener(Event.ENTER_FRAME, MakeItSnow);
}
Comienzo();


Por mas que intento no puedo quitar la nieve, porfavor ayudenme!!!

Por Hizen

1 de clabLevel



 

firefox
Citar            
MensajeEscrito el 11 Abr 2010 01:34 pm
Por partes.
Tratemos de explicar lo que es un objeto de la Clase SnowFlake. Un objeto de la Clase ShowFlakes es un Mc que se mueve de modo aleatorio de abajo a arriba. Cuando llega a la parte inferior de la película vuelve a su posición inicial.
La película principal, lo quehace es crear 500 de esos objetos y añadirlos al "stage".
Vale, tienes mal el código de tu película principal, pues deberías crear los copos UNA sola vez, no usar un ENTER_FRAME.
Vamos, debería ser simplemente

Código ActionScript :

function MakeItSnow() {
    for (var i:int = 0; i<500; i++)     { //He puesto 500 copos de nieve, porque me parecen suficientes
        var newCircle:SnowFlake = new SnowFlake();
        this.addChild(newCircle);
        newCircle.SetInitialProperties();     
    }
}
//Simplemente llamamos a la función para que cree los copos
 MakeItSnow()

Vamos, que creamos los 500 copos una sola vez.

Siempre que queramos eliminar TODOS los MCs (bueno, en propiedad todos los objetos DisplayObject) de algo es útil que estén metidos DENTRO de un MC. De ese modo es más fácil recorrerse todos los objetos. Así que lo primero que vamos a hacer es, en lugar de añadir los "copos" al Stage, los vamos a añadir a un Mc (en realidad un Sprite). Vamos, nuestra película principal va a quedar como

Código ActionScript :

var nieve:Sprite;  //creamos una variable
function MakeItSnow() {
    //creamos el Sprite
    nieve=new Sprite()
    //Lo añadimos al stage
    addChild(nieve)
    for (var i:int = 0; i<500; i++)     { //He puesto 500 copos de nieve, porque me parecen suficientes
        var newCircle:SnowFlake = new SnowFlake();
        nieve.addChild(newCircle)  //en lugar de al stage lo añadimos a "nieve"
        newCircle.SetInitialProperties();     
    }
}
//Simplemente llamamos a la función para que cree los copos
 MakeItSnow()

Vale, ahora ya podemos eliminar TODOS los copos en una función.

Código ActionScript :

function eliminarNieve(){
    while (nieve.numChildren>0){
          var copo:SnowFlake=getChildAt(0) as SnowFlake
          copo.removeEventListener(Event.ENTER_FRAME, MoveSnowFlake); 
          nieve.removeChild(copo)
    }
    removeChild(nieve)
}

Vale, hay bastantes cosas que explicar.
Cuando añadimos algo con addChild, se añade a lo que se conoce como "displayList". Para recuperar algo que se ha añadido a la "displayList" se puede usar el método getChildAt ó (getChildByName si le hemos dado valor a la propiedad "name" del objeto)

Ese objeto, Flash sólo lo reconoce como un "displayObject", como, en nuestro caso, además de un displayObject es un Objeto de tipo "SnowFlake" debemos hacer una "conversión de cast". Si, es la parte donde he escrito

Código ActionScript :

 var copo:SnowFlake=getChildAt(0) as SnowFlake


Por otra parte, cuando queremos eliminar un objeto, no sólo tenemos que eliminar un objeto de la "displayList", sino que, si tiene algún listener, debemos eliminarlo también. eso es el

Código ActionScript :

copo.removeEventListener(Event.ENTER_FRAME, MoveSnowFlake); 

De otro modo, simplemente no lo tendríamos en PANTALLA, pero seguiría EJECUTÁNDOSE el ENTER_FRAME.

Por Eliseo2

710 de clabLevel



 

msie8
Citar            
MensajeEscrito el 11 Abr 2010 07:08 pm
Muchisimas gracias por tu ayuda!!!! me sirvio muchisimo y pues es que si soy algo novato en el flash, y tu post me ha ayudado mucho, gracias por tu tiempo enserio =)

Por Hizen

1 de clabLevel



 

firefox
Citar            
MensajeEscrito el 11 Abr 2010 07:54 pm
jejeje ya vi que realiza la de MoveSnowFlake, pense que debia estar en mi pelicula principal ups :P

Por Hizen

1 de clabLevel



 

firefox
Citar            
MensajeEscrito el 12 Abr 2010 07:42 am
Lo he respondido en el mensaje -es que si alguien lee el post, se va a encontrar con el mismo problema que tú, sí que prefiero hacerlo así. No obstante hago un corta y pega del mensaje
sale este error
1120: Acceso a una propiedad MoveSnowFlake no definida en el origen copo.removeEventListener(Event.ENTER_FRAME, MoveSnowFlake); . es la que me sale en la parte donde se elimina la nieve

:glups: Hemos definido la función no como pública, sino como privada (por defecto las funciones son privadas). Vamos, que tenemos que definir la función como

Código ActionScript :

public function MoveSnowFlake(e:Event)  //<---he añadido "public"
{ 
         .....
}

Además, el removeListener quedaría como

Código ActionScript :

copo.removeEventListener(Event.ENTER_FRAME, copo.MoveSnowFlake);

Vale, no es demasiado "ortodoxo" eso. Si quisiéramos hacer OOP más ortodoxo, crearíamos un método (vale, una función) "deleteFlake". Vamos, dentro del SnowFlake.as añadiríamos una función

Código ActionScript :

//Esto DENTRO de nuestro ShowFlake.as
public function deleteFlake():void {
    removeEventListener(Event.ENTER_FRAME, MoveSnowFlake); 
    parent.removeChild(this)
}

Y la función eliminarNieve() quedaría como

Código ActionScript :

function eliminarNieve(){ 
    while (nieve.numChildren>0){ 
          var copo:SnowFlake=getChildAt(0) as SnowFlake 
          copo.deleteFlake();
    } 
    removeChild(nieve) 
} 

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 12 Abr 2010 07:55 am
Vale, vamos a hacerlo "más limpio". Lo que voy a hacer es que, cuando hagamos un removeChild de un copo elimine el ENTER_FRAME.
Para ello, en la función constructora del "copo" añadiremos el evento REMOVED_FROM_STAGE. en esa función, eliminaremos el ENTER_FRAME.
Vamos, nuestra Clase SnowFlake quedará

Código ActionScript :

 
package  
{ 
    import flash.display.*; 
    import flash.events.*; 
 
    public class SnowFlake extends MovieClip 
    { 
        private var xPos:Number = 0; 
        ....
         
        //Esta es nuestra función constructora
        public function SnowFlake() 
        { 
     addEventListener(Event.REMOVED_FROM_STAGE,eliminarCopo)
        } 
        ....
        //La función eliminarCopo, elimna el ENTERFRAME (también eliminamos el REMOVE_FROM_STAGE
   private function eliminarCopo():void 
   {
      removeEventListener(Event.REMOVED_FROM_STAGE, eliminarCopo);  
      removeEventListener(Event.ENTER_FRAME, MoveSnowFlake); 
   }
}

Así, nuestra función eliminarNieve quedaría como

Código ActionScript :

public function eliminarNieve():void { 
   while (nieve.numChildren>0){ 
      var copo:SnowFlake=nieve.getChildAt(0) as SnowFlake 
      nieve.removeChild(copo) //<--lo eliminamos del Stage
   } 
   removeChild(nieve) 
} 

Por Eliseo2

710 de clabLevel



 

firefox

 

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