Comunidad de diseño web y desarrollo en internet online

Crear movieclip dinamicamente y acceder a ellos juntos

Citar            
MensajeEscrito el 02 May 2011 07:06 pm
Hola chicos de nuevo tengo un problemita con unos clip de pelicula creado dinamicamente;
tengo una Clip de pelicula en la biblioteca llamado Box esta vinculado con una clase Box tambien.
he creado un monton de copias de este clip suponemos 1000;
no se si puede pero lo que quiero hacer es anadir un metodo dentro de Box cada ver que occure un evento, los clips tambien cambien de posicion; sin hacer for(vari:uint=0;i<1000;i++){};

Código ActionScript :

package{
          import flash.display.*;
          public class Box extends MovieClip{
                   public function Box(){
                   // aqui el clip de pelicula toma un color aleatoria;
                   }
           public static function changePos(factor):void{
                   if((this.x+factor)<stage.stageWidth && (this.y+factor)<stage.stageHeight){
                         this.x+=factor;
                          this.y+=factor;
                    }else{
                           this.x-=factor;
                          this.y-=factor;
                    }
           }
      }
}

//
for(var i:uint=0;i<1000;i++){
      var myBox:Box=new Box();
       myBox.name="box"+i;
        myBox.x=Math.floor(Math.random()*stage.stageWidth);
        myBox.y=Math.floor(Math.random()*stage.stageHeight);
       this.addChild(myBox);
}
myBtn.addEventListener(MouseEvent.CLICK,pressHandler);
//
public function pressHandler(event):void{
         var coefficient:Number=Math.floor(Math.random()*5);
         myBox.changePos(coefficient)
}


Me sale error dice que el metodo this no se puede usar en static method
cuando lo quite el static se aplica solamente al ultimo clip
//
lo que quiero hacer exactamente es moverlos sin hacer for o sea hacer un metodo como la de
Datagrid.labelFunction , Array.forEach pero ejecutar lo cuando quiera :oops: :oops: :oops: :oops: :oops: :oops: :oops: :oops: :oops:

Por Andosonson

25 de clabLevel



Genero:Masculino  

Logic Creative

chrome
Citar            
MensajeEscrito el 02 May 2011 08:07 pm
Para no ir uno por uno llamando la función, le puedes agregar un listener a un evento personalizado donde incluyas el coeficiente que necesita el handler. Si no lo entiendes pregunta por mas detalles

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 02 May 2011 08:17 pm
No entiendo... me puedes dar un ejemplo por favor :D :D :D :D :D

Por Andosonson

25 de clabLevel



Genero:Masculino  

Logic Creative

chrome
Citar            
MensajeEscrito el 02 May 2011 08:38 pm
Evento

Código ActionScript :

package 
{
   import flash.events.Event;   
   
   public class ChangeposEvent extends Event
   {
      
      public static const CHANGE: String = "change"; 
      public var coefficient: Number;
      
   
      public function ChangeposEvent( type:String, coefficient:Number)
      {
         super( type);
                        this.coefficient = coefficient
      }
                override public function clone():ChangeposEvent{
                      return new ChangepsEvent(type, coefficient)
                }
   }
}

