Comunidad de diseño web y desarrollo en internet online

path relativo a instancias de clase

Citar            
MensajeEscrito el 07 Dic 2008 10:56 pm
hola, tengo un codigo que he estado elaborando hoy, a partir del cual un MC cuadrado se duplica a si mismo en las cuatro direcciones posibles, de modo que cada instancia haga lo mismo y asi todo el escenario se vaya llenando de cuadrados. estoy haciendo esto con una clase, que hace que cada MC al crearse compruebe si existen o no, los MCs aledaños, de modo que si no existen sean creados.

Código :

class Cuadrado extends MovieClip {
   //DECLARO TODAS LAS VARIABLES COMO PUBLICAS
   //...

   //CONSTRUCTOR
   function Cuadrado() {
      //SI ES EL PRIMER CLIP
      if (this._name == "x0y0") {
         //LO UBICAMOS EN UN LUGAR PREDEFINIDO
         this._x = 100;
         this._y = 100;
         //SUS VARIABLES nx Y ny SON CERO
         this.NX = 0;
         this.NY = 0;
      }
      //AHORA ESTO PARA TODOS LOS CLIPS QUE SE CREEN 
      //ESTAS VARIABLES SIRVEN PARA REFERENCIAR LOS CLIPS ALEDAÑOS
      this.arriba = this.NY+1;
      //AL CREARSE SE SETEA LA VARIABLE AVAIBLE PARA QUE OTROS PUEDAN COMPROBAR SI EXISTE
      this.avaible = true;
   }
   public function comprobar():Void {
      //DEFINIMOS EL NOMBRE DEL CLIP QUE DEBERIA ESTAR ARRIBA (EN EL CASO DEL PRIMER CLIP, EL DE ARRIBA SERIA x0y1
      this.destino = "x"+NX+"y"+arriba;
      //SI NO EXISTE LA VARIABLE AVAIBLE EN EL CLIP DESTINO, ES PORQUE EL CLIP DESTINO NO EXISTE
      if (_root[destino].avaible == undefined) {
         //ENTONCES LO CREAMOS
         attachMovie("cuadrado",destino,_level0.getNextHighestDepth,{_y:-100, NX:this.NX, NY:arriba});
      }
   }
   private function onEnterFrame() {
      //HACEMOS LA COMPROBACION TODO EL TIEMPO
      comprobar();
   }
}


ahora esto en teoria funciona bien, ya que se crean infinitamente clips 100 pixeles arriba del anterior, haciendo una cadena. el problema es cuando quiero empezar a hacer las funciones para abajo y para los costados:

lo primero que hago es crear un valor para el nombre que tendria el clip inferior

Código :

   //AHORA ESTO PARA TODOS LOS CLIPS QUE SE CREEN 
      //ESTAS VARIABLES SIRVEN PARA REFERENCIAR LOS CLIPS ALEDAÑOS
      this.arriba = this.NY+1;
      this.abajo = this.NY-1;


luego copio la funcion para comprobar el clip de arriba pero le cambio los datos para el clip inferior

Código :

//ESTA FUNCION ES IGUAL, PERO PARA COMPROBAR LA EXISTENCIA DEL CLIP INFERIOR
      this.destino = "x"+NX+"y"+abajo;
      if (_root[destino].avaible == undefined) {
         attachMovie("cuadrado",destino,_level0.getNextHighestDepth,{_y:+100, NX:this.NX, NY:abajo});
      }


aqui empiezan los problemas, porque ya no se crean clips ni para arriba ni para abajo, sino que se crean todos en la misma posicion: por debajo del original y todos encimados infinitamente
estoy casi segurisimo de que el problema es el pathing en el IF, ya que he hecho un trace:

Código :

//ESTA FUNCION ES IGUAL PARA EL CLIP DE ABAJO
      this.destino = "x"+NX+"y"+abajo;
      if (_root[destino].avaible == undefined) {
         trace(_root[destino].avaible);
         attachMovie("cuadrador",destino,_level0.getNextHighestDepth,{_y:+100, NX:this.NX, NY:abajo});
      }


