Comunidad de diseño web y desarrollo en internet online

FL@B´s: Centros de Rotación Dinamicos en MCs + Inercia

Citar            
MensajeEscrito el 05 Dic 2008 05:24 am
Bueno, esto de modificar los puntos de rotación dinámicamente en un MC, en este caso por acción del mouse me surgió por un antiguo post de ClipdePelicula, que aunque no encontré como hacerlo de manera limpia como la sugerencia de Teseo, y en AS3...

Investigue y encontré otra manera un poco mas sucia que pude aprovechar para uno de mis Tips.! Por ello dejo aquí el código que emplee... Y de paso ensucio la BD de Clab con mis cosas:

Edit: Quite un pedazo con variables que ni el FSM utilizaba, y ademas agregue otras que no había declarado desde un principio por lo que devolvía error.
Edit2: Elimine un montón de variables sin sentido, ademas de redundancias en el código. Gracias por la iniciativa Bleend !
Edit3: Quite algunas variables mas (see, mas aun), que ni siquiera se utilizaban, no mucho al menos

Código ActionScript :

var mxx:Number, my:Number, mx0:Number, my0:Number, dmx:Number, dmy:Number;
var addx:Number, addy:Number, inx:Number, iny:Number;
var vr:Number, torque:Number, vx:Number, vy:Number;
var r:Number, m:Number = 1, b:Number = 1.2;
var time_mode:Boolean = false;
var mode:Boolean = false;
//
inx = object.x;
iny = object.y;
r = object.rotation;
vr = torque = vx = vy = addx = addy = 0;
//
object.addEventListener(MouseEvent.MOUSE_DOWN, mouse_down);
function mouse_down(enter:MouseEvent){time_mode = mode = true;}
//
stage.addEventListener(MouseEvent.MOUSE_UP, mouse_up);
function mouse_up(enter:MouseEvent){mode = false; time_mode = true;}
//
addEventListener(Event.ENTER_FRAME, enter_frame);
function enter_frame(event:Event){
   if(mode){if(time_mode){
      time_mode = false;
      mx0 = mxx = mouseX;
      my0 = my = mouseY;
      dmx = dmy = 0;}else{
         my =  (mouseY+my)/2;
         mxx = (mouseX+mxx)/2;
         dmx = mxx-mx0;
         dmy = my-my0;
         mx0 = mxx;
         my0 = my;}
         //
      var fx:Number = (dmx-vx)*m;
      var fy:Number = (dmy-vy)*m;
      var ldx:Number = mxx-inx;
      var ldy:Number = my-iny;
         //
      if(fx == 0){
         var mlength:Number = ldx;
         var mforce:Number = fy;
         torque = mforce*mlength;}else if(fy == 0){
            mlength = ldy;
            mforce = fx;
            torque = -(mforce)*mlength;}else{
               var k:Number = fy/fx;
               var kx:Number = (-(k)*k*ldx+k*ldy)/(-(k)*k-1);
               var ky:Number = k*(kx-ldx)+ldy;
               mlength = Math.sqrt(kx*kx+ky*ky);
               mforce = Math.sqrt(fx*fx+fy*fy);
            //
         if(fx*ky>0){torque = -(mforce) * mlength;}else{torque = mforce * mlength;}}
      //
      vx = dmx;
      vy = dmy;
      inx += vx;
      iny += vy;
      vr = vr-torque / 900;
      ldx = mxx-inx;
      ldy = my-iny;
      var cos = Math.cos(vr/180 * Math.PI);
      var sin = Math.sin(vr/180 * Math.PI);
      addx = ldx*cos+ldy*sin-ldx;
      addy = -(ldx)*sin+ldy*cos-ldy;
      inx -= addx;
      iny -= addy;}else{if(time_mode){time_mode = false; vx -= addx; vy -= addy;}
      //
      torque = addx = addy = 0;
      inx += vx;
      iny += vy;}
      //
   object.rotation -= vr; //}
   object.x = inx;
   object.y = iny;
   vx /= b;
   vy /= b;
   vr /= b;};


Igual no esta de mas aclarar que el MC del stage al que dirigimos las acciones se tiene un nombre de instancia "object".

Por M@U

BOFH

6210 de clabLevel

34 tutoriales
5 articulos

Genero:Masculino   Héroes Bastard Operators From Hell Editores



Ultima edición por M@U el 14 Dic 2008 07:36 pm, editado 4 veces

Bate jubilado de Cristalab

firefox
Citar            
MensajeEscrito el 14 Dic 2008 04:56 pm
Hay muchas variables sin declarar... Dan error.

