Tutorial Flash: Mover un MovieClip en diagonal entre los puntos A y B
lashNo recuero la razón, pero esta mañana temprano pensé que necesitaba desplazar un MovieClip en Flash en diagonal, entre los puntos A y B, mediante ActionScript. Por supuesto el proceso es mucho más sencillo de lo que un perfecto inexperto como yo se temió… me temí… en un primer momento. Caray, ¡si incluso terminé buscando el viejo, obtuso y olvidado Teorema de Pitágoras! ¿Por qué?
Es fácil de entender, sobre todo si contamos con un gráfico que lo muestre en imágenes como el que he situado justo debajo de este párrafo. Se trata básicamente de que, cada vez que unimos dos puntos mediante una línea diagonal sobre un plano, obtenemos siempre un triángulo uno de cuyos ángulos es, por cierto, ángulo recto. El triángulo está constituido por dos catetos cuyas longitudes son fáciles de calcular mediante sencillas operaciones de Flash, más una hipotenusa –¡oh, cielos, eso no!– que es casi igual de fácil calcular partiendo de las longitudes de los catetos y utilizando la fórmula la suma del cuadrado de los catetos es igual al cuadrado de la hipotenusa, esto es, h2 = c2 + c2.
![teorema-pitagoras[11] teorema-pitagoras[11]](http://www.graficos101.com/wp-content/uploads/TutorialFlashMoverunMovieClipendiagonale_1252/teoremapitagoras11.png)
De modo que le di un par de vueltas al asunto, deseé que un cuervo viniese a sacarme los ojos y, a guisa de compensación, al menos saqué en claro una cosa: las longitudes de los lados de un triángulo, como se puede observar en la película inferior. Lástima que sólo reparé más tarde en la facilísima forma de desplazar un MovieClip en diagonal, y que tanto _x como _y lleguen a su destino casi al mismo tiempo. (Pues, de otro modo, lo que conseguimos es aproximar independientemente las coordenadas vertical y horizontal a sus destinos. Ver flash inferior: idealmente, el triángulo rojo debería ocupar todo el triángulo de borde negro.)
Calcular la hipotenusa de un triángulo haciendo uso de ActionScript no entraña ningún misterio. Veamos:
Hiponetusa2 = cateto2 + cateto2;
/* Math.pow(x,y) eleva el primer valor a la potencia expresada en el segundo valor. Por ejemplo:
cuatroCuadrado = Math.pow(4,2); trace(cuatroCuadrado) [16].*/
Hipotenusa2 = Math.pow(catetoA,2) + Math.pow(catetoB,2);
/* Math.sqrt(x) extrae la raíz cuadra de x. Por ejemplo: Math.sqrt(16) devuelve 4 (4*4=16).*/
Hipotenusa = Math.sqrt(Hipotenusa2);
Pero, como mencioné antes, averigüé un método tonto pero efectivo de resolver el problema sin necesidad de recurrir a los cálculos un poco más complejos del Teorema de Pitágoras. En un primer momento mi idea era recalcular alguna de las aristas del triángulo (esto es, uno de los catetos: o bien el eje X, o bien el eje Y), camino éste que no condujo a ninguna parte. El nuevo método me asaltó y, bueno, di un beso en la frente a Pitágoras y le sugerí que no volviese a aparecer en mi vida… jamás.
onClipEvent(load)
{
/* Establece aleatoriamente las coordenadas de destino: Math.random() crea un número al azar mayor que cero y menor que uno. Al multiplicarlo por 500 (el ancho de la película flash de muestra, ver arriba), obtenemos un número comprendido entre 0 y 500. Math.round() sencillamente lo redondea al número entero más cercano. En cualquier caso, podemos utilizar las coordenadas de destino que prefiramos, o calcularnas a nuestra conveniencia. */
destinoX = Math.round(Math.random()*500);
destinoY = Math.round(Math.random()*281);
/* La altura y la anchura son, de hecho, las longitudes de los catetos, pero ahora eso poco importa. La altura se calcula sustrayéndole a la posición del MovieClip la coordenada Y de su destino. Si, por ejemplo, el MovieClip se encuentra en la coordenada 100 y su destino en la 20, la altura es igual a 80. La anchura funciona de modo análogo en el eje X.*/
altura = this._y – destinoY;
anchura = this._x – destinoX;
}
onClipEvent(enterFrame)
{
/* En este ejemplo, el MovieClip se moverá verticalmente (eje Y) de pixel en pixel, y sólo se desplazará, como se ve en la siguiente condición, si su posición actual (this._y) es diferente de su destino (destinoY).
if (this._y != destinoY) {
/* La siguiente condición está formulada del modo menos amigable posible, aunque resulta un operador sumamente práctico:
(si se da la condición)? ocurre esto: si no, esto otro.
O lo que es lo mismo: si el destino de nuestro MovieClip está situado por debajo del propio MovieClip, entonces debemos moverlo hacia abajo, sumándole uno a uno hasta que las coordenadas coincidan. Por el contrario, si el destino está situado por encima del MovieClip, debemos restarle a este último, de modo que se desplace hacia arriba, hacia su destino. */
(destinoY > this._y)? z = 1: z = -1;
this._y = this._y + z;
(destinoY < this._y)? m = -1: m = 1;
/* He aquí lo más importante para mover diagonalmente nuestro MovieClip. Ya sabemos cómo desplazarlo en el eje Y; ahora necesitamos desplazarlo en X a una velocidad diferente, para que las coordenadas de destino (x, y) sean alcanzadas a la vez.
Como acabamos de ver, el MovieClip se desplaza pixel a pixel a lo largo del eje Y. Sin embargo, y siempre que la anchura y la altura contengan valores distintos, el espacio que debe recorrer el MovieClip para alcanzar su destino es diferente para X y para Y. Si Y se mueve píxel a píxel, X ha de moverse a un intervalo mayor o menor, pero no igual. Imaginemos por ejemplo a Pedro y Juan, quienes viajan en coche con intención de llegar a Madrid a la misma hora. Sin embargo, Juan partió desde Logroño, mientras que Pedro lo hizo desde Toledo, ambos en el mismo instante; dado que Logroño está mucho más lejos de Madrid que Toledo, Juan habrá de viajar a mayor velocidad a fin de cubrir mayor distancia en idéntico tiempo. Pues eso.
En este caso, la fórmula para desplazar el MovieClip a través del eje X es la siguiente: */
this._x = this._x + anchura/altura*m;
/* Como sabemos, la anchura equivale al desplazamiento de X, mientras que la altura lo hace al desplazamiento de Y. Al dividir anchura por altura, obtenemos el número de píxeles horizontales que equivalen al número de píxeles verticales. */
}
}
Y bien, básicamente esto es todo. Ahora ya disponemos al menos de un modo de desplazar diagonalmente un MovieClip a través del escenario de una película flash, e incluso aunque en este momento cause la sensación de que se trata de un conocimiento inútil, estoy convencido de que en el futuro podrá extraérsele alguna utilidad.
Nota introductoria: escribí este pequeño tutorial hace aproximadamente un año y ahora me pregunto para qué sirve. No obstante, lo subo a Graficos101 con la mejor intención.
![triangulo-rectangulo-altura-anchura[12] triangulo-rectangulo-altura-anchura[12]](http://www.graficos101.com/wp-content/uploads/TutorialFlashMoverunMovieClipendiagonale_1252/triangulorectanguloalturaanchura12.png)

