Documentos de Académico
Documentos de Profesional
Documentos de Cultura
con ActionScript
Si bien hemos catalogado este tema como "básico", la palabra adecuada sería "necesario". pues si
bien el objetivo de este tema NO es enseñar programación, no podemos pasar por alto que ciertos
conceptos relacionados con ella deben conocerse para poder llegar a entender el ActionScript. Vamos
pues a explicar algunos conceptos fundamentales, necesarios para abordar la programación mediante
ActionScript.
Script: Código escrito en cualquier lenguaje de programación que realiza una tarea determinada. Así
por ejemplo, el código ActionScript necesario para que al pulsar un botón de Flash pasemos al fotograma
siguiente es un script.
Función: Una función es una porción de código (ActionScript en nuestro caso) que tiene un nombre
determinado y que realiza una labor concreta. Ejemplo, la siguiente definición de función:
function IncrementaX(x) {
x = x + 1;
}
Realiza la función de tomar la variable "x" y sumarle uno a su valor. Si quisiéramos ejecutarla en algún
lugar de nuestra película, bastaría con escribir: "IncrementaX(x)", siempre y cuando la definición de la
función (que es el código mostrado arriba) esté en cualquier parte de la película que se ejecute ANTES
que la llamada a la función.
Acción: Flash llama Acción a funciones que él mismo ha implementado y que no requieren ser
definidas para ser usadas. Basta por tanto, con escribir la llamada a la función. Estas acciones son lo que
usaremos la mayoría de las veces, pues resultan sumamente fáciles de usar y muy potentes. Las acciones
aparecen en el Panel Acciones y se pueden insertar en nuestro código con un simple clic de ratón.
Por ejemplo "gotoAndPlay(3)" es una acción que provoca que Flash pase a ejecutar el fotograma 3.
Ahora que entendemos qué son las funciones, deberemos comprender también, que en alguna parte, Flash
ha definido la función "gotoAndPlay" (tal y como hemos hecho nosotros anteriormente con la función
"IncrementaX") y ha escrito un código que provoca el efecto ya comentado. Por suerte todo esto no nos
debe preocupar, Flash 8 se encarga de todo. Nos basta con conocer las acciones y saber cómo usarlas.
Parámetro: Un parámetro es una variable que entra o sale de una acción o de una función. Ponemos
un ejemplo para clarificar esta definición:
Tenemos la siguiente definición de función:
Imaginemos que tenemos una variable x que vale 7 y otra variable y que queremos que valga 7 + 5.
Ejecutaríamos la función "Suma5" del siguiente modo: Suma5( x , y ). Vamos a ver qué hace
exactamente la función con los parámetros x e y.
Al ejecutar "Suma5( x , y)", Flash busca definiciones de funciones que se llamen Suma5, enseguida
encontrará la definición que hemos escrito arriba, (que deberá estar escrita en alguna parte de nuestra
película ANTES de ejecutar "Suma5( x, y )"). Cuando lo hace, comprueba que la función que ejecutamos
COINCIDE con la cabecera de la definición, esta cabecera abarca el nombre de la función y todo lo que
venga a continuación hasta que se cierre el paréntesis. En nuestro caso, la cabecera sería
"Suma5(p_entrada, p_salida)"
Aquí viene la pregunta inminente, ¿Coinciden?. La respuesta es SÍ, para que coincidan DEBE coincidir el
NOMBRE de la función y el número de parámetros, que serán variables o valores separados por comas.
Como tenemos 2 parámetros en cada parte, todo coincide y pasa a ejecutarse la función. La función
Puedes manejar otros eventos además de los mencionados anteriormente
(press, release, rollOver y rollOut), y son los siguientes:
• dragOut: se ejecuta cuando se presiona el botón y, sin soltarlo,
el ratón se desplaza fuera de él.
Una vez insertados los botones y definidos los eventos sobre los que deben actuar,
tendremos que decidir qué queremos que hagan.
De esta forma, si no aplicásemos ninguna acción sobre la línea de tiempo, todas las
secciones se ejecutarían una seguida de la otra. Lo que queremos conseguir es que se
ejecute la primera (para mostrar la sección principal) y el cabezal se pare hasta nueva
orden (para mostrar la segunda).
Esta función sirve para parar el cabezal de la línea de tiempo donde sea colocada. Así
que seleccionamos el último fotograma de la sección y abrimos el Panel Acciones.
Esto hará que cuando la animación llegue a ese punto se detendrá a espera de nueva
orden.
Nosotros hemos colocado las acciones en una capa aparte llamada Acciones para así
poder acceder más rápido a ella. El método es el mismo, solamente habrá que
crearfotogramas claves en aquellos sitios en los que queramos insertar un stop().
Los botones nos ayudarán a desplazar el cabezal por la línea de tiempo. Así que
modificaremos el código de uno de los botones donde habíamos escrito:
on (release) {
Basta con introducir una Etiqueta de fotograma para poder remitir el cabezal a éste:
Por ejemplo:
on (release) {
gotoAndPlay("encuentranos");
}
tema básico.
Comportamientos
Es posible asignar un salto de fotograma a cualquier fotograma u objeto sin tener que
acceder al Panel Acciones, para ello simplemente selecciona el objeto o fotograma y haz
clic en Ventana → Comportamientos.
Desde aquí añadir acciones es muy sencillo. El único inconveniente es que las opciones
son bastante limitadas y no son tan versátiles como la escritura directa del
códigoActionScript.
Para crear un salto en la línea de tiempo deberás hacer clic en el botón para añadir
un comportamiento nuevo.
Luego selecciona Clip de Película y podrás elegir entre dos opciones que nos interesan:
Elijas la opción que elijas, el cuadro de diálogo que se abrirá será similar:
En esta ventana deberás especificar el fotograma al que quieres saltar. Podrás referirte
a él como un número o como una etiqueta (si se le fue asignada una).
De todas formas es recomendable el uso de la opción Relativo, pues así el salto se hará
respecto al objeto en sí y no al lugar en el que se encuentra.
Los MovieClips
En el tema de Clips de Película vimos que se tratan de objetos con línea de tiempo
propia.
Podemos utilizarlos para incluir elementos en nuestra película con una animación
independiente. De este modo aunque la película principal esté detenida el clip seguirá
actuando según su propio cabezal de reproducción.
Existen métodos para manejar la línea de tiempo de los clips, idénticas a las anteriores,
y que veremos a continuación.
Fíjate en cómo hemos escrito la función. Primero hemos señalado el clip sobre el que
queremos actuar escribiendo su nombre de instancia:
De esta forma (y como hemos visto en temas anteriores) podemos acceder a todas las
propiedades del clip. Escribiendo esta línea haremos que el clip se haga invisible:
on (release) {
miClip._visible = false;
}
Pero, ¿qué pasa si queremos ejecutar la orden desde dentro de clipPadre? Imagina que
dentro del movieclip hay un botón y el clip clipHijo. Queremos que al pulsar el botón se
reproduzca el fotograma 20 de clipHijo, entonces deberíamos escribir lo siguiente en las
acciones del botón:
on (release) {
clipHijo.gotoAndPlay(20);
}
Como puedes ver esta vez no hemos mencionado a clipPadre en la línea de código. No
es necesario porque ya nos encontramos dentro de él.
Donde this indica el clip donde nos encontramos y _parent hace que nos coloquemos
en el nivel inmediatamente superior.
De esta forma, sólo deberemos escribir la ruta de contenedores o padres hasta llegar al
objeto del cual queremos modificar o ejecutar un método.
Igual que vimos antes con los botones, los movieclips tienen manejadores que nos
permitirán ejecutar código dependiendo de los eventos que se produzcan sobre ellos.
Este bloque de código debe situarse en las acciones del movieclip (igual que hacemos
con los botones). Es por ello que al referirnos a la propiedad _visible escribimos
antesthis para referenciar el clip en cuestion.
Nota: Estos manejadores son tan válidos para movieclips como para la película general
en sí, pues podríamos considerar que una película es un movieclip más grande.
También existen modos de capturar estos eventos sin tener que escribir el código dentro
del movieclip.
Estos eventos tienen que asociarse con una función (veremos este concepto en el punto
siguiente). Pero de esta forma podemos escribir el código directamente sobre el fotograma
y controlar cuando se ejecuta una acción sobre el movieclip.
avanzado.
Veamos el ejemplo:
Si observas tenemos dos movieclips en la película, uno de ellos llamado estrella, y el
otro detalle. La línea de tiempo de estos movieclips tendría este aspecto:
Como puedes ver tenemos una cuarta capa que se llama acciones. Allí colocaremos las
acciones que se asociarán a este fotograma:
estrella.onPress = function() {
estrella.gotoAndPlay("desaparece");
detalle.gotoAndPlay("aparece");
}
Este código hará que cuando se presione el clip estrella se desplacen los cabezales en
los clips detalle y estrella a las etiquetas de fotogramas que se indican.
Esto hará algo parecido a lo anterior, cuando se presione el clip detalle los cabezales de
ambas películas se desplazarán a las respectivas etiquetas de fotograma.
Puedes manejar otros eventos además de los mencionados anteriormente
(onPress, onRelease, onRollOver, onRollOut, onKeyDown y onKeyUp), y son los
siguientes:
• onDragOut = function() {}: se ejecuta cuando se presiona el
movieclip y, sin soltarlo, el ratón se desplaza fuera de él.
Este código hace que cuando se pierda el foco sobre miClip este se detenga
(miClip.stop();) y que el siguiente objeto en tomar el foco sea otroClip.
Podemos usar también los eventos onLoad y onUnLoad, que son respectivos a la
carga y descarga de movieclips. Pero estos conceptos serán explicados más adelante.
Las Variables
Las variables son contenedores donde podremos almacenar información para trabajar
con ella. Esta información puede ser modificada y leída.
En ActionScript existen 8 tipos diferentes de variables, los que más utilizaremos serán
los siguientes:
• Boolean: o booleano, puede almacenar sólo dos valores,
o true (verdadero) o false (falso).
Para declarar (crear) una variable sólo tendrás que escribir la siguiente línea:
var nombreVariable:tipoVariable = valorVariable;
Veamos el ejemplo para verlo más claro. Haremos que el clic sobre el
movieclip estrella sólo se ejecute si el detalle no está aún mostrado.
Y al revés. Que sólo se ejecute el código al hacer clic en el detalle si éste se encuentra
fuera.
var estrella_activada:Boolean = true;
estrella.onPress = function() {
if (estrella_activada == true) {
estrella.gotoAndPlay("desaparece");
detalle.gotoAndPlay("aparece");
estrella_activada = false;
}
}
detalle.onPress = function() {
if (estrella_activada == false) {
estrella.gotoAndPlay("aparece");
detalle.gotoAndPlay("desaparece");
estrella_activada = true;
}
}
Fíjate en las dos primeras líneas, se declaran dos variables booleanas. Una dice que la
estrella se encuentra activada y la otra que el detalle se encuentra desactivado.
En el onPress del clip detalle se evalúa de nuevo la variable. Esta vez debería estar en
false porque si el detalle está fuera es porque ya se ha hecho clic sobre la estrella y ha
pasado por el anterior bloque.
A medida que vayamos avanzando iremos usando otras variables de diferentes tipos.
Verás que su uso no difiere mucho al que hemos explicado ahora.
Antes de terminar con este tema deberíamos ver algo muy importante: el ámbito de las
variables.
Nota: Para explicar el ámbito de las variables utilizaremos la función trace(variable) que
envía el contenido de la variable al Panel Salida. Puedes abrir este panel
desdeVentana → Salida.
Las variables declaradas en un ámbito local sirven sólo para un bloque de función.
Veamos este ejemplo:
function miFuncion() {
var miVariable:Number = 1;
trace(miVariable);
miVariable = 2;
trace(miVariable);
}
miFuncion();
trace(miVariable);
En esta función se declara una variable y se envía su contenido al Panel Salida. Luego
modificamos el contenido de la variable y volvemos a enviar el contenido a Salida.
Observa que después llamamos a la función, esto hará que se ejecute su código, por lo
que en el Panel Salida se mostrará 1 y 2.
Utilizando las variables de esta forma sólo podremos acceder a ellas desde el bloque de
función donde están declaradas. Una vez fuera de éste las variables dejan de existir.
Las variables de ámbito global son mucho más flexibles, están disponibles en
cualquier fotograma y función.
Nota: Si en algún sitio declaras una variable local con el mismo nombre que una variable
global existente no podrás utilizar la global durante todo el ámbito en el que exista la local.
Así si escribimos:
Trace(miMatriz[5]);
Se mandará al Panel Salida el elemento 5 del array miMatriz en este caso Sábado.
Los arrays empiezan por 0, así que es conveniente que te acostumbres a rellenar la
matriz a partir de este elemento. Verás que con el tiempo te ayudará a realizar algunas
funciones.
o
var matriz3:Array=
["Lunes","Martes","Miércoles","Jueves","Viernes","Sábado","Doming
o"];
Como habrás visto en los ejemplos anteriores, una función es un bloque de código
que podemos utilizar en cualquier parte del archivo SWF con sólo llamarla:
function miFuncion() {
var miVariable:Number = 1;
trace(miVariable);
}
Como ves, crear funciones es bastante sencillo. Además podemos crear funciones un
poco más complejas enviándole parámetros:
function enviaSalida(miVariable:String) {
trace(miVariable);
}
De este modo podrás utilizar la variable miVariable dentro de la función y trabajar con
ella como quieras.
Para llamar a la función sólo deberás escribir su nombre y indicarle el parámetro que le
quieres enviar.
Puedes crear funciones con más de un parámetro, para ello sólo tendrás que separar
éstos por comas:
function miFuncion(parametro1:String, parametro2:Number,
parametro3:Boolean) {
// código
}
miFuncion("hola", 2, false);
Arrays
Esta sentencia requiere de un valor inicial, una condición que mientras se cumpla
seguirá realizando el bucle y un método de actualización del valor.
for (valorInicial; condicion; metodoActualizacion) {
Cargando Archivos
Una vez vistos todos estos conceptos pasaremos a ver una función en concreto, la
función LoadMovie.
Su uso es el siguiente:
miMovieClip.loadMovie("pelis/clip.swf");
Con esto lo que hemos hecho es cambiar el contenido del clip miMovieClip y lo hemos
sustituido por el archivo clip.swf que se encontraba en la carpeta pelis. Es sencillo,
¿verdad?
Es una variación de la anterior, aquí indicamos qué archivo queremos cargar y dónde. Si
en vez de cargarlo en miMovieClip lo cargasemos en this se cargaría en el clip en el que
está contenida la función. Incluso si éste es el clip de película principal.
Vamos al ejemplo. En la sección Encuéntranos hacemos clic en un botón de tipo texto y
nos aparece el mapa donde localizar el restaurante:
Los parámetros que le hemos pasado son el nombre de la película a cargar y su destino
(this, el propio clip donde estaba el botón).
Esto nos servirá para liberar a un movieclip de la película o imagen que habíamos
cargado, dejándolo vacío.
Su sintaxis es la siguiente:
miClip.unloadMovie();
o
unloadMovie(miClip);
Como puedes ver, al no poder indicarse un destino, deberás introducir esta función
dentro del clip que quieres modificar. Si fuese escrita en el código del fotograma actuaría
directamente sobre la película principal.
Nota: Las películas cargadas en el nivel 0 serán las que establezcan la velocidad y
tamaño de fotogramas y su color de fondo para el resto de los fotogramas añadidos en
niveles superiores.
Sigue el siguiente ejercicio paso a paso para ver cómo hacer una Película con Niveles
En esta función sólo debemos indicar el nivel donde está situada la película que
queremos descargar y cada más.
Si creamos una película con varías escenas se almacenarán todas en un solo archivo, y
el usuario tendrá que descargarse el archivo entero para poder ver aunque sea una parte
mínima de la película.
Utilizando estas funciones podemos optimizar el tiempo de descarga, pues de este modo
el usuario sólo se descargará los archivos que desee visualizar.
Cargando Información
Antes que nada añadimos un stop() en el primer fotograma para detener la acción y
reanudarla más tarde con el botón al que le hemos añadido el siguiente código:
on (release) {
gotoAndPlay (2);
}
Para que pase al fotograma dos y comience la transición. Igualmente hemos añadido
un stop() en el fotograma 11 para que se detenga la transición y espere a que se pulse de
nuevo el botón y vuelva al fotograma 2.
Ahora que conocemos el funcionamiento veamos el código que hemos añadido en los
fotogramas 1 y 6.
Fotograma 1:
stop();
var archivo:String = "diapositivas.txt";
var total:Number = 4;
var imagenActual:Number = 1;
Ahora declararemos el cargador que sacará la información del archivo txt y lo pasará a
las cajas de texto.
Para ello utilizaremos el objeto LoadVars, este objeto permite enviar o recoger variables
en forma de URL.
La forma en la que lo hace es sencilla, a cada símbolo & que encuentre entenderá que
lo siguiente que encuentre será el nombre de una variable (igualada a su valor).
De esta forma cuando el objeto LoadVars cargue el archivo verá que hay 8 variables, y
cada una de ellas con su respectivo valor.
Por tanto, si la carga se efectúa correctamente el valor de exito será true, y false si no
pudo cargar el archivo.
Por ello el código que se ejecuta al cargar el archivo evalúa si la carga se realizó con
éxito.
if (exito) {
}
else {
Si se pudo cargar, recuperamos las variables del archivo. Tendremos que acceder a
ellas a través del cargador. cargador.titulo1 nos dará el valor de la variable titulo1.
Para poder hacerlo deberemos utilizar la función eval(), que construirá el nombre y
luego lo recuperará:
eval("cargador.titulo"+imagenActual)
Una vez hemos averiguado cómo sacar la variable la adjudicamos al campo de texto:
textoDiapositiva.titulo_txt.text = eval("cargador.titulo" +
imagenActual);
Ahora cada vez que intentemos cargar algún archivo con cargador se ejecutará todo
este código, y si la carga se efectuó de forma correcta se asignarán las variables
correspondientes a las cajas de texto.
Y como en la variable archivo habíamos guardado la ruta del txt donde están las
variables necesarias habremos terminado.
Ahora veremos que hemos escrito en el fotograma 6 para que se carguen las imágenes
y texto que correspondan:
if (imagenActual >= total) {
imagenActual = 1;
}
else {
imagenActual++;
}
cargador.load(archivo); //carga del texto
loadMovie(matrizImagenes[imagenActual-1], contenedor); //carga
de la imagen
Esta condición hará el efecto de que cuando se vea la última imagen y se pulse
siguiente se visualice de nuevo la primera.
Button (Botón):
• icon: Añade un icono al botón. Para insertar un icono deberás
crear un gráfico o clip de película y guardarlo en la Biblioteca.
Una vez allí selecciónalo y haz clic derecho sobre él y
selecciona Vinculación. Marca la casilla Exportar para
ActionScript en el cuadro de diálogo que aparecerá y dale un
nombre en Identificador. Este nombre es el que deberás
escribir en el campo icon del componente botón. Ni el botón ni
el símbolo se ajustará al tamaño del otro, así que deberás
modificar sus tamaños para que el icono no sobresalga del
botón.
List (Lista):
• data: Matriz donde determinaremos el valor qué devolverá el
componente al seleccionar determinada posición.
• labels: Matriz donde determinaremos el nombre de los
elementos de la lista. Estos elementos se corresponderán uno a
uno a los valores de la matriz introducida en data. Para ambas
propiedades se abrirá el mismo cuadro de diálogo visto para
el ComboBox.
El componente Alert
El componente Alert es muy útil pero se utiliza de forma diferente al resto de los
anteriores.
Este elemento nos permitirá el uso de avisos en forma de pop-ups. Para utilizarlo
deberás seleccionarlo en el Panel Componentes y arrastrarlo hasta la Biblioteca.
No lo arrastres sobre el escenario, pues no es necesario. Con que se halle presente en
nuestra biblioteca podremos realizar llamadas al componente. Para ello sólo deberemos
escribir:
Import mx.controls.Alert;
Alert.show("mensaje");
Hay que tener cuidado con este método, pues mientras en otros lenguajes de
programación las alertas detienen la ejecución del código a espera de la aceptación del
mensaje, ActionScript sigue ejecutando el resto de líneas.
Podremos añadir detectores para que se evalúen las acciones realizadas sobre la
alerta utilizando manejadores de eventos. En seguida veremos cómo.
Cuando utilices este método para escribir los mensajes de alerta deberás tener en
cuenta que tienes que escribir todas las propiedades en orden y sin saltarte ninguna.
o
Alert.show("Mensaje de alerta.", "Título", Alert.OK |
Alert.CANCEL, null, miManejador, "icono");
o
Alert.show("Mensaje de alerta.", "Título", Alert.OK |
Alert.CANCEL, null, miManejador);
o
Alert.show("Mensaje de alerta.", "Título", Alert.OK |
Alert.CANCEL, null);
o
Alert.show("Mensaje de alerta.", "Título", Alert.OK |
Alert.CANCEL);
o
Alert.show("Mensaje de alerta.", "Título);
Botones de Formulario
Como puedes ver, hemos creado un escuchador para reset_btn. Cuando se activa
simplemente vaciamos el contenido de los campos de texto que queramos.
Para el botón de envío deberás asociar un escuchador del mismo modo, pero el código
que irá incluido en él deberá enviar los datos, que será lo que veamos en el siguiente
apartado.
Envío de formularios
A partir de ahora veremos cómo afrontar el envío y la recepción de datos con formularios.
Lo haremos a través de este ejemplo, donde encontraremos elementos de entrada (en los que
tendremos que escribir datos para enviarlos) y de salida (donde tendremos que recoger datos de un
archivo externo para mostrarlo).
Su uso es el siguiente:
var escuchadorEnvia:Object = new Object();
escuchadorEnvia.click = function(evt:Object) {
var envio:LoadVars = new LoadVars();
envio.onLoad = function(exito:Boolean) {
if (exito) {
nombre_txt.text = "";
mail_txt.text = "";
mensaje_txt.text = "";
}
else {
Alert.show("Ha habido un error en el envío");
}
}
Dentro del código de éste hemos declarado un objeto LoadVars llamado envio.
Si quieres que el script que se ejecuta se abra en una ventana deberás indicarlo en el
segundo parámetro.
De este modo podemos añadir un controlador onLoad para evaluar si el envío se realizó
correctamente. En el segundo parámetro deberemos indicar cuál será el objeto que se
cargará (en nuestro caso el mismo objeto envio).
Que vacía los campos si la carga del script se realizó correctamente o muestra una
alerta en caso contrario.
Nosotros en el ejemplo hemos añadido algunos validadores para asegurar que todos los
campos se han rellenado. Así, antes de declarar el objeto LoadVars hemos introducido
unas cuantas condiciones del tipo:
if (nombre_txt.text.length == 0) {
Alert.show("Introduce tu nombre", "Error", Alert.OK);
return false;
}
Donde se evalúa la longitud del texto del campo nombre. Si llega a la línea return
false; se saldrá de la función y no llegará a enviar los datos.
El script enviar_comentario.php se encargaría de recibir los datos, tratarlos y luego
almacenarlos o enviarlos por correo.
Recuperando información
En puntos anteriores vimos cómo utilizar el objeto LoadVars para leer información de
archivos externos. En este apartado veremos cómo recuperar información de un archivo
XML.
Para ello y el primer paso será crear un objeto del tipo XML:
var comentarios:XML = new XML();
Hemos creado un objeto XML llamado comentarios. Ahora podremos utilizarlo para
leer un archivo XML y tomar la información contenida en él.
Una propiedad muy útil del objeto XML es la de ignoreWhite, que ignorará aquellos
campos que estén en blanco y así no tendremos que preocuparnos por posibles errores:
comentarios.ignoreWhite = true;
El groso del código que hemos añadido para cargar los datos es el siguiente:
comentarios.onLoad = function(exito:Boolean) {
if (exito) {
comentarios_txt.text = "";
// y repetimos el bucle
}
} else {
comentarios_txt.text = "No se pudieron cargar los
datos";
}
}
comentarios.load("lee_comentarios.php");
Como puedes ver en la última línea cargamos un script php que genera un documento
XML en el objeto comentarios.
Si la carga tuvo éxito, procedemos a coger la información del archivo XML generado. Lo
primero que hacemos es vaciar el contenido del área de texto comentarios_txt.
comentarios_txt.text = "";
Un archivo XML tiene la estructura muy similar a un archivo HTML, ya que también está
basado en etiquetas. El contenido de nuestro archivo es algo parecido a esto:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<listadoComentarios>
<comentario>
<autor>josé</autor>
<email>jose@correo.com</email>
<mensaje>estoy escribiendo un mensaje</mensaje>
</comentario>
<comentario>
<autor>amparo</autor>
<email>amparo@correo.com</email>
<mensaje>este mensaje también se publicará</mensaje>
</comentario>
<comentario>
<autor>miguel</autor>
<email>miguel@correo.com</email>
<mensaje>mensaje de prueba</mensaje>
</comentario>
<comentario>
<autor>cristina</autor>
<email>cristina@correo.com</email>
<mensaje>esto funciona!</mensaje>
</comentario>
</listadoComentarios>
Para navegar por los nodos a través del objeto XML utilizaremos las
propiedades firstChild (que referencia la etiqueta contenida inmediatamente después
de aquella en la que nos encontramos) y childNodes (que hace referencia al conjunto
de nodos con el mismo nombre dentro de la etiqueta en la que nos encontramos).
Una vez sepamos cuantas entradas tenemos almacenadas, haremos un bucle para
sacarlas todas. Este bucle lo empezaremos desde el final para tener así las entradas más
recientes al principio y las más antiguas al final.
Ahora crearemos una nueva variable llamada miXML que contendrá la ruta completa del
nodo comentario para cada una de las vueltas del bucle, así no tendremos que escribirla
entera cada vez que queramos acceder a ella.
var miXML:XMLNode = this.firstChild.childNodes[i];
Como este nodo tiene tres hijos con distinto nombre haremos referencia a ellos
como miXML.childNodes[0], miXML.childNodes[1] y miXML.childNodes[2].
Una vez hallamos comprendido bien estos conceptos sólo hará falta verter el contenido
de los nodos (utilizando la propiedad nodeValue) en variables que crearemos a su efecto:
var autor:String = miXML.childNodes[0].firstChild.nodeValue;
var email:String = miXML.childNodes[1].firstChild.nodeValue;
var mensaje:String = miXML.childNodes[2].firstChild.nodeValue;
comentarios_txt.text += cadenaFinal;
El bucle se repetirá de este modo para cada uno de los nodos comentarios y cuando
termine habremos acabado y toda la información contenida en el archivo XML estará
(formateada como HTML) en el área de texto.
Además de todo lo que hemos visto existen, también, otras propiedades bastante
interesantes.
Por ejemplo, el orden de tabulación. Esta propiedad establece como actúa el cursor a
las repetidas pulsaciones de la tecla Tabulador.
Fácil ¿verdad?
De este modo en las validaciones que vimos antes podemos hacer lo siguiente:
if (mail_txt.text.length == 0) {
Selection.setFocus(mail_txt);
Alert.show("Introduce tu correo electrónico", "Error",
Alert.OK);
return false;
}
Así si no se ha rellenado algún campo el foco se sitúa directamente sobre él para que el
usuario lo rellene sin tener que desplazarse.
Estilos CSS
Podemos asignar estilos CSS al contenido de una caja de texto que acepte HTML.
.mensaje {
font-style: italic;
}
Fácil. Basta con declarar un nuevo objeto del tipo TextField.StyleSheet y asociarlo
a comentarios_txt.
Incorporar Fuentes
Otro de los problemas con los que nos toparemos cuando trabajemos con flash serán las
fuentes que utilicemos.
Solamente deberás incluir en tu proyecto aquellas fuentes que quieras utilizar para los
textos dinámicos y de entrada, pues Flash se encargará de gestionar aquellas que
utilices en los estáticos.
Para incorporar una fuente en tu película deberás hacer clic derecho en alguna parte
vacía de la Biblioteca y seleccionar Nueva fuente.
Objetivo.
Introducción
Como comentamos al principio del curso podemos ver que Flash 8 incorpora una nueva
característica: los Filtros.
En este tema veremos los filtros disponibles, su uso y como manejarlos mediante
ActionScript.
Para ilustrar su funcionamiento mostraremos ejemplos de cómo afectan los filtros a esta
imagen:
Antes de empezar resaltaremos una cosa. En ActionScript los colores se indican
mediante una cadena de 8 caracteres con un componente hexadecimal: 0xRRVVAA.
Las dos primeras serán siempre las mismas 0x, las dos siguientes corresponderán a la
cantidad de color rojo, las dos siguientes de verde y las dos últimas de azul.
De este modo 0x000000 sería el color negro (la ausencia de color), y 0xFFFFFF el color
blanco (con el rojo, azul y verde al máximo).
El Filtro Sombra
import flash.filters.DropShadowFilter;
miClip.filters = [sombra];
miClip.filters = [sombra];
Así en el constructor deberemos sustituir cada parámetro por el valor que queremos
darle.
Puedes omitir los parámetros que quieras, pero ten en cuenta que siempre se
interpretarán los valores que des en este orden hasta que no encuentre más.
Ejercicio paso a
paso.
1. Abre el archivo pez.fla que encontrarás en la
carpeta ejercicios/pez del curso, observa que tanto los campos
del formulario como el clip de película ya tienen un nombre de
instancia asignado.
import flash.filters.DropShadowFilter;
6. sombra.distance = distance_stp.value;
7. sombra.angle = angle_stp.value;
8. sombra.color = 0x000000;
9. sombra.alpha = alpha_stp.value;
10. sombra.blurX = blur_stp.value;
11. sombra.blurY = blur_stp.value;
12. sombra.strength = strength_stp.value;
13. sombra.quality = quality_cmb.selectedItem.data;
14. sombra.inner = inner_chk.value;
15. sombra.knockout = knockout_chk.value;
sombra.hideObject = hideObject_chk.value;
pez.filters = [sombra];
Hemos creado una película donde podemos cambiar las propiedades de un filtro
dinámicamente. Fácil ¿verdad?.
El Filtro Desenfocar
import flash.filters.BlurFilter;
miClip.filters = [desenfocar];
import flash.filters.BlurFilter;
miClip.filters = [desenfocar];
Así en el constructor deberemos sustituir cada parámetro por el valor que queremos
darle.
Puedes omitir los parámetros que quieras, pero ten en cuenta que siempre se
interpretarán los valores que des en este orden hasta que no encuentre más.
El Filtro Iluminado
import flash.filters.GlowFilter;
miClip.filters = [iluminado];
import flash.filters.GlowFilter;
miClip.filters = [iluminado];
Así en el constructor deberemos sustituir cada parámetro por el valor que queremos
darle.
Puedes omitir los parámetros que quieras, pero ten en cuenta que siempre se
interpretarán los valores que des en este orden hasta que no encuentre más.
El Filtro Bisel
import flash.filters.BevelFilter;
También podrías crear el bisel directamente con todas sus propiedades en el constructor
de este modo:
import flash.filters.BevelFilter;
miClip.filters = [bisel];
Así en el constructor deberemos sustituir cada parámetro por el valor que queremos
darle.
Puedes omitir los parámetros que quieras, pero ten en cuenta que siempre se
interpretarán los valores que des en este orden hasta que no encuentre más.
Utilizando este filtro podremos añadirle una iluminación (como en el filtro anterior) a la
imagen, pero con la característica de que esta iluminación estará compuesta por un
degradado:
Sus opciones son las siguientes:
• .alphas: determina matriz de valores de transparencia alfa (de 0
a 1) para los colores correspondientes de la matriz colors.
import flash.filters.GradientGowFilter;
miClip.filters = [iluminado];
También podrías crear la iluminación directamente con todas sus propiedades en el
constructor de este modo:
import flash.filters.GradientGowFilter;
miClip.filters = [iluminado];
Así en el constructor deberemos sustituir cada parámetro por el valor que queremos
darle.
Puedes omitir los parámetros que quieras, pero ten en cuenta que siempre se
interpretarán los valores que des en este orden hasta que no encuentre más.
Igual que el filtro que hemos visto anteriormente, este filtro es capaz de mostrar un bisel
sobre el objeto, pero añadiendo un degradado a la forma de éste:
import flash.filters.GradientBevelFilter;
miClip.filters = [bisel];
También podrías crear el bisel directamente con todas sus propiedades en el constructor
de este modo:
import flash.filters.GradientBevelFilter;
miClip.filters = [bisel];
Así en el constructor deberemos sustituir cada parámetro por el valor que queremos
darle.
Puedes omitir los parámetros que quieras, pero ten en cuenta que siempre se
interpretarán los valores que des en este orden hasta que no encuentre más.
import flash.filters.ColorMatrixFilter;
miClip.filters = [ajustaColor];
Esta propiedad almacena una matriz que no puede ser editada directamente. Así
que si queremos modificar los filtros que afectan a un objeto tendremos que darle una
nueva matriz a la propiedad y desechar la anterior.
Así, si queremos añadirán nuevo filtro al objeto miClip deberemos escribir lo siguiente:
nuevaMatriz.push(sombra);
miClip.filters = nuevaMatriz;
Como puedes ver, lo que hacemos es guardar los filtros exitentes en una
matriz nuevaMatriz, introducimos el nuevo filtro en ella con el método push() y luego le
asignamos los filtros que contienemiMatriz al clip miClip.
Como esta propiedad se trata de una matriz también podemos acceder a los filtros de
esta forma:
var nuevaMatriz:Array = miClip.filters;
nuevaMatriz[0].blurX = 15;
nuevaMatriz[0].blurY = 15;
miClip.filters = nuevaMatriz;
Fácil, ¿verdad? El único problema que tiene este método es que deberás recordar el
lugar que ocupa cada filtro en la matriz. Recuerda que el método push() inserta un
elemento en una matriz siempre en último lugar.
Introducción
Con Flash cada vez es más fácil añadir vídeos a nuestras presentaciones o webs. En
particular Flash 8 incorpora una serie de características que facilitan la tarea al máximo y
permiten el uso de vídeos como si se tratase de cualquier otro objeto en pantalla.
Este formato, además de crear archivos de vídeo de buena calidad muy comprimidos,
te permitirá introducir puntos de referencia desde donde controlaremos la interacción del
entorno de la película con el vídeo.
Creando puntos de Navegación podremos referenciarnos más tarde a ellos para saltar
en la película. Sería algo así como crear capítulos sobre los que podremos navegar
utilizando botones y ActionScript.
Puedes realizar el ejercicio paso a paso de Puntos de Referencia para ver cómo lo
hacerlo.
El Componente FLVPlayback
Si ya tuvieses el archivo importado a flv no haría falta que realizases las acciones
anteriores, sólo deberás insertar en el escenario un componente que incorpora Flash para
la reproducción de éste.
Abre el Panel Componentes desde Ventana → Componentes y haz clic sobre FLV
Playback - Player 8. Arrastra un componente FLVPlayBack al Escenario.
• BufferingBar: muestra el
progreso de descarga del vídeo.
• ForwardButton: avanza el flujo del vídeo al punto de referencia
inmediatamente posterior o en su defecto al final de éste.
miVideo.volume = 0;
miVideo.pauseButton =
miBotonPausa;
miVideo.playPauseButton =
miBotonPausaPlay;
miVideo.stopButton =
miBotonStop;
mVideo.backButton =
miBotonAtras;
miVideo.forwardButton =
miBotonAdelante;
miVideo.muteButton =
miBotonSilencio;
miVideo.volumeBar =
miBarraVolumen;
miVideo.seekBar =
miBarraDeslizadora;
miVideo.bufferinBar =
miBarraProgreso;
miVideo.play();
• stop(): detiene el vídeo y vuelve al inicio.
miVideo.stop();
miVideo.pause();
miVideo.seek(5);
Esta línea colocará la cabeza lectora en el segundo 5 y
reproducirá a partir de ahí.
miVideo.volume = 50;
on (release) {
if (miVideo.state ==
miVideo.PAUSED) {
miVideo.play();
}
else {
miVideo.pause();
}
}
miVideo.seekToNavCuePoint("ini
cio");
miVideo.play();
}
miVideo.seekToNextNavCuePoint(
);
miVideo.seekToPrevNavCuePoint(
);
mensaje.gotoAndPlay(puntoRef.i
nfo.parameters["fotograma"]);
}
}
miVideo.addEventListener("cueP
oint", eventosVideo);
Juegos
23. Búsqueda
Introducción
Manejando Elementos
Las
propiedades _xscale e _yscale cambian
el tamaño, pero de forma porcentual.
Podemos utilizar estas propiedades para
hacer un clip el doble de grande que
era, por ejemplo:
miClip._width = 100;
miClip._height = 100;
miClip._xscale = 200;
miClip._yscale = 200;
posicionDeClipHorizontal
= miClip._x;
posicionDeClipVertical =
miClip._y;
miClip.gotoAndStop("para
do");
miClip._x = 10;
miClip.onPress =
function() {
if (miClip._x <= 10) {
miClip.gotoAndStop("dere
cha");
derecha = true;
}
if (miClip._x >= 495)
{
miClip.gotoAndStop("izqu
ierda");
izquierda = true;
}
}
_root.onEnterFrame =
function() {
if (derecha) {
if (miClip._x <
495) {
miClip._x =
miClip._x + 6;
}
else {
miClip.gotoAndStop("para
do");
derecha =
false;
}
}
if (izquierda) {
if (miClip._x >
10) {
miClip._x =
miClip._x - 6;
}
else {
miClip.gotoAndStop("para
do");
izquierda =
false;
}
}
}
Utilizando la
función Math.atan2 recuperaremos el
ángulo formado por unas coordenadas
en el espacio respecto a un punto
central.
Veamos un ejemplo:
En la ventana que se
abrirá haz clic
sobre Exportar para
ActionScript y dale
un nombre al cual te podrás
referir cuando lo cargues
con attachMovie().
En la primera variable
deberemos introducir el
nombre del objeto tal y
como lo escribimos en la
vinculación. La
variable nombreInstancia al
macenará el nombre de
instancia al cual podremos
referirnos más tarde para
acceder a las propiedades y
métodos del objeto creado.
En la
variable opciones podrás ini
cializar el objeto con las
propiedades definidas
desde un inicio, deberás
introducirlas entre
llaves {} y separadas por
comas. Este parámetro
es opcional.
this.attachMovie
("objeto",
"miClip", 5,
{_x:0, _y:0});
Para eliminar clips insertados
mediante attachMovie puedes
utilizar removeMovieClip() o unloadMovie(
):
miClip.removeMovieClip();
Utilizando las
funciones StartDrag() y StopDrag() es muy
sencillo arrastrar y colocar objetos por
el Escenario, para ello deberás introducir
sólo dos eventos de clip en el objeto a
arrastrar:
• En el evento press (cuando aún no se ha soltado el botón del
ratón) comenzaremos el arrastre:
• on (press) {
• startDrag(this);
}
• on (release) {
• stopDrag();
}
La función startDrag permite varios
parámetros:
startDrag(objetoArrastar,
bloqueaCentro, izquierda,
arriba, derecha, abajo);
Fácil, ¿verdad?
Mouse.hide();
var
escuchador:Object =
new Object();
escuchador.onMouseM
ove = function() {
miCursor._x =
_xmouse;
miCursor._y =
_ymouse;
}
Mouse.addListener(e
scuchador);
En el código insertamos un
objeto llamado miCursor que
será una instancia del
clip cursor que habremos
guardado en la
Bilioteca. Escondemos el
cursor. Y añadimos
un escuchador que haga que el
clip miCursor se posicione en
el lugar delMouse a cada
movimiento de éste.
Funciones Avanzadas
miProyectil._y =
-miProyectil._width;
var scale:Number =
randRange(80, 100);
miProyectil._xscale = scale;
miProyectil._yscale = scale;
miProyectil._alpha = scale;
miProyectil.speed =
velocidad+randRange(0,
3)+level;
miProyectil._x = randRange(10,
540);
this.createTextField("estadist
icas_txt", 5000, 10, 0, 530,
22);
estadisticas_txt.setNewTextFor
mat(miFormato);
estadisticas_txt.selectable =
false;
estadisticas_txt.tabStops =
[100, 200, 300, 400];
on (release) {
var baja:Boolean = true;
var incre_x:Number = 3.5;
var incre_y:Number = 8;
var suelo:Number = 280;
var tope:Number = 0;
var elasticidad:Number = 3;
bola_mc._y = 0;
bola_mc._x = 0;
tope += (suelo - bola_mc._y) /
elasticidad;
var repeticion:Number;
function botar() {
if (baja) { // baja
bola_mc._y += incre_y;
bola_mc._x += incre_x;
if (bola_mc._y>=suelo) {
baja = false;
}
} else { // sube
bola_mc._y -= incre_y;
bola_mc._x += incre_x;
if (bola_mc._y<=tope) {
baja = true;
if (tope>=suelo) {
incre_y = 0;
clearInterval(repeticion);
}
tope += (suelo -
bola_mc._y) / elasticidad;
}
}
}
clearInterval(repeticion);
repeticion = setInterval(botar,
35);
}
•
bola_mc.onEnterFrame =
function() {
• trace("ejecutando: "+ ++i);
• if ( i > 30 ){
• delete
this.onEnterFrame;
• }
}
• Si la velocidad de la película es
de 12 fps, este código escribiría
en la salida 12 líneas por
segundo, de esta forma:
• ejecutando:1
• ejecutando:2
• ejecutando:3
• ...
• Como puedes ver hemos añadido
una condición para que cuando el
valor de i sea mayor de 30 acabe
la ejecución del
controlador onEnterFrame y así
evitar que se ejecute
indefinidamente.
•
• Aunque con este ejemplo no lo parezca,
(sólo pretende explicar la función) estas
dos tipo de funciones que se ejecutan
repetitivamente pueden ser muy útiles en
determinadas ocasiones. A lo largo del
cursos ya hemos visto algunos ejemplos
de su utilidad, a continuación veremos otro
ejemplo que puede sernos útil.
• Imagínate que quieres que tu pelicula se
detenga durante 2 segundos y luego
continue. Esta es una forma de hacerlo
utilizando la función setInterval.
•
• Colocariamos este código en el frame que
deseemos, llamamos a setInterval con 1
sg (1000 milisg) y cuando se hallan
cumplido dos llamadas
detenemos setInterval y continuamos con
el siguiente frame de la película.
• var tope:Number = 1;
• var repeticion:Number =
setInterval(parar, 1000);
• function parar() {
• tope++;
• if (tope > 2) {
• clearInterval(repeticion);
• nextFrame();
• play();
• }
• }
• stop();
•
Movimiento de
objetos mediante
guía
•
• En esta unidad ya hemos visto como hacer
botar una bola mediante ActionScript,
ahora vamos a recordar una técnica que
ya vimos en la unidad 9, animación
mediante guía de movimiento.
• En este caso, se trata de imitar el bote de
una pelota, por lo tanto, dibujamos una
curva que imite dicho bote.
• De esta forma conseguiremos una
animación que resulta más natural que el
bote con trayectoría recta que vimos en el
punto anterior.
•
•
•
En las imágenes podrás ver que
proceso hemos seguido para dibujar el
movimiento.
La guía la hemos
dibujando sucesivas curvas de modo
que la pelota invite el movimiento que
queremos crear.
•
• Ahora podrás combinar muchas de las
técnicas que hemos aprendido para
generar algo así:
• (Haz clic en la película y luego usa las
teclas de movimiento a derecha e
izquierda)
•
•
• Hemos visto dos técnicas diferente para
animar un objeto en Flash, mediante
ActionScript y mediante guía de
movimiento.
• Según cada caso concreto resultará más
adecuado eligir una u otra técnica. En
general, resulta más fácil y rápido utilizar
guías de movimiento que ActionScript,
sobre todo si el movimiento que tiene que
seguir el objeto es sinuoso y dificil de
definir en términos de una ecuación
matemática.
• Hay casos en los que será más adecuado
utilizar ActionScript y otros casos en los
que sólo será posible crear el movimiento
mediante ActionScript, por ejemplo, si
queremos que un objeto se mueva de
forma aleatoria por un escenario.
Existen multitud de
movimientos complejos
que se pueden imitar con
animaciones Flash, es
evidente que no
podemos verlos todos,
por lo tanto hemos
elegido uno bastante
común y que nos puede
servir como base para
explicar unos cuantos
conceptos. Se trata de
imitar el movimiento de
una persona corriendo.
Esperamos que con estas
explicaciones seas capaz
de realizar variaciones
más complejas, como
podrian ser hacer que el
muñeco practicase
diferentes deportes.
Vamos a explicar
cómo realizar la
animación que puedes
ver en esta página. Para
simplificar hemos
dibujado una persona de
forma esquemática.
A la hora de
plantearnos cómo
realizar una animación
de este tipo, lo primero
que debemos hacer
es analizar el
movimientopara ver si
está compuesto por
elementos que se
repiten, o si se puede
separar en distintos
componentes o cualquier
otra situación que nos
permita simplificar la
animación.
En esta imagen
puedes ver el
movie
clip "brazo_adela
nte", hemos creado
una capa para la
parte superior del
brazo y hemos
hecho que gire
sobre su extremo
superior (hombro).
Para el antebrazo
henos creado otra
capa con su capa
guía, la capa guía
sirve para que la
parte superior del
antebrazo siga la
trayectoria que
describe el extremo
inferior (codo).
También hemos
incluido un giro en
el antebrazo.
En esta imagen intentamos explicar como
están colocados los dos movieclips que
forman el movimiento de los brazos en la
línea del tiempo..
Sólo nos
queda ver un
detalle
interesante.
Hemos
considerado
idénticos el
movimiento del
brazo hacia
adelante y del
brazo hacia
atrás y la
animación
queda bastante
bien.
Sin embargo
¿Podemos decir
lo mismo del
movimiento de
las piernas?
Claramente
no, ya que
cuando la
pierna va hacia
atrás debe
apoyarse en el
suelo, mientras
que cuando va
hacia adelante
no debe tocar el
suelo.
Si comparas las
dos imágenes de la
derecha podrás
observar como
hemos incluido un
fotograma clave en
la"pierna_adelante
" para poder
mantener la
pantorrilla en
posición más
horizontal y que no
toque el suelo.
Rotoscopia
•
La rotoscopia es una
técnica que utiliza un
movimiento real como
patrón para calcar las
imagenes de la
animación. Hace años
que se utiliza esta
técnica, por ejemplo, en
las películas de dibujos
animados para conseguir
movimientos realistas al
caminar.
Luego importaremos
el vídeo al formato de
Flash, pero esta vez lo
haremos de forma
diferente a la que
aprendimos en el tema
Vídeos.
•
•
•
Esto hará
que el vídeo se
exporte de
forma que lo
podremos
visualizar
fotograma a
fotograma.
Sigue el resto
de opciones
hasta el final y
el vídeo se
colocará en la
línea de
tiempo.
Luego
crearemos una
nueva capa
por encima y
crearemos
tantos fotogra
mas
claves como
fotogramas de
película
queramos
copiar. El resto
es sencillo, coje
un pincely a
calcar. Cuanta
más precisión
consigas, más
impresionantes
serán los
resultados.
Este proceso
es muy
laborioso, pero
crea
animaciones
espectaculares.
Practica un
poco y verás
como no es
nada
complicado, te
requerirá
bastante
paciencia, pero
la película final
te valdrá la
pena.
Si quieres
mantener el
audio, cuando
importes el
vídeo
selecciona
que quieres
mantener el
audio y el
vídeo
separados. Así
cuando
elimines la
capa de vídeo
tu
animación man
tendrá el
sonido de la
película. Tus
animaciones
serán capaces
de hablar!
Terminamos la
instrucción con endFill().