Hace bastante tiempo habia hecho un par de tutoriales de programacion en AS2 (ActionScript 2.0, Flash) y queria compartilo con ustedes.
Espero que les sirva!
En esta ocasión quiero enseñarles paso a paso como podemos realizar una muy buena simulacion de gravedad y que tambien un objeto pueda rebotar por efecto de la misma.En este ejemplo vamos a utilizar una pequeña pelota y un rectangulo que sera el suelo contra el que rebotara.Primeramente, como en mi anterior tutorial les mostrare el video realizado por mi y luego les explicare paso a paso como interpretar el codigo.[/b]
Aqui esta el codigo:
onClipEvent (load) {
//Variables que intervienen con la gravedad
aceleracion = 1
velocidad = 1
}
onClipEvent (enterFrame) {
// En esta seccion encontraremos lo necesario para realizar la gravedad
_root.pelota._y += velocidad
velocidad += aceleracion
//Si la velocidad llega a 10, entonces mantendra esa velocidad constante (sin aceleracion)
if (velocidad == 10){
aceleracion = 0
}
//Si el suelo choca contra la pelota, entonces la pelota rebotara (subira)
if (_root.suelo.hitTest (_root.pelota._x, _root.pelota._y + _root.pelota._height/2)){
velocidad = -10
aceleracion = 1
}
}
Muy bien.Si recien estas familiarizandote con Flash pensaras que todo esto esta en chino, pero cuando empieces a interpretar las cosas veras que facil puedes deducirlo tu mismo.
Vamos a dividir el trabajo en 2 secciones:
-Efecto de Gravedad
-Efecto de Rebote
Una vez dicho esto creo que ya estamos preparados para poder empezar a realizar nuestro trabajo.
Efecto de Gravedad
Si ya has tenido clases de física me imagino que ya sabras sobre la aceleracion.Si eres nuevo en esto vamos a realizar un pequeño repaso.
La gravedad se produce por una aceleracion.Si nosotros dejamos caer un objeto al suelo podemos ver que el objeto no baja siempre a la misma velocidad, sino que va cada vez mas rapido hasta caer.
¿Que quiere decir esto?
Que la velocidad del objeto esta afectada por una aceleracion.En el caso de la Tierra los cuerpos tienen una aceleracion de aproximadamente 9,8 m/s al cuadrado.Esto quiere decir que si dejamos caer un objeto, en 1 segundo ira a 9,8 m/s, en 2 segundos ira a 19,6 m/s , en 3 segundos 29,4 m/s, y asi sucesivamente.
¿Como podemos adaptar esto a un trabajo en Flash?
Muy facil.Primeramente necesitamos aclarar 2 variables que intervienen en el trabajo de la gravedad:
-Una velocidad
-Una aceleracion
Como vimos anteriormente en el tutorial, primero creamos una pelota como movieclip y le ponemos su nombre de instancia.Luego, en sus acciones vamos a empezar con este codigo:
onClipEvent (load) {
//Variables que intervienen con la gravedad
aceleracion = 1
velocidad = 1
}
¿Que es lo que estamos haciendo con este codigo?
Este codigo lo que esta diciendo es que, cuando se reproduzca el MovieClip (En este caso, la pelota), se van a cargar 2 variables : La velocidad (Que va a ser igual a 1) y La aceleracion (Que va a ser igual a 1).
Los valores de cada variable se pueden cambiar al gusto de cada uno.Si queremos que ya empiece con una velocidad mayor podemos poner por ejemplo, en vez de 1 le ponemos 20 en velocidad.Si queremos que la gravedad sea mayor, cambiamos la aceleracion 1 por, por ejemplo 10
¿Que hacemos una vez que tengamos las variables cargadas?
Vamos a empezar a utilizarlas.Vamos a analizar la siguiente parte del codigo:
onClipEvent (enterFrame) {
// En esta seccion encontraremos lo necesario para realizar la gravedad
_root.pelota._y += velocidad
velocidad += aceleracion
Aqui esta lo que le da vida a la gravedad.En este pequeño codigo encontramos lo siguiente:
_root.pelota._y +=velocidad
Este codigo nos esta diciendo que al eje Y de la pelota se le ira aumentando continuamente la variable que establecimos anteriormente (velocidad).Entonces lo que tenemos en esta parte es una velocidad constante.El ciclo que se reproduciria seria el siguiente:
Se reproduce el movieclip, se le aumenta 1 al eje Y.
Se reproduce el movieclip, se le aumenta 1 al eje Y.
Se reproduce el movieclip, se le aumenta 1 al eje Y.
Obtenemos que siempre va a la misma velocidad.Sigamos analizando la otra parte:
velocidad += aceleracion
Este codigo nos esta mostrando que a la variable "velocidad" se le aumentara cada vez que se reproduzca el MovieClip la variable "aceleracion".Aqui es donde ocurre la aceleracion.El ciclo que se reproduciria seria el siguiente:
Se reproduce el movieclip, se le aumenta 1 al eje Y.Se le aumenta 1 a la velocidad
Se reproduce el movieclip, se le aumenta 2 al eje Y.Se le aumenta 1 a la velocidad
Se reproduce el movieclip, se le aumenta 3 al eje Y.Se le aumenta 1 a la velocidad
Obtenemos que la velocidad ya no es constante, sino que va cambiando a cada rato.
¡Al fin pude entender! ¿Que viene despues?
Una vez que terminamos esa parte vamos a agregar una pequeña cosa mas a la aceleracion.Veamos el siguiente codigo:
if (velocidad == 10){
aceleracion = 0
Este codigo es mas facil de interpretar y es algo que te servira en la parte de gravedad.Como a veces pasa uno quiere que la aceleracion dure solo un rato y luego vaya a una velocidad constante.Esto sucede muchas veces al realizar efectos de rebote, ya que si va a una velocidad demasiado rapida el objeto traspasa el suelo y no llega a ser detectado como si lo hubiese chocado.
¿Que realiza este codigo?
En esta parte tenemos una cóndicion.
Si la velocidad llega a ser igual a 10, la variable aceleracion = 0.Veamos como cambiaria el ciclo suponiendo que la velocidad ya llego a los 9:
Se reproduce el movieclip, se le aumenta 9 al eje Y.Se le aumenta 1 a la velocidad
Se reproduce el movieclip, se le aumenta 10 al eje Y.Se realiza la condicion dicha y la aceleracion va a ser igual a 0
Se reproduce el movieclip, se le aumenta 10 al eje Y.Se le aumenta 0 a la velocidad
Se reproduce el movieclip, se le aumenta 10 al eje Y.Se le aumenta 0 a la velocidad
Aquí finalizaría la parte de Gravedad.El codigo entonces de gravedad completo seria el siguiente:
onClipEvent (load) {
//Variables que intervienen con la gravedad
aceleracion = 1
velocidad = 1
}
onClipEvent (enterFrame) {
// En esta seccion encontraremos lo necesario para realizar la gravedad
_root.pelota._y += velocidad
velocidad += aceleracion
//Si la velocidad llega a 10, entonces mantendra esa velocidad constante (sin aceleracion)
if (velocidad == 10){
aceleracion = 0
Efecto de Rebote
Vamos a una nueva introduccion.
¿Como es que sucede el rebote?
El rebote, en manera muy sintetizada, se realiza por una velocidad contraria a la de la gravedad.Cuando nosotros dejamos rebotar una pelota por ejemplo, vemos que la pelota en este caso va desacelerando hasta llegar a un punto en el que vuelve a bajar.Esto sucede debido a que a la velocidad con la que rebote se le contraresta la aceleracion (se le resta, en el caso de la tierra, 9,8 m/s).
Supongamos que tiramos una pelota y esta rebota con una velocidad de 29,4 m/s.La pelota al rebotar, por cada segundo que pase se le restara 9,8 m/s.Entonces sucedera lo siguiente:
-Pasa un segundo desde que reboto la pelota.Su velocidad es 29,4 - 9,8 = 19,6
-Pasan dos segundos desde que reboto la pelota.Su velocidad es 19,6 - 9,8 = 9,8
-Pasan tres segundos desde que reboto la pelota.Su velocidad es 9,8 - 9,8 = 0
Esto quiere decir que, cuando ya hayan pasado 3 segundos la pelota frenara y volvera a bajar por la atraccion de la gravedad.
En el caso de la vida real la pelota cada vez sube con menos velocidad debido a que existe una fuerza de rozamiento que hace que su velocidad disminuya, sino la pelota rebotaria constantemente sin parar.
En el caso de nuestra animacion la pelota no tendra fuerza de rozamiento asi que rebotara continuamente.
Bien, he logrado enteder lo que has explicado.¿Como empezamos con el código?
Vamos a empezar con una función llamada HitTest.Es una herramienta muy util a la hora de crear suelos y paredes.
¿Que es lo que hace HitTest?
Esta funcion permite saber cuando es que choca un objeto contra otro y que pasara cuando ambos choquen.Vamos a ver la primera parte del codigo el cual abarca HitTest:
if (_root.suelo.hitTest (_root.pelota._x, _root.pelota._y + _root.pelota._height/2))
Esta parte del codigo es muy dificil de explicar pero poco a poco vamos a ir entendiendola.
Cuando utilizamos HitTest necesitamos establecer parametros:
hitTest ( Con respecto al eje X , Con respeto al eje Y)
Siempre que utilizamos hitTest necesitamos especificar con lo que va a chocar con respecto a sus 2 ejes.
Volviendo al codigo estamos espicificandos los siguientes:
Con respecto al eje X = _root.pelota._x
Con respecto al eje Y = _root.pelota._y + _root.pelota._height/2
En nuestro caso al Eje X y al Eje Y de un objeto se lo detecta en el centro del mismo.Hagamos un ejemplo utilizando un circulo.
En el circulo por ejemplo su punto en el Eje X y en su Eje Y no es en cualquier punto de la circunferencia, sino justo en el medio se lo toma como referencia.Sigamos con el codigo
Con respecto al eje X = _root.pelota._x
Con respecto al eje X vamos a dejar como si fuera solamente el X de la pelota ya que en este caso no interviene con el rebote el Eje X sino con el Eje Y debido a que sube y baja
Con respecto al eje Y = _root.pelota._y + _root.pelota._height/2
Aqui se viene lo complicado.
Esta cuestion es una cuestion simplemente matematica.Si nosotros dejaramos solamente en el codigo "_root.pelota._y" la pelota rebotaria cuando este en el medio del piso, esto quiere decir que atravesaria el piso y recien rebotaria cuando ya este en su punto medio.
¿Pero entonces como hacemos?
Le sumamos "_root.pelota._height/2"
height en ingles significa "altura".Al eje Y le tenemos que sumar la altura de la pelota divido 2.Con esto hacemos que rebote toda la pelota, ya que a su eje Y le sumamos una mitad mas que seria la que estaba atravesada al piso y ahora si podra rebotar tranquilamente contra el piso sin traspasarlo
Si ya tenemos la pelota y el suelo hecho con su nombre de instancia esto se interpretaria de la siguiente manera:
if (_root.suelo.hitTest (_root.pelota._x, _root.pelota._y + _root.pelota._height/2)){
Si el suelo choca contra:
Con respecto al Eje X = El eje X de la pelota
Con respecto al Eje Y = El eje Y de la pelota + la mitad que faltaba que quedaba atravesada
Entonces se va a cumplir la funcion
¡Me rompi la cabeza pero lo entendi!¿Que quedaria con esto?
Nos quedaria ver la ultima parte, la funcion que realiza si se cumple la condicion:
velocidad = -10
aceleracion = 1
Aqui es donde sucede la magia del rebote.Cuando choca contra el suelo, la aceleracion sigue valiendo 1 como hicimos al principio pero la velocidad cambia a -10, esto quiere decir que en vez de bajar va a subir.
Pero entonces si sube, ¿como es que va a volver a bajar?
Porque anteriormente establecimos este codigo en la seccion de gravedad:
_root.pelota._y += velocidad
velocidad += aceleracion
Gracias a ese codigo podemos establecer el siguiente ciclo.
Se reproduce el movieclip, se le aumenta -10 al eje Y.Se le aumenta 1 a la velocidad
Se reproduce el movieclip, se le aumenta -9 al eje Y.Se le aumenta 1 a la velocidad
Se reproduce el movieclip, se le aumenta -8 al eje Y.Se le aumenta 1 a la velocidad
Va a llegar un momento en que la velocidad del rebote llegue a 0 y comenzara a ser positiva, lo cual lo hara bajar al objeto otra vez.
Y asi finalizamos con la Seccion Rebote.
Espero que les haya servido mi tutorial sobre las leyes de física y que lo puedan emplear sin ningún problema en alguno de sus proyectos.
Saludos!
Egary_Master
[Tutorial Propio]