Nov 11
En este ejemplo vamos a tratar de ampliar el primer ejemplo, para lograr una interacción mas compleja. La idea es que las “bolas” no se superpongan unas con otras, ya que ahora hay mas de dos bolas, necesitamos chequear una por una contra la otra. Es un procedimiento bastante demandante de CPU, pero se logran buenos resultados rapidamente.
Como es una continuación del primer ejemplo, recomiendo observar primero el mismo Ejemplo Anterior.
Por otro lado, estamos usando una clase que contiene algunas funciones númericas necesarias que se crearon en otro ejemplo: Clase útil para funciones númericas
Espero les sea útil.
Source CODE: ejemplobolas.zip
This movie requires Flash Player 8
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | import Math2; factorReductor = 4;///Factor que determina la fuerza con la cual se acerca un objeto al otro this.onEnterFrame = function() { mc1._x = _root._xmouse;///Una de las bolas sigue al mouse, en este caso en el eje X mc1._y = _root._ymouse;///Una de las bolas sigue al mouse, en este caso en el eje Y for (i=1; i<=7; i++) { a = i+1; seguir(_root["mc"+a],_root["mc1"],(_root["mc1"]._width/2)+(_root["mc"+a]._width/2)+2);///Llamo a la función que acerca una Movie a la otra, primer parametro: Mc a mover, segundo: Mc de destino, tercero: distancia minima permitida entre los objetos for (j=1; j<=7; j++) { mantenerDistancia(_root["mc"+i],_root["mc"+j],(_root["mc"+i]._width/2)+(_root["mc"+j]._width/2)+1);///chequeo entre todas las bolas que no se estén superponiendo unas con otras. } } }; ///Funcion que realiza el acercamiento de una MC hacia otra function seguir(mc, destino, distanciaMinima) { orig = {x:mc._x, y:mc._y};////Determino el punto determinado por la MC a mover dest = {x:destino._x, y:destino._y};////Determino el punto que representa la MC de de destino miAngulo = Math.atan2((orig.y-dest.y), (orig.x-dest.x));///Calculo el angulo entre dichos dos puntos miDistancia = Math2.distanceBetween(orig.x, orig.y, dest.x, dest.y)-distanciaMinima;////Calculo la distancia entre los dos puntos y le resto la distancia minima del tercer parametro ///Aca se controla si la MC a mover se acercò demasiado a destino, de no ser asi, la acerco utilizando trigonometria (coseno sobre X y seno sobre Y) if (miDistancia+distanciaMinima>distanciaMinima) { mc._x -= Math2.cos(miAngulo)*(miDistancia/factorReductor); mc._y -= Math2.sin(miAngulo)*(miDistancia/factorReductor); } } function mantenerDistancia(obj1, obj2, dist) { orig = {x:obj1._x, y:obj1._y};////Determino el punto determinado por la MC a mover dest = {x:obj2._x, y:obj2._y};////Determino el punto que representa la MC de de destino miAngulo = Math.atan2((orig.y-dest.y), (orig.x-dest.x));///Calculo el angulo entre dichos dos puntos miDistancia = Math2.distanceBetween(orig.x, orig.y, dest.x, dest.y)-dist;////Calculo la distancia entre los dos puntos y le resto la distancia minima del tercer parametro if (miDistancia+dist<dist) {/////Si estan superpuestas las movies, las alejo en forma pareja a ambas en el sentido contrario. obj1._x -= Math2.cos(miAngulo)*(miDistancia/2); obj1._y -= Math2.sin(miAngulo)*(miDistancia/2); obj2._x += Math2.cos(miAngulo)*(miDistancia/2); obj2._y += Math2.sin(miAngulo)*(miDistancia/2); } } |
Leave a Reply
You must be logged in to post a comment.
