Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
En una pelcula de Flash, al igual que en otros muchos lenguajes de programacion, cuando estamos trabajando en dos diemnsiones (2D), disponemos de la capacidad de ubicar objetos en un determinado tapiz o canvas, mediante el uso de las propiedades _x e _y del propio objeto. Cocretamente en Flash, son las propiedades de un determinado clip de pelcula. En una pelcula de Flash, al igual que en otros muchos lenguajes de programacion, cuando estamos trabajando en dos diemnsiones (2D), disponemos de la capacidad de ubicar objetos en un determinado tapiz o canvas, mediante el uso de las propiedades _x e _y del propio objeto. Cocretamente en Flash, son las propiedades de un determinado clip de pelcula. Sin embargo, el sistema de coordenadas en Flash, al igual que otros muchos lenguajes de programacin, no funciona como un plano cartesiano. Muestra una pequea diferencia, pero suficientemente importante, y es que invierten el eje Y, es decir los valores positivos de la coordenada Y, fluyen en direccin opuesta a un plano cartesiano, hacia abajo de la pantalla. Adems el origen de coordenadas (el punto 0,0), se situa en la parte superior-izquierda de la ventana principal.
Velocidad
La velocidad es una magnitud fsica de carcter vectorial que expresa el desplazamiento de un objeto por unidad de tiempo. Se la representa por Sus dimensiones son [L]/[T]. Su unidad en el Sistema Internacional es el m/s. Esta propiedad de algo que se mueve es la velocidad. Muchas personas comparan la velocidad a largo plazo con la velocidad. Eso es parte de ella, pero slo una parte. El concepto de velocidad contiene un segundo factor muy importante: la direccin. Y eso es ms o menos nuestra definicin del laico para la velocidad: la velocidad en una direccin particular. Vamos a echar un vistazo a exactamente cmo esta definicin difiere de velocidad simple.
La parte de la velocidad que se define generalmente en trminos de pixeles por cuadro (PxF). En otras palabras, si un clip de pelcula en un momento determinado, ya que entra en un marco, que va a ser tantos pxeles de distancia de ese punto en el final de la trama. En la mayora de los casos, con pxeles por cuadro funciona bien, y es sin duda el ms simple de programar. Sin embargo, debido a la naturaleza inestable de las velocidades de fotogramas en Flash, con pxeles por imagen puede hacer que su animacin ms lento en ciertos momentos, cuando mucho est sucediendo, hay mucho para calcular, o la CPU est ocupado haciendo otra cosa. Si se programa algn tipo de juego o simulacin en la que es crucial
que el producto de animacin a un ritmo muy uniforme, es posible que desee utilizar un intervalo de animacin basada en su lugar.
Vectores y velocidad
Un vector es algo que tiene magnitud y direccin. En el caso de la velocidad, la magnitud es la velocidad. Vectores se dibujan como flechas. La longitud de la flecha es la magnitud y la direccin de la flecha apuntan la direccin del vector.
Velocidad en un eje:
Mediante la limitacin de velocidad a un solo eje: el eje x, o el movimiento horizontal. Esto es que la direccin es de cero grados, al este, o desde el lado izquierdo de la pantalla a la derecha de la pantalla como quiera que mires. La velocidad es slo el nmero de pxeles que se mueve en esa direccin cada fotograma. Por lo tanto, si digo que la velocidad en el eje x es de 5, es decir que el objeto se mueve 5 pxeles cada fotograma de izquierda a derecha. Esto tambin significa que la velocidad es de -5 en el eje x, se mover de derecha Se usar el identificador vx para representar la velocidad en el eje x, y vy a la velocidad en el eje y vx positivo significa a la derecha, y -vx negativo significa que a la izquierda. Vy positivo significa hacia abajo, y -vy negativo significa arriba. Para la velocidad en un eje, slo tiene que aadir la velocidad a la posicin del objeto en dicho eje. Sea cual sea su vx es, se agrega a la propiedad _x del objeto en cada cuadro. //ejemplo 01 var vx:Number=5 //velocidad de x onEnterFrame = function(){ cuadrado._x=cuadrado._x+vx; }
Limitacin de pantalla:
var vx:Number=-9; //velocidad de x var vy:Number=3; //velocidad de y var anchocuadrado:Number = 82; var altocuadrado:Number = 82; onEnterFrame=function(){ cuadrado._x+=_x+vx; cuadrado._y+=_y+vy; trace(cuadrado.width); //invertimos el valor del movimiento if (cuadrado._x <0){ cuadrado._x=0; vx=vx * -1; } else if (cuadrado._x > Stage.width anchocuadrado){ cuadrado._x = Stage.width anchocuadrado; vx=vx* -1; } //invertimos el valor del movimiento if (cuadrado._y <0){ cuadrado._y=0; vy= vy * -1; }
6
else if (cuadrado._y > Stage.height- altocuadrado){ cuadrado._y = Stage.height - altocuadrado; vy= vy * -1; } }
Velocidad angular
Al dar dos velocidades diferentes en dos direcciones diferentes., si slo tiene un valor para la velocidad y el ngulo de direccin, por la definicin. Digamos que usted quiere que algo se mueva en un ngulo de 45 grados y una velocidad de 3 pxeles por imagen. Como se muestra en la figura, tenemos un tringulo rectngulo, con un ngulo y se define la hipotenusa. Tenga en cuenta que las dos lneas del tringulo que se encuentran en los ejes X e Y. De hecho, la lnea que se encuentra en el eje x es igual a la distancia que el punto se va a mover en el eje x. Lo mismo ocurre con la lnea en el eje y. Recuerde que en un tringulo rectngulo, si se tiene uno de los lados y un ngulo, se puede encontrar todo lo dems, teniendo en cuenta los 45 grados y la hipotenusa de 3 pxeles, debe ser capaz de utilizar Math.cos y Math.sin para encontrar las longitudes de vx y vy. El lado adyacente al ngulo es vx. El coseno de un ngulo es el adyacente / hipotenusa. O, dicho de otro modo, el lado adyacente es el coseno del ngulo de los tiempos de la hipotenusa. Del mismo modo, el lado opuesto se vy. Seno es opuesto / hipotenusa, o lo opuesto es la hipotenusa seno veces. //ejemplo movimiento angular var velocidad:Number=3;
var angulo:Number = 45; //covertiendo radianes =(angulo * Math.PI)/180; function onEnterFrame(){ vx = velocidad * Math.cos(radianes); vy = velocidad * Math.sin(radianes); trace(vx +" "+vy); balon._x = balon._x+vx; balon._y = balon._y+vy; }
Vector Adicin
La suma de vectores es cuando usted tiene dos vectores de trabajo en un sistema y que desea encontrar el vector global resultante. Aqu, usted tiene un vector en el eje x, otro vector en el eje y, y un vector de la velocidad en general. Agregar vectores simplemente colocndolos junto al inicio o final. El vector resultante es la lnea que usted puede llamar desde el punto de partida del primer vector de la cadena hasta el punto final de la ltima. //Ejemplo bsico de adicin Velocidad = 5; velocidad = 5; function onEnterFrame(){ dx = _xmouse - flecha._x; dy =_ymouse - flecha._y;
angle = Math.atan2(dy, dx); flecha._rotation = angle * 180 / Math.PI; vx = Math.cos(angle) * velocidad; vy = Math.sin(angle) * velocidad; flecha._x += vx; flecha._y += vy; } Si bien esto es un efecto bastante complejo, no debe haber algo aqu que no entienden por completo por ahora. Que est recibiendo la distancia x y la distancia y al ratn, y de que el uso de Math.atan2 para obtener el ngulo que se forma. Utilizar ese ngulo para girar la flecha, y el uso de Math.cos y Math.sin junto con la velocidad para encontrar la x y la velocidad y. Por ltimo, va a aadir la velocidad a la posicin.
Aceleracin
Existen muchas similitudes entre la velocidad y la aceleracin en cuanto a la forma en que se describen. Ellos son los dos vectores. Al igual que la velocidad, la aceleracin es descrito como un valor y una direccin. En trminos puramente ActionScript, se puede decir que la aceleracin es un valor que se agrega a una propiedad de la velocidad. He aqu otro ejemplo. Digamos que tienes una nave espacial que tiene que ir de planeta en planeta A B. Su direccin ser cualquier direccin planeta B pasa a ser en relacin con el planeta A. Se apunta en esa direccin y dispara sus cohetes. Mientras los cohetes estn disparando, la fuerza se est aplicando a la nave, y
10
su velocidad va a cambiar. En otras palabras, la nave espacial seguir cada vez ms rpido.
11
En este ejemplo vamos a permitir que la bola acelere de vez en cuando, e incluso revertirlo. Puede utilizar las teclas del cursor para esto. //ejemplo de aceleracin con teclas vx = 0; ax = 0.2; bola._x = Stage.width / 2; bola._y = Stage.height / 2; function onEnterFrame():Void { if (Key.isDown(Key.LEFT)) { vx -= ax; } else if (Key.isDown(Key.RIGHT)) { vx += ax; } bola._x += vx; }
12
Los controles para las teclas de cursor arriba y abajo La aceleracin de la derecha a la velocidad es la correcta La velocidad a la posicin del eje correspondiente Ejemplo: vx = 0; vy = 0; ax = 0.2; ay = 0.2; bola._x = Stage.width / 2; bola._y = Stage.height / 2; function onEnterFrame():Void { if (Key.isDown(Key.LEFT)) { vx -= ax; } else if (Key.isDown(Key.RIGHT)) { vx += ax; } if (Key.isDown(Key.UP)) { vy -= ay; } else if (Key.isDown(Key.DOWN)) { vy += ay; } bola._x += vx; bola._y += vy; }
13
Aceleracin Angular
Recordando el ejemplo del raton y hacer que funcione con la aceleracin. Recuerde que en ejemplos anteriores, se tom el ngulo de la flecha con el ratn y lo usaron para determinar vx y vy. Esta vez, vamos a usar los mismos clculos, pero los emplean para determinar Ax y Ay en su lugar. A continuacin, vamos a aadir los valores de aceleracin para los valores de velocidad y los valores de velocidad de las propiedades _x e _y. //ejemplo aceleracin angular fuerza = 0.5; vx = 0; vy = 0; flecha._x = Stage.width / 2; flecha._y = Stage.height / 2; function onEnterFrame() { dx = _xmouse - flecha._x; dy = _ymouse - flecha._y; angulo = Math.atan2(dy, dx); flecha._rotation = angulo * 180 / Math.PI; ax = Math.cos(angulo) * fuerza; ay = Math.sin(angulo) * fuerza; vx += ax; vy += ay; flecha._x += vx; flecha._y += vy; }
Frenado
14
La ecuacin del frenado es x=(x-b)/2, donde el valor de A es remplazado por x, el cual se desplaza la mitad de cada mitad de la distancia recorrida hasta llegar al punto b, que ser donde se detenga el objeto el valor de 2, cuando ms se aproxime a 1 ser un frenad ms rpido y cuando se aleje lo inverso.
//ejemplo Xfinal = Stage.width; frenado = 20; A onEnterFrame = function(){ X =(Xfinal - bola._x)/frenado; bola._x = bola._x +X; trace (X); } // Muestra la continuidad de la ecuacin //bola.duplicateMovieClip("bola"+bola,getNextHighestDepth());
X=
Adicion de velocidad:
vx += ax;
15
vy += ay;
16
Movimiento senoidal
Para entender el tema antes debemos analizar la funcin seno, utilizando el valor mximo y mnimo para generar un rebote en funcin a la velocidad el cual representamos en la variable ngulo. Consideremos un movimiento de tipo oscilatorio en el que el objeto deba desplazarse con suavidad. Este tipo de movimiento recuerda a la onda sinusoidal, representada por el grfico de la funcin seno sobre un eje de coordenadas. Aplicando la ecuacin correspondiente y adaptndola de acuerdo a nuestras necesidades logramos el movimiento deseado: angulo = 0; function onEnterFrame(){ flecha._y = 200 + Math.sin(angulo) * 60; angulo= angulo +0.1; }
MOVIMIENTO CIRCULAR
Si tomamos el crculo en la figura y convertirlo por lo que se busca directamente en el borde de la derecha, obsrvamos que el objeto se
17
desplaza arriba a abajo. Su centro sera el centro del crculo, y su rango sera el radio del crculo. Se podra calcular su posicin, tal como hizo en el experimento de seno en primer lugar: por tomar el seno de las veces el ngulo, en este caso, seno (angulo) sera la funcin apropiada de usar, porque si nos fijamos en el tringulo formado, se est calculando la longitud de y el cateto opuesto al ngulo. Ahora, pensemo que en buscar en el crculo de su borde inferior en su lugar. En este punto de vista, se ve el objeto que se mueve adelante y atrs, de izquierda a derecha. Esta vez, se est calculando la longitud de x-el cateto adyacente al coseno del ngulo, de modo que usted debe utilizar. angulo = 0; centroX = 270; centroY = 200; radio = 100; velocidad = .1; onEnterFrame = function(){ balon._x = centroX + Math.cos(angulo) * radio; balon._y = centroY + Math.sin(angulo) * radio; angulo += velocidad; }
Movimiento elptico
Mientras que los crculos son encantadores, a veces un crculo perfecto no es exactamente lo que necesita. Lo que podra estar buscando ms de un valo o elipse. El problema es con el radio. Hace de los rangos del movimiento x y el movimiento y el mismo, razn por la cual se obtiene un crculo.
18
Para hacer una forma ms ovalada, todo lo que necesita hacer es usar diferentes valores para el radio al calcular las posiciones x e y. RadioX y RadioY. angulo = 0; centroX = 270; centroY = 200; radio = 100; velocidad = .1; radioX = 200; radioY = 100 onEnterFrame = function(){ balon._x = centroX + Math.cos(angulo) * radioX; balon._y = centroY + Math.sin(angulo) * radioY; angulo += velocidad; }
Friccin
He aqu un ejemplo. Coge un trozo de papel, se estrujan muy libremente, y tirar lo ms fuerte posible. Hay una buena probabilidad de que ni siquiera lo hacen a travs de la habitacin. Por supuesto, la gravedad es que tira hacia abajo (eje Y), pero cuando sali de su mano, que se estaba moviendo muy rpido en el eje x. Sin embargo, muy rpidamente, tena la velocidad x casi cero. Obviamente, no "aceleracin negativa" fue tirando del papel hacia atrs hacia su mano, sin embargo, su velocidad ha cambiado. Esto se conoce como friccin, friccin, resistencia o amortiguamiento. A pesar de que tcnicamente no es una fuerza, que hace clase de actuar de esa manera, ya que los cambios de velocidad de un
19
objeto. La regla es que la friccin se reduce slo la magnitud de la velocidad. Cualquiera que sea la direccin del objeto se dirige en esto no se cambiar por la friccin. En otras palabras, la friccin se puede reducir la velocidad a cero, pero nunca va a hacer que un objeto dar la vuelta y en la otra direccin. As que, cmo poner en prctica la friccin en el cdigo? Resulta que hay dos formas. Como la mayora de las cosas en la vida, usted tiene el camino correcto y el camino ms fcil. Pero a diferencia de sus padres, yo voy a recomendar el camino ms fcil. Aun as, yo te voy a mostrar en ambos sentidos, empezando por el "correcto", y le permiten hacer su propia decisin.
20
friccion = 0.1; balon._x = Stage.width / 2; balon._y = Stage.height / 2; vx = Math.random() * 10 - 5; vy = Math.random() * 10 - 5; function onEnterFrame() { var velocidad:Number = Math.sqrt(vx * vx + vy * vy); var angulo:Number = Math.atan2(vy, vx); if (velocidad > friccion) { velocidad -= friccion; } else { velocidad = 0; } vx = Math.cos(angulo) * velocidad; vy = Math.sin(angulo) * velocidad; balon._x += vx; balon._y += vy; }
21
vx y vy a ser del 80% o 90% de lo que estaban la ltima vez. En teora, la velocidad se aproxima a cero, pero en realidad nunca lo alcance. En la prctica, la computadora puede calcular esas cifras a corto plazo slo hasta el momento, y con el tiempo se va a redondear a la baja a velocidad cero. Pero mucho antes de eso, el movimiento ser tan pequeo que ser imperceptible. La buena noticia es que la velocidad no va a ser negativo con este mtodo, por lo que no tiene que preocuparse acerca de la comprobacin de eso. Adems, la x y la velocidad y se aproxima a cero en la misma proporcin, lo que no hay necesidad de convertir la velocidad angular del eje de y hacia atrs. vx = Math.cos(angulo) * velocidad; vy = Math.sin(angulo) * velocidad; friccion = 0.9; balon._x = Stage.width / 2; balon._y = Stage.height / 2; vx = Math.random() * 10 - 5; vy = Math.random() * 10 - 5; function onEnterFrame() { vx *= friccion; vy *= friccion; balon._x += vx; balon._y += vy; }
Gravedad
La gravedad tiene una descripcin muy simple: Tira las cosas. De hecho, tira las cosas a un ritmo muy especfico. La aceleracin
22
que se aplica es igual a unos 32 metros por segundo por segundo. Una forma de expresar la aceleracin es por la cantidad de velocidad que aade ms de un perodo de tiempo especfico. La gravedad hace que las cosas van de 32 centmetros por segundo ms rpido, cada segundo que tira de ellos. Usted puede ir a la montaa ms alta o ms baja del valle, y que el nmero 32 no va a cambiar lo suficiente como para que se d cuenta (es decir, sin algunos instrumentos sensibles).
Fuerza gravitacional
Cuanto ms lejos estn de un planeta o una gran masa, menor es la gravedad se hace. Esto es una cosa muy buena. De lo contrario, todos seramos absorbidos por el sol, que sera absorbida por cada otro sol y el planeta, todos los cuales terminaran estrellan con bastante rapidez. As que, cuando salga al punto en que se puede hacer referencia a los planetas como las partculas, la distancia entre ellos afecta en gran medida la fuerza de gravedad. Cunto afecta la distancia de la fuerza es muy fcil de describir. Es inversamente proporcional al cuadrado de la distancia. Bueno, tal vez que necesita alguna explicacin. En primer lugar, la gravedad es tambin muy ligado a la masa. La masa tiene, ms fuerza va a tirar en otras cosas, y cuanto ms se tira de ellos. Tambin hay algo llamado la constante de gravitacin (abreviado G) que se ajusta en ese pas. Esta es la ecuacin completa de la fuerza de gravedad: fuerza = G * m1 * m2 / Distancia2 La fuerza de la gravedad sobre un objeto por otro objeto es igual a la gravedad veces constante, tanto de las masas, dividido por el
23
cuadrado de la distancia entre ellos. Slo se necesita saber lo que esta constante gravitacional, aqu est la definicin oficial: G = (6.6742 0.0010) * 10.11 * * m3 kg-1 * s-2 En ActionScript se escribe la frmula gravedad de esta manera: fuerza = m1 * m2 / Distancia2
Ejemplo 01: aceleracion = 10; x = 200; y = 200; function onEnterFrame () { balon._x += (x-balon._x)/aceleracion; balon._y += (y-balon._y)/aceleracion; if (Math.abs(x-balon._x)<0.5 && Math.abs(y-balon._y)<0.5) { balon._x = x; balon._y = y; //delete balon.onEnterFrame; } };
ELASTICIDAD
En primer lugar, echemos un vistazo a lo que es un resorte. En lugar de verlo como un objeto, vamos a ver como una fuerza. Cuando usted comienza a pensar de un muelle como una fuerza, es probable que sea mejor utilizar la palabra "elasticidad". Despus de que usted comience a mirar de esa manera, usted
24
puede comenzar a pensar en muchas ms maneras de utilizar esta fuerza que se genera. Entonces, qu esta fuerza no? Tira un objeto hacia un punto particular. Un punto importante de esta fuerza es que cuanto ms lejos se obtiene desde el punto de destino, ms fuerte ser la atraccin. Esto se opondra a la gravedad, donde la fuerza se debilita con la distancia. En caso de que usted est teniendo problemas para visualizar este, tome una cinta de goma, lo sostiene contra su brazo, tire de l una o dos pulgadas y la dej ir. Ahora es sacar lo ms que pueda, y djelo presin contra el brazo. Qu fuerza fue ms fuerte? //Ejemplo 01 // Curva elstica // Nota configurar flash placer versin 6.0 stop(); //estos valores para el rebote velX=0 velY=0 aceleracion = .6 deceleracion = 1.6 this.onMouseDown =function(){ presionado = true } this.onMouseUp =function(){ presionado = false } //creo la funcion que luego se repite 2 veces function crearLinea(){
25
this.createEmptyMovieClip("clip",1) with (this["clip"]) { lineStyle( 5, 0x336699, 100 ); moveTo(100,200); curveTo(x,y,300,200); } } this.onEnterFrame=function() { if(presionado==true){ //codigo reducido y=(this._ymouse-200)*4/2; y+=200; x=(this._xmouse-125)*4/2; x+=50; //llama a la funcion que dibuja crearLinea() //fin codigo }else { velX = (velX+(200-x)/aceleracion)/deceleracion; velY = (velY+(200-y)/aceleracion)/deceleracion; x+= velX; y+= velY; //llamo a la funcion que dibuja crearLinea() } } //Ejemplo 02 // Funcin en fotograma
26
// Developed by dns r5 - www.chucruts.cjb.net // Based on script by Jae Young, Choi on Designers Forum (corea) Movieclip.prototype.elasticPos = function(targetX, targetY, accel, convert) { tellTarget (this) { xPos = xPos * accel + (targetX - _x) * convert; yPos = ypos * accel + (targetY - _y) * convert; _x += xPos; _y += yPos; } }; //Cdigo en clip de pelcula onClipEvent (load) { x = this._x; y = this._y; } onClipEvent (enterFrame) { if (!pressed) { elasticPos(x, y, .9, .5); // elasticPos( targetX, targetY, accel, convert); } } //Cdigo en botn dentro del clip de pelcula on (press) { pressed = true; this.startDrag(); } on (release, releaseOutside) { pressed = false; this.stopDrag();
27
} //Ejemplo 03 function iniciomouse () { // inicializa la posicin de Mouse en un arreglo raton = [_xmouse,_ymouse]; } function elasticidad () { // initialise la variable en un array fisica = [0.25, 0.9] /* la clasi formula de la lesticidad */ vx = ((raton[0]-balon._x)*fisica[0])+(vx*fisica[1]); vy = ((raton[1]-balon._y)*fisica[0])+(vy*fisica[1]); balon._x += vx; balon._y += vy; } // En clip bola onClipEvent (enterFrame) { _root.elasticidad(); } onClipEvent (mouseMove) { _root.iniciomouse(); }
28
//Ejemplo 04 // lnea configurar flash 6.0 //estos valores para el rebote velX=0; velY=0; aceleracion = 0.6; deceleracion = 1.6; this.onMouseDown =function(){ presionado = true; } this.onMouseUp =function(){ presionado = false; } //creo la funcion que luego se repite 2 veces function crearLinea(){ this.createEmptyMovieClip("Linea",1) with (this["Linea"]) { lineStyle( 5, 0x336699, 100 ); moveTo(100,200); curveTo(x,y,300,200); } } this.onEnterFrame=function() { if(presionado==true){ y=(this._ymouse-200)*4/2; y+=200; x=(this._xmouse-125)*4/2; x+=50; //llamo a la funcion que dibuja crearLinea();
29
}else { velX = (velX+(200-x)/aceleracion)/deceleracion; velY = (velY+(200-y)/aceleracion)/deceleracion; x+= velX; y+= velY; //llamo a la funcion que dibuja crearLinea(); } } //ejemplo pndulo 05
g = 9.8; //aceleracin de la gravedad r = 200; //longitud de la cuerda t = 0; oscilar = 1; } onClipEvent(enterFrame){ //muestra el ngulo actual redondeado a 2 decimales _parent.controles.a = Math.round(a*18000/Math.PI)/100; x = _parent._xmouse; y = _parent._ymouse; if(oscilar){ //libre oscilacin a = a0*Math.cos((t/48)/Math.sqrt(g/r)); //oscilacin del ngulo (radianes) t++; } else{ //arrastrar pndulo c = Math.sqrt((x-250)*(x-250)+y*y); //distancia del cursor al punto de apoyo if((x-250)*(x-250)+y+y < c*c){ //cursor dentro de la bola a = -Math.atan2((x-250),y); //ngulo arrastrado (radianes) a0 = a; //iguala la amplitud al ngulo arrastrado } else{ oscilar = 1; //cuando se escapa del cursor ;) } } _rotation = a*180/Math.PI; //rota el pndulo segn el ngulo (grados)
31
//dentro del botn V3 on (press) { oscilar = 0; //no oscila libremente t = 0; //t inicial 0 } on (release,releaseOutside,dragOut) { oscilar = 1; }
32