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);
	}
}
Nov 10

Muchas veces, a lo largo de algunos desarrollos, nos es necesario crear funciones para manejo de números. Una muy particular es la conversión de radianes a grados, o viceversa. O tener que especificar grados en las funciones trigonómetricas, o calcular el ángulo entre puntos..etc.
Una buena solución, es crear una clase que extienda la clase Math..en mi caso utilizo una llamada Math2, a la cual le incorporo todos los métodos que se, usaré con frecuencia. Incluso de esta forma es posible utilizar todos los métodos de Math, aun en Math2, debido a la herencia.
Solo es necesario tener la clase Math2.as, dentro de la carpeta del proyecto, e importarla cuando es necesario.
El código de Math2.as es:

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
class Math2 extends Math { 
	static function rndBetween(n1:Number, n2:Number) { 
		return n1+random(n2-n1+1);  
 
	} 
	static function radToDeg(n:Number) { 
		return n*180/Math.PI;  
 
	} 
	static function degToRad(n:Number) { 
		return n/180*Math.PI;  
 
	} 
	static function degSin(n:Number) { 
		return Math.sin(n/180*Math.PI);  
 
	} 
	static function degCos(n:Number) { 
		return Math.cos(n/180*Math.PI);  
 
	} 
	static function degTan(n:Number) { 
		return Math.tan(n/180*Math.PI);  
 
	} 
	static function angleBetweenRad(x1:Number, y1:Number, x2:Number, y2:Number) { 
		return Math.atan2((y1-y2), (x1-x2));  
 
	} 
	static function angleBetweenDeg(x1:Number, y1:Number, x2:Number, y2:Number) { 
		return Math.atan2((y1-y2), (x1-x2))*180/Math.PI;  
 
	} 
	static function distanceBetween(x1:Number, y1:Number, x2:Number, y2:Number) { 
		return Math.sqrt(Math.pow((y1-y2),2)+ Math.pow((x1-x2),2));  
 
	} 
}

Cada función es bastante descriptiva en su nombre, random entre dos numeros, conversion de grados a radianes y viceversa, angulo entre dos puntos, distancia entre dos puntos, seno, coseno y tangente con grados decimales como parámetros, etc.
Una manera sencilla de comprobar la utilidad en el .FLA seria con el siguiente código:

1
2
3
4
5
6
7
8
9
10
import Math2; 
trace(Math2.rndBetween(2, 15)); 
trace(Math2.radToDeg(1.2)); 
trace(Math2.degToRad(360)); 
trace(Math2.degCos(90)); 
trace(Math2.degSin(90)); 
trace(Math2.angleBetweenRad(0, 0, 1, 1)); 
trace(Math2.angleBetweenDeg(0, 0, 1, 1)); 
trace(Math2.sin(90/180*Math2.PI)); 
trace(Math2.distanceBetween(0,0,1,1));

Lo mas importante es importar la clase (primera linea), luego pueden usar esta clase, como si fuera Math, pero con sus agregados.

Existe otra forma, mas formal, de realizar lo anterior, modificando el paquete util.Math.* , que pronto lo explicaré.

Nov 08

Están abiertas las inscripciones para el curso que dicto en la Ciudad de La Plata, denominado “Flash Expert”. Las clases comenzarán alrededor del 19 de Noviembre.
Si están interesados, pueden obtener mas informacion en http://www.trainingdivision.com.ar .
Los requisitos mínimos son tener cierta idea de la interface, conocer MovieClips, y alguna vez haber visto algo de código, aunque sea mediante un copy/paste. Es ideal para diseñadores Web, que desean hacer productos con mas complejidad sin depender de ejemplos prefrabicados, o de un programador.

Nov 07

En este ejemplo, la idea es generar un par de funciones de suma utilidad, que van a tener como objetivo, hacer que una movieClip siga a la otra. Al mismo tiempo, se emplea una restricción en cuanto a la distancia mínima que debe existir entre las dos movies.
El ejemplo requiere que en el root, existan dos Movies, con una forma circular, lo lo mas cercana posible a un circulo. Una movie tiene que tener nombre de instancia “mc1″ y la otra “mc2″.
Por otro lado, al utilizar funciones, ustedes pueden llamarlas con las movies que deseen y en la cantidad que ustedes quieran.
Les dejo el SWF, y acontinuación todo el código fuente, comentado.

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
factorReductor = 5;///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 
	seguir(mc2,mc1,(mc1._width/2)+(mc2._width/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         
 
}; 
///Funcion que calcula la distancia entre dos puntos en un plano 
function distancia(p1x, p2x, p1y, p2y) { 
	return Math.sqrt(Math.pow(p1x-p2x, 2)+Math.pow(p1y-p2y, 2)); 
}         
 
///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 = distancia(orig.x, dest.x, orig.y, 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 -= Math.cos(miAngulo)*(miDistancia/factorReductor); 
		mc._y -= Math.sin(miAngulo)*(miDistancia/factorReductor); 
	} else { 
		//En caso de estar en suporposiciòn, alejo la bola del destino con la misma distancia, pero sin ningun factor reductor, lo que nos da un alejamiento inmediato 
		mc._x -= Math.cos(miAngulo)*(miDistancia); 
		mc._y -= Math.sin(miAngulo)*(miDistancia); 
	} 
}

Codigo Fuente (FLA) CS3: ejemplozip.zip

Oct 11

 La semana pasada, comencé a trabajar como docente en TRAINING DIVISION (www.trainingdivision.com.ar). En el institudo, dicto las clases de “Flash Expert”, donde se cubren los principales fundamentos de programación en ActionScript 2.0, orientado a plataformas web.
 Proximamente subiré resumenes y algunos archivos fuentes de las prácticas realizadas en los cursos.

Todos los derechos reservados www.alejandroquarto.com queda prohibido la utilización de los contenidos en esta web para uso comercial.