Por Bleend

Claber

3385 de clabLevel

10 tutoriales
4 articulos

Genero:Masculino   Héroes

Barcelona

firefox
Citar            
MensajeEscrito el 14 Dic 2008 06:13 pm

Bleend escribió:

Hay muchas variables sin declarar... Dan error.
Juas ! ¿Enserio?, ya las revise... Olvide un renglón que tenia que estar hasta arriba con unas 6 variables dentro... Y pueees, el error era inminente.
:lol:

Gracias Bleend, igual quizá aun hayan variables que no utilizo... Esbozos de otro code del Tip en su mayoría. Como sea, el código correcto lo deje en reemplazo al anterior.

Por M@U

BOFH

6210 de clabLevel

34 tutoriales
5 articulos

Genero:Masculino   Héroes Bastard Operators From Hell Editores

Bate jubilado de Cristalab

firefox
Citar            
MensajeEscrito el 14 Dic 2008 06:42 pm

M@U escribió:

Código ActionScript :

mxx = mouseX;
my = mouseY;
mx0 = mxx;
my0 = my;
dmx = mxx-mx0;
dmy = my-my0;
Err...

Código ActionScript :

mx0 = mxx = mouseX;
my0 = my = mouseY;
dmx = 0;
dmy = 0;
Confunde menos... no? :?

Por Bleend

Claber

3385 de clabLevel

10 tutoriales
4 articulos

Genero:Masculino   Héroes

Barcelona

firefox
Citar            
MensajeEscrito el 14 Dic 2008 06:49 pm

Bleend escribió:

Err...

Código ActionScript :

mx0 = mxx = mouseX;
my0 = my = mouseY;
dmx = 0;
dmy = 0;
Confunde menos... no? :?

+1

JaJaJa... Muy buena ! Así habían muchos en el código original, limpie varias situaciones cómicas como esa, de nuevo gracias !
:lol:

Por M@U

BOFH

6210 de clabLevel

34 tutoriales
5 articulos

Genero:Masculino   Héroes Bastard Operators From Hell Editores

Bate jubilado de Cristalab

firefox
Citar            
MensajeEscrito el 14 Dic 2008 06:59 pm
Bien, daré limpieza aunque tenia otras cosas planeadas para hacer ahorita, pero bueno.

Primero:
  • Los casos similares a "vx = vx/b;", cambiarlos a "vx /= b;".
  • Los similares a "vx = vx-(addx);", mudarlos a "vx -= (addx);".
  • En el fondo, "r -= vr; object.rotation = r;" trabaja mejor solo como " object.rotation -= vr;".
  • ¿Que rayos es "if(time_mode == 1){time_mode = 0;}"?, ahora sera un operador Boolean.
  • Casi lo mismo pasa con "modo", con la diferencia de que tiene mas de dos estados, lo que lo imposibilitaria para convertirse a Boolean, pero bueno... El otro es imposible que se ejecute, así es que esta eliminado y reemplazado por Boolean.
  • Observando la variable "originr", note que en ninguna parte desempeña algún papel importante. Eliminada.
  • Caso parecido al anterior con la variable "min", y con "inercia".
  • JaJa... Ni que decir de "inx += -(addx);", ahora es "inx -= addx;".
  • "originx" y "originy", cuello.


Van 12 lineas menos.

Por M@U

BOFH

6210 de clabLevel

34 tutoriales
5 articulos

Genero:Masculino   Héroes Bastard Operators From Hell Editores

Bate jubilado de Cristalab

firefox
Citar            
MensajeEscrito el 08 May 2009 11:48 pm
Por cierto... para comprender el código parece que hay que tener cierta idea de física. Más o menos puedo comrobar que se utilizan fórmulas que se aplica a "los momentos de fuerza". En definitiva, que no resulta sencillo comprender el código en un vistazo. :?
A ver si alguien con más idea podría echarme una manilla con partes del código como:

Código :

k = fy/fx; 
kx = (-(k)*k*ldx+k*ldy)/(-(k)*k-1); 
ky = k*(kx-ldx)+ldy; 
mlength = Math.sqrt(kx*kx+ky*ky);


y también...

Código :

cos = Math.cos(vr/180 * Math.PI); 
sin = Math.sin(vr/180 * Math.PI); 
addx = ldx*cos+ldy*sin-ldx; 
addy = -(ldx)*sin+ldy*cos-ldy;


Muchas gracias desde ya! :wink:


P.D: Lo necesito para un proyecto fin de carrera.

Por jesusmmago

16 de clabLevel



 

firefox

 

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