y siempre me tira undefined, es decir que se estan haciendo mal las comprobaciones de si existen o no clips arriba y abajo

la pregunta es, estoy en lo correcto con respecto a mi error?
si fuera asi, me pueden recomendar algun buen tutorial de pathing (rutas) en flash?

Por federomano

16 de clabLevel



Genero:Masculino  

Cordoba, Argentina

firefox
Citar            
MensajeEscrito el 08 Dic 2008 07:39 pm
Hola, como buen programador, te digo que estas haciendo una tormenta en un baso de agua, deberas encontrar una mejor solucion de lo contrario tu clase cuadrado sera un desastre, mira te recomiendo que en vez de comprobar por nombres uses apuntadores, bueno, referencias a los clips, implementando variables como estas:

Código :

private var arriba_mc:MovieClip
private var abajo_mc:MovieClip
private var adelante_mc:MovieClip
private var atras_mc:MovieClip

y las comprobaciones fueran asi:

Código :

if( arriba_mc == undefined )
//CREAR


bueno, espero esto te pueda facilitar un poco tu script, la verdad no esta muy dificil lo que haces, solo que tu solucion es un poco engorrosa.

Por LongeVie

Claber

1741 de clabLevel

1 tutorial

Genero:Masculino  

En un lugar, re moto.

msie7
Citar            
MensajeEscrito el 08 Dic 2008 09:01 pm
gracias por responder, recien me estoy metiendo con las clases y me biene vien la ayuda.
te comento, arriba_mc tiene que ser una referencia hacia el clip que se encuentra arriba de cada uno de los clips que se creen, de modo que cada uno pueda comprobar si encima suyo existe otro clip (ejemplo, si arriba de x13y34 existe x13y35). lo que yo he intentado hacer en la funcion constructora es definir arriba_mc, abajo_mc, izquierda_mc y derecha_mc para luego hacer la comprovacion en tiempo real.

defino el tipo

Código :

private var arriba_mc:MovieClip


le doy un target (en el constructor)

Código :

this.arriba_mc._name = "x"+this.NX+"y"+(this.NY+1);

(si THIS es x2y7, arriba_mc._name deberia ser x2y8)

y la funcion onenterframe

Código :

if (_level0.arriba_mc == undefined) {
     trace (arriba_mc._name);
}


pero en el TRACE me sale undefined, por lo que evidentemente estoy referenciando mal la varieble ariba_mc

Por federomano

16 de clabLevel



Genero:Masculino  

Cordoba, Argentina

firefox
Citar            
MensajeEscrito el 08 Dic 2008 09:32 pm
ok, ok, mejor dime que quieres hacer exactamente, para que te ayude con una solucion un poco mas facil, porque si evaluas los nombres puedes encontrar muchos tipos distintos de errores ademas del rendimiento, ok?

yo supongo que quieres poner un Cuadrado en el escenario que en cada frame que pase se auto reproduzca hacia los arriba abajo adelante y atras, y cada reproduccion propia haga exactamente lo mismo.
atando cabos, supon que cuadrado crea a uno arriba de si mismo, ese cuadrado nuevo, creara a uno arriba de si mismo tambien, pero debe de tener cuidad al crear al de abajo, porque ese ya existe(fue quien lo creo), entonces solo creara arriba, atras y adelante, no?

Por LongeVie

Claber

1741 de clabLevel

1 tutorial

Genero:Masculino  

En un lugar, re moto.

msie7
Citar            
MensajeEscrito el 08 Dic 2008 09:42 pm
exactamente, pero bueno, estoy intentando algo muy cpmlicado para ser muy novato no?? perdon.... :oops:

Por federomano

16 de clabLevel



Genero:Masculino  

Cordoba, Argentina

firefox
Citar            
MensajeEscrito el 08 Dic 2008 09:50 pm
oie pues mira, tienes otro problema, _level0.getNextHighestDepth, getNextHighestDepth es una funcion no una variable, se llama con parentesis, por eso no te crea nada, correcto: _level0.getNextHighestDepth()