//Redeclaras el handler dentro de Box
public static function changePos(event:ChangeposEvent):void{ 
   factor = evt.coefficient
   (...)

//dentro del loop de creación agregas el listener
var myBox:Box=new Box(); 
myBox.addEventListener(ChangeposEvent, changePos)

//Al darle al boton generas el evento
dispatchEvent(new ChangeposEvent(ChangePos.CHANGE, Math.floor(Math.random()*5)))


Esa es la idea.

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 02 May 2011 08:52 pm
Muchas gracias Jorge!!!!! lo voy a probar.....

Por Andosonson

25 de clabLevel



Genero:Masculino  

Logic Creative

chrome
Citar            
MensajeEscrito el 02 May 2011 10:05 pm
yo pelee demasiado y lamentablemente sigue dandome error; REGALAME 5 MINUTOS PARA ACLARARME DE ESO POR FAVOR
PLEASE............


//1067: Conversión implícita de un valor de tipo Class a un tipo String no relacionado.
//myBox.addEventListener(ChangeposEvent, myBox.changePos);
//1178: Intento de acceso a una propiedad changePos no accesible mediante una referencia //con tipo estático Box.
//myBox.addEventListener(ChangeposEvent, myBox.changePos);

Tampoco no funciona con myBox.addEventListener(ChangeposEvent.CHANGE, myBox.changePos);

package {

import flash.events.Event;

public class ChangeposEvent extends Event {

public static const CHANGE: String = "change";
public var coefficient: Number;

public function ChangeposEvent(type:String, coefficient:Number) {
super(type);
this.coefficient = coefficient ;
}
public override function clone():Event {
return new ChangeposEvent(type,coefficient);
}
}
}

package {

import flash.display.MovieClip;
import flash.events.Event;

public class Box extends MovieClip {

public var factor:Number;

public function Box() {
// aqui el clip de pelicula toma un color aleatoria;
}
function changePos(event:ChangeposEvent):void {
factor= event.coefficient;
if ((this.x+factor)<stage.stageWidth && (this.y+factor)<stage.stageHeight) {
this.x+=factor;
this.y+=factor;
} else {
this.x-=factor;
this.y-=factor;
}
}
}
}

for (var i:uint=0; i<1000; i++) {
var myBox:Box=new Box();
myBox.addEventListener(ChangeposEvent, myBox.changePos);
myBox.name="box"+i;
myBox.x=Math.floor(Math.random()*stage.stageWidth);
myBox.y=Math.floor(Math.random()*stage.stageHeight);
this.addChild(myBox);
}
mybtn.dispatchEvent(new ChangeposEvent(ChangeposEvent.CHANGE, Math.floor(Math.random()*5)));

Por Andosonson

25 de clabLevel



Genero:Masculino  

Logic Creative

chrome
Citar            
MensajeEscrito el 02 May 2011 10:12 pm
yo pelee demasiado y lamentablemente sigue dandome error; REGALAME 5 MINUTOS PARA ACLARARME DE ESO POR FAVOR
PLEASE............


//1067: Conversión implícita de un valor de tipo Class a un tipo String no relacionado.
//myBox.addEventListener(ChangeposEvent, myBox.changePos);
//1178: Intento de acceso a una propiedad changePos no accesible mediante una referencia //con tipo estático Box.
//myBox.addEventListener(ChangeposEvent, myBox.changePos);

Tampoco no funciona con myBox.addEventListener(ChangeposEvent.CHANGE, myBox.changePos);

Código ActionScript :

package {
   
   import flash.events.Event;

   public class ChangeposEvent extends Event {

      public static  const CHANGE: String = "change";
      public var coefficient: Number;
      
      public function ChangeposEvent(type:String, coefficient:Number) {
         super(type);
         this.coefficient = coefficient ;
      }
      public override function clone():Event {
         return new ChangeposEvent(type,coefficient);
      }
   }
}

package {

   import flash.display.MovieClip;
   import flash.events.Event;

   public class Box extends MovieClip {

      public var factor:Number;

      public function Box() {
         // aqui el clip de pelicula toma un color aleatoria; 
      }
      function changePos(event:ChangeposEvent):void {
         factor= event.coefficient;
         if ((this.x+factor)<stage.stageWidth && (this.y+factor)<stage.stageHeight) {
            this.x+=factor;
            this.y+=factor;
         } else {
            this.x-=factor;
            this.y-=factor;
         }
      }
   }
}

for (var i:uint=0; i<1000; i++) {
   var myBox:Box=new Box();
   myBox.addEventListener(ChangeposEvent, myBox.changePos);
   myBox.name="box"+i;
   myBox.x=Math.floor(Math.random()*stage.stageWidth);
   myBox.y=Math.floor(Math.random()*stage.stageHeight);
   this.addChild(myBox);
}
mybtn.dispatchEvent(new ChangeposEvent(ChangeposEvent.CHANGE, Math.floor(Math.random()*5)));

Por Andosonson

25 de clabLevel



Genero:Masculino  

Logic Creative

chrome
Citar            
MensajeEscrito el 03 May 2011 11:03 am
Sorry, ayer andaba sin el Flash a mano y lo puse como me salía. Son necesarias algunas correcciones. Primero en la clase box vamos a agregar este método:

Código ActionScript :

 public function setListener(container:MovieClip):void {
    container.addEventListener(ChangeposEvent.CHANGE, changePos); 
  }


Luego en el loop cambiamos el addEventListener por esto

Código ActionScript :

myBox.setListener(this)


Luego, no pongas el evento a pelo, pon un botón para lanzarlo, porque se moverán todos ni bien se publique la peli y ni siquiera verás el movimiento

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 03 May 2011 02:27 pm
sigo peleando...
mira mi codigo final pruebalo y vea donde fallo

Código ActionScript :

//ChangeposEvent.as
package {
   
   import flash.events.Event;

   public class ChangeposEvent extends Event {

      public static  const CHANGE: String = "change";
      public var coefficient: Number;
      
      public function ChangeposEvent(type:String, coefficient:Number) {
         super(type);
         this.coefficient = coefficient ;
      }
      public override function clone():Event {
         trace("override")
         return new ChangeposEvent(type,coefficient);
      }
   }
}

//Box.as
package {

   import flash.display.MovieClip;
   import flash.events.Event;

   public class Box extends MovieClip {

      public var factor:Number;

      public function Box() {
         // aqui el clip de pelicula toma un color aleatoria; 
      }
      function changePos(event:ChangeposEvent):void {
         factor= event.coefficient;
         trace("the position has been changed "+factor+" pixels for "+this.name)
         if ((this.x+factor)<550 && (this.y+factor)<400) {
            this.x+=factor;
            this.y+=factor;
         } else {
            this.x-=factor;
            this.y-=factor;
         }
      }
      public function setListener(container:MovieClip):void {
          container.addEventListener(ChangeposEvent.CHANGE, changePos);  
        } 
   }
}

// Main timeline

for (var i:uint=0; i<200; i++) {
   var myBox:Box=new Box();
   myBox.setListener(myBox);
   myBox.name="box"+i;
   myBox.x=Math.floor(Math.random()*stage.stageWidth);
   myBox.y=Math.floor(Math.random()*stage.stageHeight);
   this.addChild(myBox);
}
stage.dispatchEvent(new ChangeposEvent(ChangeposEvent.CHANGE, Math.floor(Math.random()*5)));

Por Andosonson

25 de clabLevel



Genero:Masculino  

Logic Creative

chrome
Citar            
MensajeEscrito el 03 May 2011 02:31 pm
Luego, no pongas el evento a pelo, pon un botón para lanzarlo, porque se moverán todos ni bien se publique la peli y ni siquiera verás el movimiento


Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 03 May 2011 04:03 pm
Te agradesco mucho por tu paciencia pero al ponerle un boton y yo uso el metodo trace en Box.changePos

Código ActionScript :

trace("the position has been changed "+factor+" pixels for "+this.name)
para que me imprima algo. no occure nada ni siquiera imprimir...
Me puedes pasar el codigo complete por favor?

Por Andosonson

25 de clabLevel



Genero:Masculino  

Logic Creative

chrome
Citar            
MensajeEscrito el 03 May 2011 04:33 pm
Lo probé en mi máquina y hace el trace, solo que el dispatch no lo hace el stage, lo pongo directamente en la línea de tiempo>

dispatchEvent(new ChangeposEvent(ChangeposEvent.CHANGE, Math.floor(Math.random()*5)));

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 03 May 2011 04:47 pm
Positivo!!!!!!!!!!!!!!!!
muchas gracias Jorge Por la ayuda me anda super bien!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
:D :D :D :D :D :D :D :D :D :D :D :D :D :D :D :D :D :D :D :D :D :D :D

Por Andosonson

25 de clabLevel



Genero:Masculino  

Logic Creative

chrome

 

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