jueves, 24 de noviembre de 2011

Movimiento circular y elíptico con AS3


Se puede utilizar las funciones seno y coseno en situaciones en las que se necesite un movimiento oscilante, pero de manera coordinada se puede utilizar las dos funciones juntas, como veremos en las siguientes líneas de código:
//movimiento circular
package{
 import flash.display.Sprite;
 import flash.events.Event;
 
 public class MovCircular extends Sprite{
  private var bola:Ball;
  private var angulo:Number=0;
  private var centroX:Number=150;
  private var centroY:Number=150;
  private var radio:Number=80;
  private var vel:Number=.1;
  
  public function MovCircular(){
   init();
  }
  public function init():void{
   bola =new Ball(20, 0x545454);
   addChild(bola);
   addEventListener(Event.ENTER_FRAME, onEnterFrame);
  }
  public function onEnterFrame(event:Event):void{
   
   bola.x=centroX+Math.sin(angulo)*radio;
   bola.y=centroY+Math.cos(angulo)*radio;
   //angulo = angulo + vel;
   angulo+= vel;
  }
 }
}
La clase circulo hace uso de una instancia ball (bola), definimos la posición de nuestro triángulo en 150px respecto al escenario, el radio del circulo por donde ball se desplaza es de 80px. Además tenemos una variable más que es la velocidad de desplazamiento que es de 0.1 Dentro de nuestra función oyente hacemos uso de las dos funciones seno y coseno, también se hace el incremento del ángulo respecto a la velocidad el resultado es este:

 

El rango en ambos casos será la hipotenusa del triángulo, que es igual al radio del circulo, se usa el coseno para obtener la posición “x” y se usa el seno para obtener la posición “y”, esta es una relación muy usada, de hecho cuando se habla del coseno se está refiriendo a x, y la posición y se usa junto con el seno.

Movimiento Elíptico

Haciendo algunas sencillas modificaciones a nuestro código se puede lograr este tipo de movimiento, modificando los rangos de movimiento X y Y del mismo, como podemos ver en este código


//Movimiento eliptico
package{
 import flash.display.Sprite;
 import flash.events.Event
 
 public class MovEliptico extends Sprite{
  private var bola:Ball;
  private var angulo:Number=0;
  private var centroX:Number=150;
  private var centroY:Number=150;
  private var radioX:Number=80;
  private var radioY:Number=40;
  private var vel:Number=.05;
    
  public function MovEliptico(){
   init();
  }
  public function init():void{
   bola=new Ball();
   addChild(bola);
   addEventListener(Event.ENTER_FRAME,onEnterFrame);
  }
  public function onEnterFrame(event:Event):void{
   bola.x=centroX+Math.sin(angulo)*radioX;
   bola.y=centroY+Math.cos(angulo)*radioY;
   angulo+=vel;
  }
 }
}

En este código existe modificaciones respecto al radio, definiendo dos variables independientes, con distintos valores, también para que el efecto sea mas vistoso rebaje la velocidad de la bola a .05; el efecto seria este :