NOTA IMPORTANTE : Hazle click al Flash para empezar a controlarlo con el teclado.
Veamos como hacerlo :
1. Sistema de coordenadas en Flash :
En Flash , asi como en la mayoria de programas de computadora , se utiliza siempre un sistema de coordenadas cartesiano para posicionar puntos o elementos en la pantalla. Flash no podia ser la excepcion : El origen (O) se toma desde la esquina superior izquierda del lienzo , las coordenadas Y aumentan hacia abajo y las coordenadas X aumenta hacia la derecha , siendo todas positivas en el cuadrante que determinan los ejes principales.
Observa el grafico , cualquier punto P posicionado en el cuadrante principal cumple que x>0 , y>0 ( coordenadas positivas) , de esto se infiere que las coordenadas Y aumentan de arriba hacia abajo y las X de izquierda a derecha , como ya lo mencionamos anteriormente.
2. Modelo fisico: Pelota + Habitacion.
Identifiquemos a continuacion las variables y elementos involucrados en nuestro sistema ( Pelota + Habitacion ) :
- Las dimensiones de nuestra habitacion seran las dimensiones del documento Flash ( 550px de ancho por 400px de alto)
- Al establecer margenes para nuestra habitacion la pelota ve limitado su movimiento solo al interior de esta. Por lo tanto si identificamos a P(x,y) como la posicion de la pelota para cualquier instante de tiempo , la coordenada X solo podra tomar valores desde 0
Luego , por cuestiones de orden y elegancia , crearemos 3 capas en nuestra linea de tiempo principal. La primera la llamaremos "Script" , la segunda sera : "Pelota" , y la tercera y ultima "Fondo" apiladas del modo que puedes ver en la imagen de abajo :
En la capa fondo , crea un rectagunlo con degradado y borde grueso , este rectangulo debe calzar en todo el documento completo. En la capa Pelota diseña una pelotita con la herramienta circulo , asignale un relleno y convierte eso en un Clip de pelicula ponle el nombre de "Circulo" luego de esto. Dale un nombre de identificador a la pelotita para poder controlarla desde AS3 , para ello , abre el panel de propiedades (Vetanas>Propiedades), Y asegurandote de que la pelota este seleccionada , asignale un nombre de instancia : "pelota"
Haz lo mismo tambien con el rectangulo que creaste de fondo conviertelo en un Clip de pelicula llamado "Fondo" y dale un nombre de instancia : "marco" ( asignarle un nombre de instancia a nuestra habitacion nos permitira controlarla para que funcione con cualquier tamaño).
4.- Pro
- Ubicate en el primer frame de la capa Script y presiona F9. Escribiremos nuestras primeras lineas de codigo ( Algo a tener en cuenta y que es una regla en aras del orden y la legibilidad de un codigo bien escrito es que escribamos nuestros Scripts trantando de que todo este en un solo frame). Primeramente , vamos a posicionar nuestra pelota en el centro del documento mediante ActionSc
// Pelicula a 30fps - Pelota Física by Naret
//Posicion inicial de la pelotita en el centro de la habitación
pelota.x = marco.width/2;
pelota.y = marco.height/2;
- Muy bien , hasta este punto hemos llamado a las propiedaes de posicion de nuestra instancia "pelota" para ubicar nuestra pelota al centro de nuestra habitacion , este codigo permite tambien que nuestr
// Definicion de variables
var ax : Number = 0;
var ay : Number = 0;
var vy : Number = 0;
var vx : Number = 0;
var g :
var friccion : Number = .99;
var radio:Number = pelota.height/2;
- Dejemos claro dos cosas , la primera es que estamos definiendo variables anteponiendo la palabra "var" seguida del nombre de dicha variable , luego se define el tipo de variable , en este caso es la palabra Number ( abarca los enteros y decimales largos). Seguidamente le asignamos el valor inicial ( la mayoria de nuestras variables fisicas inician en cero). Vamos a ver de que trata cada una de ellas :
- ax , a
- vx , vy : Variables de Velocidad
- g : Gravedad
- friccion : Variable que simulara los efectos de amortiguamiento del aire y los choques con las paredes.
-radio : Radio de nuestra pelotita.
- Ahora insertemos nuestros Listeners , los listeners son como interruptores que al encenderse invocan y envian informacion de un evento a una funcion particular. Una traduccion al español seria algo como "Escuchador" y precisamente esto es lo que hace un listener , escuchar y proces
Ejemplo : Al presionar la tecla "a" queremos que aparezca un mensaje que diga "hola mundo". En este caso el listener detecta la accion de apretar la tecla "a" e inmediatamente llama a una funcion la cual se encarga de imprimir el mensaje "hola mundo" en la pantalla.
Insertemos nuestros listener para nuestra aplicacion :
// Insertando los listeners
stage.addEventListener (Event.ENTER_FRAME, Entrar_en_frame);
stage.addEventListener (KeyboardEvent.KEY_DOWN, Presionar_tecla);
stage.addEventListener (KeyboardEvent.KEY_UP, Soltar_tecla);
El primer listener controla el flujo del tiempo (para los que han programado en C++ o Java es como un bucle infinito hecho con While). El segundo y el tercero controlan las instrucciones de teclad
Ahora escribamos las funciones :
// Insertamos las funciones que seran invocadas por los listeners
function Entrar_en_frame (e: Event): void
{
}
{
}
function Soltar_tecla (e:KeyboardEvent):void
{
}
Como te das cuenta las 3 funciones tienen algunos paremetros y cosas extrañas aparte de su nombre , no te preocupes por ellas todavia. las 3 funciones ademas no tienen ninguna instruccion por ahora. Comenzaremos a escribir codigo en la primera funcion. Ojo : cada listener debe tener asoc
Empecemos escribiendo codigo en la primera funcion :
function Entrar_en_frame (e: Event): void
{
vy = vy + g;
vy = vy + ay;
vx = vx + ax;
pelota.x = pelota.x + vx;
pelota.y = pelota.y + vy;
}
Es un buen momento para ir probando la pelicula (Crt+Intro) , como puedes ver lo unico que hace la pelota es caer libremente en el vacio. Expliquemos un poco el codigo : Recordemos que la aceleracion es algo que afecta y provoca cambios en la velocidad de un objeto , por ello es que tanto al componente X y al componente Y de la velocidad se le suma las aceleraciones "ax" , "ay" y "g". En este caso como no existe aceleracion en X , ax = 0 no hay cambio de movimiento en este eje. En el eje Y no hay ninguna fuerza externa aparte de la gravedad que provoque aceleracion por tanto ay=0 , en el eje Y solo existe la aceleracion de la gravedad g=0.5 , que es la real responsable del movimiento acelerado hacia abajo. Finalmente la velocidad termina cambiando la posicion de un objeto , por ello le sumamos la velocidad a la posicion de nuestra pelotita.
Nota : Los que saben un poco de fisica se estaran arrancando los pelos , debido al hecho de que sumar aceleracion a velocidad , o velocidad a posicion , ¡ No es posible ! , ya que los vectores operados no son del mismo tipo , la razon de hacerlo es la siguiente :
Siguiendo la ecuacion vectorial:
, nos queda...
Date cuenta como al final las cantidades se suman para cada instante de tiempo , lo mismo podemos decir de la suma de la posicion y la velocidad. Cada unidad de tiempo en nuestro programa esta representado por el momento en que la cabecera de Flash lee nuestra funcion Entrar_en_Frame y hace las operaciones respectivas , Asi , entrando y volviendo a entrar.
Añadiendo los limites de al movimiento de la pelota
Escribamos algo mas de codigo para que la pelota pueda chocar con las paredes , fijate como hago las condiciones dentro de los If , y tambien fijate que al chocar la pelota hacemos que su vector de velocidad invierta su direccion multiplicandolo por -1 :
function Entrar_en_frame (e: Event): void
{
vy = vy + g;
vy = vy + ay;
vx = vx + ax;
pelota.x = pelota.x + vx;
pelota.y = pelota.y + vy;
if(pelota.y+radio > marco.height)
{
pelota.y=marco.height-radio;
vy=vy*-1;
}
else if(pelota.y-radio<0)
{
pelota.y=radio;
vy=vy*-1;
}
if(pelota.x+radio>marco.width)
{
pelota.x=marco.width-radio;
vx=vx*-1;
}
else if(pelota.x-radio<0)
{
pelota.x=radio;
vx=vx*-1;
}
}
Es hora de probar nuevamente nuestro codigo , esta vez notaras como la pelota rebota continuamente en el piso , sin embargo lo hace sin perder su energia cinetica (Nunca se detiene !!!) eso no pasa en la realidad y lo arreglaremos agregando dos lineas mas de codigo :
function Entrar_en_frame (e: Event): void
{
vy = vy + g;
vy = vy + ay;
vx = vx + ax;
vx=vx*friccion;
vy=vy*friccion;
pelota.x = pelota.x + vx;
pelota.y = pelota.y + vy;
.....
....
....
Con esto simularemos los efectos conjuntos de la friccion del aire y los choques, la pelota ira mas y mas lento hasta detenerse. La varible friccion es un numero fraccional constante que definimos al inicio , asi que la accion de multiplicar es en el fondo una division en partes cada vez menores.
Es hora de escribir el codigo para las intrucciones con teclado , aqui es donde las variables de aceleracion ax y ay cobran su sentido , ya que hasta ahora valian cero :
function Presionar_tecla (e:KeyboardEvent):void
{
switch(e.keyCode) // Analizamos el evento de teclado "e"
// accediento a su propiedad keyCode
{
case Keyboard.LEFT: // Si el evento fue apretar la tecla izquierda
ax=-.5;
break;
case Keyboard.RIGHT: // Si el evento fue apretar la tecla derecha
ax=.5;
break;
case Keyboard.UP: // Si el evento fue apretar la tecla arriba
g=0;
ay=-.5;
break;
case Keyboard.DOWN: // Si el evento fue apretar la tecla abajo
ay=.5;
break;
}
}
function Soltar_tecla (e:KeyboardEvent):void
{
ax=0;
ay=0;
g=.5;
}
Como puedes ver estas funciones lo que hacen es darle una acelaracion extra a nuestra pelotita , por medio del teclado.
La funcion Soltar_tecla es para reiniciar las variables de aceleracion cuando aplicamos una aceleracion extra mediante la funcion Presionar_tecla , si no la pusieramos , las variables de aceleracion extra "ax" y "ay" actuarian constantemente en la pelota alterando su moviemiento natural.
5. Codigo fuente completo :
He aqui el codigo fuente completo y terminado , fijate que coloque los listeners en la parte final del codigo en vez de al principio ya que usualmente se los coloca alli por razones de formalidad. Tu puedes colocarlos donde prefieras , al principio o al final , el codigo funcionara igual , puedes tambien cambiar las dimensiones de la habitacion desde el Documento principal de Flash o los valores de la gravedad y friccion , el radio de la pelota , si quieres. El programa funcionara perfectamente y se adaptara a cualquier cambio.
// Pelicula a 30fps - Pelota fisica
// Posicion inicial de la pelotita en el centro del marco
pelota.x = marco.width/2;
pelota.y = marco.height/2;
// Definicion de variables
var ax : Number = 0;
var ay : Number = 0;
var vy : Number = 0;
var vx : Number = 0;
var g : Number = 0.5;
var friccion : Number = .99;
var radio:Number = pelota.height/2;
// Insertamos las funciones que seran invocadas por los listeners
// Al entrar al frame
function Entrar_en_frame (e: Event): void
{
vy = vy + g;
vy = vy + ay;
vx = vx + ax;
vx=vx*friccion;
vy=vy*friccion;
pelota.x = pelota.x + vx;
pelota.y = pelota.y + vy;
if(pelota.y+radio > marco.height)
{
pelota.y=marco.height-radio;
vy=vy*-1;
}
else if(pelota.y-radio<0)
{
pelota.y=radio;
vy=vy*-1;
}
if(pelota.x+radio>marco.width)
{
pelota.x=marco.width-radio;
vx=vx*-1;
}
else if(pelota.x-radio<0)
{
pelota.x=radio;
vx=vx*-1;
}
}
function Presionar_tecla (e:KeyboardEvent):void
{
switch(e.keyCode)
{
case Keyboard.LEFT:
ax=-.5;
break;
case Keyboard.RIGHT:
ax=.5;
break;
case Keyboard.UP:
g=0;
ay=-.5;
break;
case Keyboard.DOWN:
ay=.5;
break;
}
}
// Al momento de dejar de apretar la tecla
function Soltar_tecla (e:KeyboardEvent):void
{
ax=0;
ay=0;
g=.5;
}
// Listeners
stage.addEventListener (Event.ENTER_FRAME, Entrar_en_frame);
stage.addEventListener (KeyboardEvent.KEY_DOWN, Presionar_tecla);
stage.addEventListener (KeyboardEvent.KEY_UP, Soltar_tecla);
En esta leccion no he escatimado en detalles ya que es una introduccion al AS3 ,
que sin embargo requiere cierta solvencia en Flash y haber programado antes en algun otro lenguaje como C++ , Pascal o Java. En los proximos tutoriales sere mucho mas directo , por ello , seria bueno en este punto que refuerces los conceptos que vimos con otros tutoriales o manuales de Flash , seria bueno tambien revisar un poquito sobre los conceptos de programacion orientada a objetos para poder digerir mejor el AS3 , cosas que con Wikipedia se pueden salvar. Bueno todo a su tiempo no ?? , eso es algo que aprendi de algunas buenas amigas.
Hasta el proximo tutorial Bloggeros !! =)
6 comentarios:
Aun no llego a esta parte. Pero se nota que será muy interesante. Ya me animaste a leerlo todo AS3, XD
David
no lo entiendo ¿por que no pones? el ejemplo
excelente, entendí casi todo, podrías poner ejemplos un poco mas complejos gracias...
Hermano muchas gracias, este tutorial esta muy bien explicado un poco enredado para los que nos sabemos de fisica pero entendible si se lee con calma, un fuerte abrazo desde medellin colombia!
Gracias amigo. Me preguntaba si se puede utilizar el mismo método para inclinaciones. O, si conoces alguno ¿me lo podrías comentar? o enviar a mi correo . luis12345671@live.com . Felicitaciones por el tutorial, lo entendí perfectamente; Gracias de antemano.
amigo muchas gracias. saludos desde colombia