Por LongeVie

Claber

1741 de clabLevel

1 tutorial

Genero:Masculino  

En un lugar, re moto.

msie7
Citar            
MensajeEscrito el 08 Dic 2008 09:51 pm
esta es mi solucion incial despues la vamos ajustando a lo que quieres, pruebala.

Código :

class Cuadrado extends MovieClip {
   
   public var arriba_mc:MovieClip;
   public var abajo_mc:MovieClip;
   public var adelante_mc:MovieClip;
   public var atras_mc:MovieClip;
   public var separar_nmb:Number;
   
   public function Cuadrado()
   {
      super();
      this.separar_nmb = 5;
   }
   
   private function comprobar( Void ):Void 
   {
      var nivel:Number;      
      if( this.arriba_mc == undefined )
      {
         nivel = this._parent.getNextHighestDepth();
         this._parent.attachMovie( "cuadrado", "C"+nivel, nivel, {_y:this._y - this._height - this.separar_nmb, _x:this._x, abajo_mc:this});
      }
      if( this.abajo_mc == undefined )
      {
         nivel = this._parent.getNextHighestDepth();
         this._parent.attachMovie( "cuadrado", "C"+nivel, nivel, {_y:this._y + this._height + this.separar_nmb, _x:this._x, arriba_mc:this});
      }
      if( this.adelante_mc == undefined )
      {
         nivel = this._parent.getNextHighestDepth();
         this._parent.attachMovie( "cuadrado", "C"+nivel, nivel, {_y:this._y, _x:this._x + this._width + this.separar_nmb, atras_mc:this});
      }
      if( this.atras_mc == undefined )
      {
         nivel = this._parent.getNextHighestDepth();
         this._parent.attachMovie( "cuadrado", "C"+nivel, nivel, {_y:this._y, _x:this._x - this._width - this.separar_nmb, adelante_mc:this});
      }
   }
   private function onEnterFrame( Void ):Void
   {
      this.comprobar ();
   }
}

Por LongeVie

Claber

1741 de clabLevel

1 tutorial

Genero:Masculino  

En un lugar, re moto.

msie7
Citar            
MensajeEscrito el 08 Dic 2008 09:55 pm
:O bueno a medida que avanza la situacion se va alentando mucho, lo estoy solucionando

Por LongeVie

Claber

1741 de clabLevel

1 tutorial

Genero:Masculino  

En un lugar, re moto.

msie7
Citar            
MensajeEscrito el 08 Dic 2008 10:06 pm
entendi perfectamente, creo que no necesito mas ayuda por ahora, lo que tengo que hacer es que no desborde la memoria haciendo que solo se creen cuadrados en una zona que cubra todo el escenario y un poco mas, de modo que no se vean zonas vacias.
vos me recomendas que el cuadrado se autoelimine si se encuentra fuera de la zona? o que el cuadrado anterior directamente no lo cree?

yo creo que es mejor lo segundo

Por federomano

16 de clabLevel



Genero:Masculino  

Cordoba, Argentina

firefox
Citar            
MensajeEscrito el 08 Dic 2008 10:30 pm
perdon, no me queda claro que es la funcion super..

Por federomano

16 de clabLevel



Genero:Masculino  

Cordoba, Argentina

firefox
Citar            
MensajeEscrito el 08 Dic 2008 10:36 pm
pues primero, si necesitas solo cubrir zonas, no seria mejor hacer un cuadrado tan grande como el Stage? o crear cuadrados en filas hasta que se cubra el stage? no creo que sea eso lo que buscas pero lo pregunto por si las dudas. y si la posicion del cuadrado nuevo esta fuera de la zona no debe crearlo.

si quieres prueba esto, a lo mejor es mas como lo que necesitas:

Código :

class Cuadrado extends MovieClip 
{
   public static var contador:Number = 0;

   public var abajo:Boolean;
   private var separar_nmb:Number;
   
