Comunidad de diseño web y desarrollo en internet online

Ayuda con la Trigonometría de un Juego de disparos.

Citar            
MensajeEscrito el 19 Oct 2007 01:45 pm
Disparen (dando click a la pelicula) para todas las direcciones y notaran el problema. Los disparos solo van hacia el lado derecho.

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;
      }
   }
}

Por AXM

Claber

705 de clabLevel

8 tutoriales

Genero:Masculino  

Bogotá

firefox
Citar            
MensajeEscrito el 19 Oct 2007 05:51 pm
yo de esto no entiendo nada, pero no deverias dividir por 360 en

angulo = angulo * Math.PI / 180;

no creo q ayude eo, debe ser mi ignorancia, pero bueno, lo intente.

Por frango

1 de clabLevel



 

firefox
Citar            
MensajeEscrito el 19 Oct 2007 09:25 pm

Por Zah

BOFH

4290 de clabLevel

27 tutoriales
5 articulos

  Bastard Operators From Hell Editores

Zaragoza, España

firefox
Citar            
MensajeEscrito el 20 Oct 2007 03:13 pm
Gracias, Zah, ya había visto tu tuto y aprendí varias cosas de él.

Lo solucione mirando mas detalladamente el ejemplo de Zguillez. Ahora lo posición final del tween es posX y posY.

Código :

      // En las próximas 20 lineas le damos la posición final a la bala
         var xcor         :Number      = Math.round   (   this.mouseX   -   cannon.x   );
         var ycor         :Number      = Math.round   ((   this.mouseY   -   cannon.y   ) * -1);
         var tangente      :Number      = ycor / xcor;
         var anguloradianes   :Number      = Math.atan(tangente);
         var diametro      :int      = 1200;
         var xMax = Math.round(diametro * Math.cos(anguloradianes));
         var yMax = Math.round(diametro * Math.sin(anguloradianes));
         var posX:int;
         var posY:int;

         if (xcor > 0)
         {
            posX = cannon.x + (xMax);
            posY = cannon.y - (yMax);
         }
         else
         {
            posX = cannon.x - (xMax);
            posY = cannon.y + (yMax);
         }

Por AXM

Claber

705 de clabLevel

8 tutoriales

Genero:Masculino  

Bogotá

firefox

 

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