Comunidad de diseño web y desarrollo en internet online

Problemas con escalado de movieClip animado en actionScript

Citar            
MensajeEscrito el 28 Ene 2009 06:49 pm
Wenas,

Vengo leyendo cristalab desde que mi profe de flash me lo recomendó como gran pozo de sabiduría XD Y hoy me surgió una duda que estoy segura alguno de vosotros, más expertos que yo, seguro que me podréis resolver.

El caso es que ahora estoy intentando hacer un juego en actionscipt 3 y me he encontrado con un problema muy raro.
El juego se basa en ir por una calle con sus casas y los buzones. Con lo que los buzones se van desplazando de arriba a bajo como si fuera que paseas por la calle y vas dejando atras los buzones.

Para ello tengo un movieclip de un buzon, el cual se descompone como si le dieran un golpe. Creo varías instancias de tipo buzón y las desplazo hacia abajo de la pantalla conforme muevo el personaje. Hasta aquí bien.

El problema viene cuando, al estar en perspectiva la calle, hago que los buzones sean mas pequeños cuando aparecen por el horizonte y se van haciendo mas grande conforme se acercan. Para ello empleo el atributo scaleX y scaleY, pero nose pq el moviclip aumenta de tamaño pero sin moverse del sitio o se invierte en cuanto avanzo un poco.

El codigo que empleo es el siguiente:
La logica del juego:

Código ActionScript :

      function moverObjetos(event:Event) {
         var velocidad:Number = 2;
         var velocidad2:Number = 1;
         //Movemos el coche segun la tecla que se halla pulsado
         if (flechaIzq) {
            icoche.moverIzq(velocidad);
         } else if (flechaArriba) {
            icoche.moverArriba(velocidad);
            //segun se aleja hacemos el coche mas pequeño
            icoche.reEscalar(-0.01);
            //movemos los buzones havia abajo se hacen menores
            for (var i:int = 0; i<4; i++) {
               buzones[i].moverAllAbajo(velocidad2);
               buzones[i].reEscalar(-0.1);
            }

         } else if (flechaDer) {
            icoche.moverDer(velocidad);
         } else if (flechaAbajo) {
            icoche.moverAbajo(velocidad);
            //segun se acerca hacemos el coche mas grande
            icoche.reEscalar(0.01);
            //movemos los buzones havia arriba se hacen mayores
            for (i = 0; i<4; i++) {
               buzones[i].moverAllArriba(velocidad2);
               buzones[i].reEscalar(+0.1);
            }
         }
      }

Y las funciones del objeto buzon implicadas son:

      public function reEscalar(escala:Number) {
         if ((this.scaleX > 0.0) && (this.scaleY > 0.0)) {
            this.scaleX += escala;
            this.scaleY += escala;
         }
      }

      public function moverAllAbajo(velocidad: Number) {
         //Buzon de la acera izquierda
         if (this.posIzq) {
            this.moverIzq(velocidad);
         } else {//Si esta en la acera derecha
            this.moverDer(velocidad);
         }
         this.moverAbajo(velocidad);
      }

      public function moverAllArriba(velocidad: Number) {
         //Buzon de la acera izquierda
         if (this.posIzq) {
            this.moverDer(velocidad);
         } else {//Si esta en la acera derecha
            this.moverIzq(velocidad);
         }
         this.moverArriba(velocidad);
      }

He aislado las líneas que dimensionan el buzón y entonces estos se desplazan correctamente, por lo que el error tiene que estar en el reEscalado, pero la vdd es que se me escapa. A ver si alguien me puede hechar una anita, gracias:D

Por RaRaton

20 de clabLevel



 

Madrid - SPAIN

firefox
Citar            
MensajeEscrito el 28 Ene 2009 10:20 pm
Estas seguro que el "this" hace referencia al objeto correcto en reEscalar?? pon algunos trace por alli poruqe si le da la vuelta al objeto esque la escala llego a ser menor que cero y veo que proteges eso antes de moverle ala escala,me supongo que el coche tiene una clase con el metodo reEscalar y buzones un metodo similar podrias intentar dejar un solo metodo que reciba como parametro el objeto a reEscalar:

Código ActionScript :

///puse movieclip por ser el mas comun pero puedes poner un DisplayObject o un Object
public function reEscalar(escala:Number,obj:MovieClip) {
if ((obj.scaleX > 0.0) && (obj.scaleY > 0.0)) {
obj.scaleX += escala;
obj.scaleY += escala;
}
}
///y lo llamas asi
reEscalar(+0.1,buzones[i]);


Digo esto pensando que el "this" sea tu problema si no lo es ps....ignorame sin remordimientos XD

Por Angel Roberto

Claber

248 de clabLevel



 

firefox
Citar            
MensajeEscrito el 28 Ene 2009 11:50 pm
Gracias Angel, voy a probar a hacerlo, creo que funcionará.
La vdd es que es raro, pq lo he probado solo dejando un buzón y si rula, en fin algo se me debe escapar jaja
Ya comentaré por aki, gracias

Por RaRaton

20 de clabLevel



 

Madrid - SPAIN

firefox
Citar            
MensajeEscrito el 29 Ene 2009 08:25 am

RaRaton escribió:

pero nose pq el moviclip aumenta de tamaño pero sin moverse del sitio o se invierte en cuanto avanzo un poco.

Tienes escrito:

Código ActionScript :

      public function reEscalar(escala:Number) {
         if ((this.scaleX > 0.0) && (this.scaleY > 0.0)) {
            this.scaleX += escala;
            this.scaleY += escala;
         }
      }

Realmente debería ser

Código ActionScript :

      public function reEscalar(escala:Number) {
         if ((this.scaleX+escala > 0.0) && (this.scaleY+escala > 0.0)) {
            this.scaleX += escala;
            this.scaleY += escala;
         }
      }

Pues, de otro modo, si la scaleX es 0 y le pasas un valor negarivo, pasará por el "if" y te "invertirá" el buzón (un valor negativo de la escala realiza un "flip" horizontal o vertical)

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 29 Ene 2009 01:52 pm
Gracias Eliseo2,
Joe, vaya problema tonto jaja Ni lo habia visto:S Por eso me gusta trabajar en grupoXD
Muchas gracias, ya se solventó.

Por RaRaton

20 de clabLevel



 

Madrid - SPAIN

firefox

 

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