   public function Cuadrado()
   {
      super();
      this.separar_nmb = 5;
      if( contador == 0 )
      {
         this.abajo = true;
         this._x = 0;
         this._y = 0;
      }
      contador++;
      //Por cada frame
      this.onEnterFrame = function( Void ):Void
      {
         trace(this);
         this.comprobar ();
         delete this.onEnterFrame;
      };
      //Si lo quieres instantaneo
      this.onEnterFrame();
   }
   
   private function comprobar( Void ):Void 
   {
      if( Stage.width > (this._x + this._width + this.separar_nmb) )
      {
         this._parent.attachMovie( "Cuadrado", "C" + contador, this._parent.getNextHighestDepth(), {_y:this._y, _x:this._x + this._width + this.separar_nmb, abajo:false});
      }
      
      if( abajo && ( Stage.height > this._y - this._height - this.separar_nmb ))
      {
         this._parent.attachMovie( "Cuadrado", "C" + contador, this._parent.getNextHighestDepth(), {_y:this._y + this._height + this.separar_nmb, _x:this._x, abajo:true});
      }
   }
}

Por LongeVie

Claber

1741 de clabLevel

1 tutorial

Genero:Masculino  

En un lugar, re moto.

msie7
Citar            
MensajeEscrito el 08 Dic 2008 10:43 pm
bueno, en ActionScript y en muchisimos lenguajes de programacion orientados a objetos, super es un operador de acceso de clases, que referencia a la clase padre, en el caso de nuestra clase Cuadrado, su padre es MovieClip, super entonces apunta a esa clase, y this, apunta a la clase Cuadrado, cuando super se usa asi super(); significa que se esta ejecutando la sentencia constructora de la calse padre, en este caso no es necesario pues la sentencia constructora de MovieClip, no define nada, pero supon que yo creo la clase MegaCuadrado extends Cuadrado, en la sentencia constructora MegaCuadrado(), si no llamo a super(); nunca se definirian lo que esta escrito en el constructor Cuadrado() osea, contador, abajo, separar_mc no tendiran valor.

Por LongeVie

Claber

1741 de clabLevel

1 tutorial

Genero:Masculino  

En un lugar, re moto.

msie7
Citar            
MensajeEscrito el 08 Dic 2008 10:57 pm
descubri un error en tu script anterior pero veo que este es distinto
de todas maneras no me sirve, te cuento: imagina un muro formado por infinitos cuadrados, que uno puede navegar con el mouse dirigiendo el movimiento de los cuadrados, cuando el mouse va hacia arriba los cuadrados se mueven hacia abajo, cuando el mouse se mueve hacia la izquierda del escenario los cuadrados se mueven a la derecha.
entonces a mi no me sirve este segundo script, puesto que solo intenta cubrir la zona dejando los cuadrados estaticos en una posicion.

yo creo que hay que usar tu funcion, haciendo que no se cambie la posicion del clip original, que se duplique en todas las direcciones, que chequee si debe o no crear clips nuevos y a demas que se elimine a si mismo si esta fuera del escenario, creo que con esta funcion que acabo de hacer se puede hacer lo ultimo

Código :

