Los movimientos de las balas las hago con Tween. La parte del codigo que hace que los disparos vaya hacia una dirección esta basada en el maravilloso ejemplo de Zguillez . Pero como no me acuerdo nada de trigonometria (en el colegio era muy bueno), lo único que hice fue un vergonzoso copy paste.
Aca pueden descargar el .fla y el .as
Estas son las lineas que le dan la posision final al disparo. xMax y yMax se las coloco luego al Tween
Código :
var xCor :Number = Math.round((this.mouseX - cannon.x)); var yCor :Number = Math.round((this.mouseY - cannon.y)); var tangente :Number = yCor / xCor; var anguloradianes :Number = Math.atan(tangente); var xMax :Number = Math.round((150*Math.cos(anguloradianes))+cannon.x); var yMax :Number = Math.round((150*Math.sin(anguloradianes))+cannon.y); movimientoDeBala = new Tween(bala, "y", null, bala.y, yMax, velociadad, false); movimientoDeBala = new Tween(bala, "x", null, bala.x, xMax, velociadad, false);
En la biblioteca del .fla hay un clip llamado BalaAzul y este esta vinculado como clase. El cañon se llama cannon. Aca pongo todo el codigo.
Código :
package
{
import flash.display.*;
import flash.events.*;
import fl.transitions.easing.*;
import fl.transitions.*;
public class DisparosMortales extends MovieClip
{
private var movimientoDeBala :Tween;
private var bala :BalaAzul
private var contenedorDeBalas :Sprite = new Sprite();
public function DisparosMortales()
{
stage.addEventListener (MouseEvent.CLICK, disparar );
stage.addEventListener (MouseEvent.MOUSE_MOVE, moverCannon );
this.addChild (contenedorDeBalas);
this.addChild (cannon);
}
private function disparar(e:MouseEvent):void
{
// Las siguientes 6 lineas las tome prestadas de un ejemplo de Zguillez.
// xMax y yMax la utilizo para darle la pocision final a la bala.
// Pero no como hacer para que no me inverta la direccion de las balas,
// cuando apunto a la izquierda.
var xCor :Number = Math.round((this.mouseX - cannon.x));
var yCor :Number = Math.round((this.mouseY - cannon.y));
var tangente :Number = yCor / xCor;
var anguloradianes :Number = Math.atan(tangente);
var xMax :Number = Math.round((150*Math.cos(anguloradianes))+cannon.x);
var yMax :Number = Math.round((150*Math.sin(anguloradianes))+cannon.y);
// Creamos la bala de un clip en la biblioteca, y despues la colocamos en un contenedor
bala = new BalaAzul();
contenedorDeBalas.addChild (bala);
// En las siguientes 4 Lineas hacemos que la bala salga por la boca del cañon
var angulo :Number = cannon.rotation;
angulo = angulo * Math.PI / 180;
bala.x = cannon.x + 40 * Math.cos(angulo);
bala.y = cannon.y + 40 * Math.sin(angulo);
// En las siguientes 3 lineas, hacemos que la bala se mueva con el tween
// El problema esta en xMax y yMax
var velociadad :int = 5;
movimientoDeBala = new Tween(bala, "y", null, bala.y, yMax, velociadad, false);
movimientoDeBala = new Tween(bala, "x", null, bala.x, xMax, velociadad, false);
}
// Funcion que hace que el cañon se mueva su angulo dependiendo de la posicion del mouse
public function moverCannon(e:MouseEvent):void
{
var xRefe :Number = root.mouseX - cannon.x;
var yRefe :Number = root.mouseY - cannon.y;
var angulo :Number = Math.atan2(yRefe, xRefe);
angulo = angulo * 180 / Math.PI;
cannon.rotation = angulo;
}
}
} 