Mas sobre Flash


Koala Technologies (koalatec.com)
Hola amigos soy Naret. Aunque las cosas no me han salido bien este dia (especialmente por una chica por ahi ) en esta oportunidad , sin embargo , estoy de muchas ganas de mostrarles una interesante introduccion al AS3 y que mejor que Aprender-Haciendolo. Lo que intentaremos realizar es una pelotita con movimiento real , la cual controlaremos mediante las flechas del teclado dandole impulsos a nuestro antojo. Aparte de moverse , podra tambien rebotar en las paredes de la habitacion cerrada y paulatinamente ira disminuyendo su velocidad debido a la perdida de energia durante los choques hasta detener totalemente su movimiento mecanico , a menos que actue una fuerza externa que lo impulse nuevamente. Nos debe quedar algo asi :


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 a 550 y la coordenada Y de 0 a 400 , esta condicion garantiza que la pelota siempre este dentro de la habitacion y nunca fuera de ella.

3.- Dejando todo listo antes de comenzar.

Primero que nada , vamos a crear un documento nuevo en Flash , este debe ser un documento de cualquier medida , ya que escribiremos el codigo AS3 de tal forma que se adapte a cualquier tamaño de habitacion. En este caso yo eligire 550 px de ancho y 450 px de altura. Fijate tambien de que en la seccion Velocidad de fotogramas dice 12fps , para obtener mayor fluidez y performance en nuestra aplicacion vamos a colocarle en este caso 30fps , no niego que con 12fps tambien funciona pero me parece que el movimiento es algo brusco.

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
gramar el mundo fisico con ActionScript:

Como decia el gran Hector Lavoe : " Mi gente , aqui empieza lo bueno" vamos a tejer nuestro mundo fisico , comenzando por definir algunas variables basicas , veamos :

- 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
ript :

// 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
o programa funcione para cualquier tamaño de habitacion. Seguidamente definiremos algunas variables importantes:

// Definicion de variables
var ax : Number = 0;
var ay : Number = 0;
var vy : Number = 0;
var vx : Number = 0;
var g :
Number = .5; // Por cuestiones meramente esteticas g vale 0.5 y no 0.98
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
y : Variables de Aceleracion
- 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
ar una accion para luego enviarle el "mensaje" a una funcion que respondera del modo que queramos.

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);

Stage hace referencia a nuestra pelicula o documento principal . Los paremetros de nuestros listeners son basicamente dos : Uno invoca a la libreria de clases y propiedades de un evento , y la otra es la funcion a la cual acudira el listener al activarse el evento , el evento puede ser : presionar un boton , mover el mouse , presionar una tecla ,etc ,etc. Yo se que por ahora es un poco confuso , pero debes acostumbrarte , ya trabajando un poquito mas con esto podras asimilar intuivamente estos conceptos , no te preocupes !!, por ahora sigamos adelante !!.

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
o al presionar y soltar las teclas respectivamente.

Ahora escribamos las funciones :


// Insertamos las funciones que seran invocadas por los listeners

function Entrar_en_frame (e: Event): void
{

}

function Presionar_tecla (e:KeyboardEvent):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
iada necesariamente una funcion y esta hay que escribirla asi la funcion este vacia o sin instrucciones , como lo acabo de hacer , de lo contrario saldra un mensaje de error al compilar.

Empecemos escribiendo codigo en la primera funcion :

// Al entrar al frame : Esta funcion es ejecutada al cargar la pelicula , y tiene la particularidad de invocarse asi misma todo el tiempo gracias al listener especial que tiene asociado.

funct
ion 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 !! =)

|
This entry was posted on 21:26 and is filed under . You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.

6 comentarios:

On 19 de enero de 2009, 15:49 , David dijo...

Aun no llego a esta parte. Pero se nota que será muy interesante. Ya me animaste a leerlo todo AS3, XD
David

 
On 22 de febrero de 2009, 8:02 , nico dijo...

no lo entiendo ¿por que no pones? el ejemplo

 
On 25 de marzo de 2010, 3:56 , ACL dijo...

excelente, entendí casi todo, podrías poner ejemplos un poco mas complejos gracias...

 
On 25 de septiembre de 2010, 13:53 , Juan Esteban Almanzar dijo...

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!

 
On 28 de marzo de 2013, 12:34 , sucesos paranormales dijo...

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.

 
On 7 de abril de 2013, 0:30 , Anónimo dijo...

amigo muchas gracias. saludos desde colombia

 

Relacionados