private function eliminar():Void {
      if (this._x<(-this._width*2)) {
         this.removeMovieClip();
      }
      if (this._x>(Stage.width+(this._width*2)) {
         this.removeMovieClip();
      }
      if (this._y<(Stage.height+(this.height*2))) {
         this.removeMovieClip();
      }
      if (this._y>(-this.height*2)) {
         this.removeMovieClip();
      }

Por federomano

16 de clabLevel



Genero:Masculino  

Cordoba, Argentina

firefox
Citar            
MensajeEscrito el 08 Dic 2008 11:17 pm
Esto es algo que intente hacer pero con otra clase de funciones muy distintas, que hacen que las distancias entre los cuadrados no se repartan bien, y por eso estoy intentandolo de la manera en que hice la consulta


espero que te sirva para hacerte la idea

Por federomano

16 de clabLevel



Genero:Masculino  

Cordoba, Argentina

firefox
Citar            
MensajeEscrito el 08 Dic 2008 11:23 pm
ha ya te entendi, tu quieres un muro que simule ser infinito, y que esa supuesta infinidad sea apreciable cuando se mueve el mouse, entonces el Cuadrado en el onEnterFrame debe evaluar si esta dentro del area, de lo contrario se autoelimina, y entonces deberias tener otro clase que se llame Muro, que llene el Muro de cuadrados y evalue que siempre este llena, bueno, es lo que a mi se me ocurre, de todas formas, si necesitas que te ayude, mejor contactame por msn, que te parece? ya entendi masomenos lo que quieres.

Por LongeVie

Claber

1741 de clabLevel

1 tutorial

Genero:Masculino  

En un lugar, re moto.

msie7
Citar            
MensajeEscrito el 08 Dic 2008 11:27 pm
yo creo que no hace falta una clase que controle eso, talvez es demasiado complicado, no se puede hacer como estabamos planteandolo? (te mande un mp)

Por federomano

16 de clabLevel



Genero:Masculino  

Cordoba, Argentina

firefox
Citar            
MensajeEscrito el 08 Dic 2008 11:29 pm
Ok te agrego.

Por LongeVie

Claber

1741 de clabLevel

1 tutorial

Genero:Masculino  

En un lugar, re moto.

msie7
Citar            
MensajeEscrito el 09 Dic 2008 01:10 am
Hola, aqui esta la solucion, tambien tengo el fla, cuando me contactes te lo paso, nos vemos pronto.

Código :

class Cuadrado extends MovieClip 
{
   public static var limiteSuperior:Number = 0;
   public static var limiteInferior:Number = 550;
   public static var limiteIzquierda:Number = 0;
   public static var limiteDerecha:Number = 400;
   public static var espaciado:Number = 5;
   
   public var _x2:Number;
   public var _y2:Number;

   public function Cuadrado () 
   {
      super();
      //Si es el primero
      if( this._x2 == undefined && this._y2 == undefined )
      {
         this._x2 = 0;
         this._y2 = 0;
      }
      this._name = "X" + this._x2 + "Y" + this._y2;
   }
   
   private function onEnterFrame (Void)
   {
      //Si estoy fuera del limite
      if( !this.dentro() )
      {
         this.removeMovieClip();
         return;
      }
      
      var objetos:Array = new Array();
      //Arriba
      objetos[0] = { _x2:(this._x2), _y2:( this._y2 + 1) };
      //Abajo
      objetos[1] = { _x2:(this._x2), _y2:( this._y2 - 1) };
      //Adelante
      objetos[2] = { _x2:(this._x2 + 1), _y2:( this._y2 ) };
      //Atras
      objetos[3] = { _x2:(this._x2 - 1), _y2:( this._y2 ) };
      
      for( var i:Number = 0; i <= 3; i++ )
      {
         objetos[i]._name = "X" + objetos[i]._x2 + "Y" + objetos[i]._y2;
         //Si no existe ese objeto
         if( this._parent[ objetos[i]._name ] == undefined )
         {
            objetos[i]._x = this._x + ( (this._width + espaciado) * ( this._x2 - objetos[i]._x2 ) )
            objetos[i]._y = this._y + ( (this._height + espaciado) * ( this._y2 - objetos[i]._y2 ) )
            this._parent.attachMovie( "Cuadrado", objetos[i]._name, this._parent.getNextHighestDepth(), objetos[i]);
         }
      }
   }
   
   private function dentro( Void ):Boolean
   {
      var aux:Object = this.getBounds( this._parent );
      return aux.yMax > limiteSuperior && aux.yMin < limiteInferior && aux.xMax > limiteIzquierda && aux.xMin < limiteDerecha;
   }
}

Por LongeVie

Claber

1741 de clabLevel

1 tutorial

Genero:Masculino  

En un lugar, re moto.

msie7

 

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