Comunidad de diseño web y desarrollo en internet online

Un reto que tengo con la rotación de un MC

Citar            
MensajeEscrito el 16 Ene 2013 03:43 am
Hola amigos, tengo una duda, lo que sucede es que quiero que un objeto gire dentro de su eje, (registro), según su dirección...

Por ejemplo, tengo una ratón que recorre un mapa, entonces si presiono arriba el ratón va arriba, abajo, pues abajo, derecha a derecha e izquierda a izquierda...

Lo que sucede es que no logro hacer que este gire o rote según su dirección.

Logré hacer algo con su rotación, pero simplemente no funciona en su totalidad, quisiera saber que estoy haciendo mal o si tienen una solución simple que no he visto yo. Muchas gracias, dejo anexado mi código.

Código ActionScript :

maxvel = 10;
fric = 0.75;
acel = 0.5;
yvel = 0;
xvel = 0;
rot = 0;

onEnterFrame = function() {
   // Velocidad
   if (Key.isDown(Key.UP)) yvel -= maxvel*acel;
   else if (Key.isDown(Key.DOWN)) yvel += maxvel*acel;
   if (Key.isDown(Key.LEFT)) xvel -= maxvel*acel;
   else if (Key.isDown(Key.RIGHT)) xvel += maxvel*acel;
   // Haciendo fricción
   yvel *= fric;
   xvel *= fric;
   // Cambiando su rotación, he aquí el problema
   if (Key.isDown(Key.UP)) {
      if (Key.isDown(Key.LEFT)) rot = -45;
      else if (Key.isDown(Key.RIGHT)) rot = 45;
      else rot = 0;
   } else if (Key.isDown(Key.DOWN)) {
      if (Key.isDown(Key.LEFT)) rot = -135;
      else if (Key.isDown(Key.RIGHT)) rot = 135;
      else rot = 180;
   } else if (Key.isDown(Key.RIGHT)) rot = 90;
   else if (Key.isDown(Key.LEFT)) rot = -90;
   // Rotación en el símbolo
   raton_mc._rotation += (rot-raton_mc._rotation)/3;
   // Ratón y posición
   raton_mc._y += yvel;
   raton_mc._x += xvel;
};

Por peon007

40 de clabLevel



Genero:Masculino  

Programador & Dibujante

chrome
Citar            
MensajeEscrito el 16 Ene 2013 07:07 pm

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 16 Ene 2013 07:27 pm

solisarg escribió:

Mas que una cascada de if, se usa trigonometría, mirate este ejemplo: http://www.freeactionscript.com/2009/02/math-rotate-movieclips-toward-mouse/

Jorge


Se sobre la guía trigonométrica del mouse, lo que pasa es que no quiero que se guíe por el mouse, sino por su rotación se guíe según su dirección en el campo y quiero evitar completamente esta enorme if...

No sé si me logro expresar completamente.

Saludos y gracias por la respuesta rápida!

Por peon007

40 de clabLevel



Genero:Masculino  

Programador & Dibujante

chrome
Citar            
MensajeEscrito el 16 Ene 2013 07:29 pm
no quiero que se guíe por el mouse, sino por su rotación se guíe según su dirección en el campo


No entiendo ... ¿que gire de a 45 grados con las teclas?

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 16 Ene 2013 08:48 pm

solisarg escribió:

no quiero que se guíe por el mouse, sino por su rotación se guíe según su dirección en el campo


No entiendo ... ¿que gire de a 45 grados con las teclas?

Jorge


Hola, lo que quiero es que cuando va en dirección Arriba, el MC gire en dirección de arriba, cuando va a derecha gire a la derecha, izquierda a izquierda y abajo a abajo.

Espero ahora si darme a entender.

Por peon007

40 de clabLevel



Genero:Masculino  

Programador & Dibujante

chrome
Citar            
MensajeEscrito el 17 Ene 2013 01:20 pm
Por ejemplo esta condicion no se da nunca

if (Key.isDown(Key.UP)) {
if (Key.isDown(Key.LEFT)) rot = -45;

O Key.UP o Key.LEFT, nunca da true en ambas, si lo que quieres detectar es dos teclas al mismo tiempo, tienes que usar flags (booleanos) para saber si hay otra tecla que fue oprimida

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 17 Ene 2013 07:27 pm

solisarg escribió:

Por ejemplo esta condicion no se da nunca

if (Key.isDown(Key.UP)) {
if (Key.isDown(Key.LEFT)) rot = -45;

O Key.UP o Key.LEFT, nunca da true en ambas, si lo que quieres detectar es dos teclas al mismo tiempo, tienes que usar flags (booleanos) para saber si hay otra tecla que fue oprimida

Jorge


Hola, se que esto está incorrecto, pero fue hecho de manera provicional, pero gracias. Voy a intentarlo.

Por peon007

40 de clabLevel



Genero:Masculino  

Programador & Dibujante

chrome
Citar            
MensajeEscrito el 24 Ene 2013 02:38 am

solisarg escribió:

Por ejemplo esta condicion no se da nunca

if (Key.isDown(Key.UP)) {
if (Key.isDown(Key.LEFT)) rot = -45;

O Key.UP o Key.LEFT, nunca da true en ambas, si lo que quieres detectar es dos teclas al mismo tiempo, tienes que usar flags (booleanos) para saber si hay otra tecla que fue oprimida

Jorge


Resolví el problema, y pongo acá la solución para aquellos que vean el Post y tengan el mismo problema que yo tenía.

Resulta que el movimiento del símbolo no se debía medir según la presión de la tecla, sino según de su rotación, tenía que aplicar un poco de trigonometría, combinarla con su velocidad y después a la posición del MoveClip;

El códgo;

Código ActionScript :

fric = 0.96;
acel = 0.4;
med = 10;

ang = 0;
vel = 0;
maxvel = 10;

onEnterFrame = function (){
   raton();
}

function raton() {
   // Friccionamos la velocidad
   if (vel > 0) vel *= fric;
   else vel = 0;
   // Mover al Vehículo con las Teclas
   // Acelerar y Frenar al Vehículo
   if (Key.isDown(Key.UP) and vel < maxvel) vel += acel;
   else if (Key.isDown(Key.DOWN)) vel -= acel*2;
   // Girar a la Derecha e Izquierda
   if (Key.isDown(Key.LEFT) and vel > 0) {
      raton_mc._rotation -= med*(vel/maxvel);
   } else if (Key.isDown(Key.RIGHT) and vel > 0) {
      raton_mc._rotation += med*(vel/maxvel);
   }
   // Sacamos el ángulo del Vehículo
   ang = raton_mc._rotation;
   // Calculamos la velocidad según su ángulo
   velx = Math.sin(ang*(Math.PI/180))*vel;
   vely = Math.cos(ang*(Math.PI/180))*-vel
   // Lo aplicamos al Vehículo
   raton_mc._x += velx;
   raton_mc._y += vely;
}

Por peon007

40 de clabLevel



Genero:Masculino  

Programador & Dibujante

chrome
Citar            
MensajeEscrito el 24 Ene 2013 01:43 pm
Mas que una cascada de if, se usa trigonometría


Excelent !

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox

 

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