A ver, primero que nada quiero dejar en claro que no soy matemático ni físico (ni programador). Tengo 18 años, por lo que puedo asegurar que si yo lo pude hacer, cualquiera es capaz de hacerlo.
Los cálculos son muy simples. En primer lugar, si yo tengo una línea de 3 metros de alto con un ángulo de 30 grados respecto a la horizontal, calculo su largo en el eje x y en el y usando trigonometría:
Para el eje x: l * cos 30º = 2,598.. m
Para el eje y: l * sen 30º = 1,5 m
(donde l es el largo inicial de 3 metros)
Por lo tanto, si aplicamos esto al movimiento tenemos que si queremos mover algo 10 px por fotograma en un ángulo cualquiera, aplicamos éste código (recordá que los ángulos deben estar en radianes!):
Código :
var vel = 10;
var ang = Math.PI * Math.random ();
this.onEnterFrame = function () {
this._x += vel * Math.cos (ang);
this._y -= vel * Math.sin (ang);
};Además, en el eje y restamos porque el sistema de referencia con el que trabajamos está invertido en este eje (el cero está arriba).
Una vez que quedó eso claro, pasamos al siguiente punto, la detección de colisiones.
Como dije, todo es más fácil con círculos, ya que hay colisión si la distancia entre sus centros es menor (o igual) a la suma de sus radios. Esto debería ser muy obvio, por lo que no voy a insistir. En todo caso, te dejo el código para calcular la distancia:
Código :
distancia = function (mc1:Object, mc2:Object):Number {
var dx, dy;
dx = mc1._x - mc2._x;
dy = mc1._y - mc2._y;
return Math.sqrt (dx * dx + dy * dy);
};Ahora, la reacción a la colisión, lo que podés hacer (te lo dejo a vos porque no es nada difícil), es analizar el dibujo.
En caso de que te preguntes porqué no te doy el código ya hecho es simple, creo que la mejor manera de aprender es siendo un poco autodidacta.