ActionScript es el lenguaje de programación para el entorno de tiempo de ejecución de Adobe Flash Player. Activa, entre otras muchas cosas, la interactividad y la gestión de datos en el contenido y las aplicaciones de Flash.
1/ Características generales:
• ActionScript es el lenguaje de programación propio de Flash. El ActionScript está basado en la especificación ECMA-262, al igual que otros lenguajes como Javascript.
• ActionScript es, como su nombre indica, un lenguaje de script, esto quiere decir que no hará falta crear un programa completo para conseguir resultados, normalmente la aplicación de fragmentos de código ActionScript a los objetos existentes en nuestras películas nos permiten alcanzar nuestros objetivos.
• ActionScript 3 es un lenguaje de programación orientado a objetos. Tiene similitudes, por tanto, con lenguajes tales como los usados en el Microsoft Visual Basic, en el Borland Delphi etc... y aunque, no tiene la potencia de estos lenguajes, cada versión se acerca más. Así, la versión 3.0 utilizada en Flash CS4 es mucho más potente y mucho más "orientada a objetos" que su anterior versión 2.0.
• La sintaxis ActionScript presenta muchísimos parecidos con el Javascript o PHP; si estamos familiarizados con estos lenguajes, la sintaxis y el estilo de ActionScript nos resultarán muy familiares.
• En la mayor parte de las ocasiones, será necesario "programar". Flash CS4 pone a nuestra disposición una biblioteca de funciones, clases y métodos (de momento entenderemos esto como "código ActionScript que realiza una función determinada") ya implementadas que realizan lo que buscamos, bastará con colocarlas en el lugar adecuado.
2/ Variables y constantes:
Dado que la programación implica principalmente cambiar datos en la memoria del equipo, tiene que haber una forma de representar un solo dato en el programa. Una variable es un nombre que representa un valor en la memoria del equipo. Cuando se escriben sentencias para manipular valores, se escribe el nombre de la variable en lugar del valor; cuando el equipo ve el nombre de la variable en el programa, busca en su memoria y utiliza el valor que allí encuentra. Por ejemplo, si hay dos variables denominadas value1 y value2, cada una de las cuales contiene un número, para sumar esos dos números se podría escribir la sentencia:
value1 + value2
Cuando lleve a cabo los pasos indicados, el equipo buscará los valores de cada variable y los sumará.
En ActionScript 3.0, una variable se compone realmente de tres partes distintas:
• El nombre de la variable
• El tipo de datos que puede almacenarse en la variable
• El valor real almacenado en la memoria del equipo
Se acaba de explicar cómo el equipo utiliza el nombre como marcador de posición del valor. El tipo de datos también es importante. Cuando se crea una variable en ActionScript, se especifica el tipo concreto de datos que contendrá; a partir de ahí, las instrucciones del programa sólo pueden almacenar ese tipo de datos en la variable y se puede manipular el valor con las características particulares asociadas a su tipo de datos. En ActionScript, para crear una variable (se conoce como declarar la variable), se utiliza la sentencia var:
var value1:Number;
En este caso, se ha indicado al equipo que cree una variable denominada value1, que contendrá únicamente datos numéricos ("Number" es un tipo de datos específico definido en ActionScript). También es posible almacenar un valor directamente en la variable:
var value2:Number = 17;
3/ Tipos de datos:
En ActionScript se pueden utilizar muchos tipos de datos para las variables que se crean. Algunos de estos tipos de datos se pueden considerar "sencillos" o "fundamentales":
• String: un valor de texto como, por ejemplo, un nombre o el texto de un capítulo de un libro
• Numeric: ActionScript 3.0 incluye tres tipos de datos específicos para datos numéricos:
o Number: cualquier valor numérico, incluidos los valores fraccionarios o no fraccionarios
o int: un entero (un número no fraccionario)
o uint: un entero sin signo, es decir, que no puede ser negativo
• Boolean: un valor true (verdadero) o false (falso), por ejemplo, si un conmutador está activado o si dos valores son iguales.
Los tipos de datos sencillos representan un solo dato: por ejemplo, un solo número o una sola secuencia de texto. No obstante, la mayoría de los tipos de datos definidos en ActionScript podrían describirse como tipos de datos complejos porque representan un conjunto de valores agrupados. Por ejemplo, una variable con el tipo de datos Date representa un solo valor: un momento temporal. Sin embargo, dicho valor de fecha se representa realmente con varios valores: día, mes, año, horas, minutos, segundos, etc., todos ellos números individuales. Así pues, aunque se perciba una fecha como un solo valor (y se pueda tratar como tal creando una variable Date), internamente el equipo lo considera un grupo de varios valores que conjuntamente definen una sola fecha.
La mayoría de los tipos de datos incorporados y los tipos de datos definidos por los programadores son complejos. Algunos de los tipos de datos complejos que podrían reconocerse son:
• MovieClip: un símbolo de clip de película
• TextField: un campo de texto dinámico o de texto de entrada
• SimpleButton: un símbolo de botón
• Date: información sobre un solo momento temporal (una fecha y hora)
Para referirse a los tipos de datos, a menudo se emplean como sinónimos las palabras clase y objeto. Una clase es simplemente la definición de un tipo de datos; es como una plantilla de todos los objetos del tipo de datos, como si se dijera que "todas las variables del tipo de datos Ejemplo tiene estas características: A, B y C". Por otro lado, un objeto es simplemente una instancia real de una clase; una variable cuyo tipo de datos es MovieClip podría describirse como un objeto MovieClip. Se puede decir lo mismo con distintos enunciados:
• El tipo de datos de la variable myVariable es Number.
• La variable myVariable es una instancia de Number.
• La variable myVariable es un objeto Number.
• La variable myVariable es una instancia de la clase Number.
4/ Propiedades:
Una propiedad representa uno de los elementos de datos que se empaquetan en un objeto. Un objeto Song (canción) puede tener propiedades denominadas artist (artista) y title (título); la clase MovieClip tiene propiedades como rotation (rotación), x, width (anchura) y alpha (alfa). Se trabaja con las propiedades del mismo modo que con las variables individuales; de hecho, se podría pensar que las propiedades son simplemente las variables "secundarias" contenidas en un objeto.
A continuación se muestran algunos ejemplos de código ActionScript que utiliza propiedades. Esta línea de código mueve el objeto MovieClip denominado square a la coordenada x = 100 píxeles:
square.x = 100;
Este código utiliza la propiedad rotation para que el objeto MovieClip square gire de forma correspondiente a la rotación del objeto MovieClip triangle:
square.rotation = triangle.rotation;
Este código altera la escala horizontal del objeto MovieClip square para hacerlo 1,5 veces más ancho:
square.scaleX = 1.5;
Observe la estructura común: se utiliza una variable (square, triangle) como nombre del objeto, seguida de un punto (.) y del nombre de la propiedad (x, rotation, scaleX). El punto, denominado operador de punto, se utiliza para indicar el acceso a uno de los elementos secundarios de un objeto. El conjunto de la estructura (nombre de variable-punto-nombre de propiedad) se utiliza como una sola variable, como un nombre de un solo valor en la memoria del equipo.
5/ Métodos:
Un método es una acción que puede llevar a cabo un objeto. Por ejemplo, si se ha creado un símbolo de clip de película en Flash con varios fotogramas clave y animación en la línea de tiempo, ese clip de película podrá reproducirse, detenerse o recibir instrucciones para mover la cabeza lectora a un determinado fotograma.
Este código indica al objeto MovieClip denominado shortFilm que inicie su reproducción:
shortFilm.play();
Esta línea hace que el objeto MovieClip denominado shortFilm deje de reproducirse (la cabeza lectora se detiene como si se hiciera una pausa en un vídeo):
shortFilm.stop();
Este código hace que un objeto MovieClip denominado shortFilm mueva su cabeza lectora al fotograma 1 y deje de reproducirse (como si se rebobinara un vídeo):
shortFilm.gotoAndStop(1);
Como puede verse, para acceder a los métodos, se debe escribir el nombre del objeto (una variable), un punto y el nombre del método seguido de un paréntesis, siguiendo la misma estructura que para las propiedades. El paréntesis es una forma de indicar que se está llamando al método, es decir, indicando al objeto que realice esa acción. Algunos valores (o variables) se incluyen dentro del paréntesis para pasar información adicional necesaria para llevar a cabo la acción. Estos valores se denominan parámetros del método. Por ejemplo, el método gotoAndStop() necesita saber cuál es el fotograma al que debe dirigirse, de modo que requiere un solo parámetro en el paréntesis. Otros métodos como play() y stop() no requieren información adicional porque son descriptivos por sí mismos. Sin embargo, también se escriben con paréntesis.
A diferencia de las propiedades (y las variables), los métodos no se usan como identificadores de valores. No obstante, algunos métodos pueden realizar cálculos y devolver un resultado que puede usarse como una variable. Por ejemplo, el método toString() de la clase Number convierte el valor numérico en su representación de texto:
var numericData:Number = 9;
var textData:String = numericData.toString();
Por ejemplo, se usaría el método toString() para mostrar el valor de una variable Number en un campo de texto de la pantalla. La propiedad text de la clase TextField (que representa el contenido de texto real que se muestra en la pantalla) se define como String (cadena), de modo que sólo puede contener valores de texto. Esta línea de código convierte en texto el valor numérico de la variable numericData y, a continuación, hace que aparezca en la pantalla en el objeto TextField denominado calculatorDisplay:
calculatorDisplay.text = numericData.toString();
6/ Eventos:
Básicamente, los eventos son acciones que ActionScript conoce y a las que puede responder. Muchos eventos se relacionan con la interacción del usuario (hacer clic en un botón, presionar una tecla del teclado, etc.) pero también existen otros tipos de eventos. Por ejemplo, si se usa ActionScript para cargar una imagen externa, existe un evento que puede indicar al usuario cuándo finaliza la carga de la imagen. En esencia, cuando se ejecuta un programa de ActionScript, Adobe Flash Player simplemente espera a que ocurran determinadas acciones y, cuando suceden, ejecuta el código ActionScript que se haya especificado para tales eventos.
La técnica para especificar determinadas acciones que deben realizarse como respuesta a eventos concretos se denomina gestión de eventos. Cuando se escribe código ActionScript para llevar a cabo la gestión de eventos, se deben identificar tres elementos importantes:
• El origen del evento: ¿en qué objeto va a repercutir el evento? Por ejemplo, ¿en qué botón se hará clic o qué objeto Loader está cargando la imagen? El origen del evento también se denomina objetivo del evento, ya que es el objeto al que Flash Player (donde tiene lugar realmente el evento) destina el evento.
• El evento: ¿qué va a suceder, a qué se va a responder? Es importante identificar esto porque muchos objetos activan varios eventos.
• La respuesta: ¿qué pasos hay que llevar a cabo cuando ocurra el evento?
Siempre que se escriba código ActionScript para gestionar eventos, el código debe incluir estos tres elementos y debe seguir esta estructura básica (los elementos en negrita son marcadores de posición que hay que completar en cada caso concreto):
function eventResponse(eventObject:EventType):void
{
// Aquí deben incluirse las acciones realizadas en respuesta al evento.
}
eventSource.addEventListener(EventType.EVENT_NAME, eventResponse);
Este código hace dos cosas. En primer lugar, define una función, que es la forma de especificar las acciones que desean realizarse como respuesta al evento. A continuación, llama al método addEventListener() del objeto de origen, básicamente "suscribiendo" la función al evento especificado de modo que se lleven a cabo las acciones de la función cuando ocurra el evento. Cada una de estas partes se tratará con mayor detalle.
Una función proporciona un modo de agrupar acciones con un único nombre que viene a ser un nombre de método abreviado para llevar a cabo las acciones. Una función es idéntica a un método excepto en que no está necesariamente asociada a una clase determinada (de hecho, es posible definir un método como una función asociada a una clase determinada). Cuando se crea una función para la gestión de eventos, se debe elegir el nombre de la función (denominada eventResponse en este caso) y se debe especificar además un parámetro (denominado eventObject en este ejemplo). Especificar un parámetro de una función equivale a declarar una variable, de modo que también hay que indicar el tipo de datos del parámetro. Hay una clase de ActionScript definida para cada evento y el tipo de datos que se especifica para el parámetro de función es siempre la clase asociada con el evento específico al que se desea responder. Por último, entre las llaves de apertura y cierre ({ ... }), se escriben las instrucciones que debe llevar a cabo el equipo cuando ocurra el evento.
Después de escribir la función de gestión de eventos, es necesario indicar al objeto de origen del evento (el objeto en el que se produce el evento, por ejemplo, el botón) que se desea llamar a la función cuando ocurra el evento. Para ello es necesario llamar al método addEventListener() de dicho objeto (todos los objetos que tienen eventos también tienen un método addEventListener()). El método addEventListener() utiliza dos parámetros:
• En primer lugar, el nombre del evento específico al que se desea responder. De nuevo, cada evento se asocia a una clase específica, que tiene a su vez un valor especial predefinido para cada evento (como un nombre exclusivo propio del evento), que debe usarse como primer parámetro.
• En segundo lugar, el nombre de la función de respuesta al evento. Hay que tener en cuenta que el nombre de una función debe escribirse sin paréntesis cuando se pasa como un parámetro.
7/ Objetos y clases:
En ActionScript 3.0, cada objeto se define mediante una clase. Una clase puede considerarse como una plantilla o un modelo para un tipo de objeto. Las definiciones de clase pueden incluir variables y constantes, que contienen valores de datos y métodos, que son funciones que encapsulan el comportamiento asociado a la clase. Los valores almacenados en propiedades pueden ser valores simples u otros objetos. Los valores simples son números, cadenas o valores booleanos.
ActionScript contiene diversas clases incorporadas que forman parte del núcleo del lenguaje. Algunas de estas clases incorporadas, como Number, Boolean y String, representan los valores simples disponibles en ActionScript. Otras clases, como Array, Math y XML, definen objetos más complejos que forman parte del estándar ECMAScript.
Todas las clases, tanto las incorporadas como las definidas por el usuario, se derivan de la clase Object. Para los programadores con experiencia previa en ActionScript, es importante tener en cuenta que el tipo de datos Object ya no es el tipo de datos predeterminado, aunque todas las demás clases se deriven de él. En ActionScript 2.0, las dos líneas de código siguientes eran equivalentes, ya que la ausencia de una anotación de tipo significaba que una variable era de tipo Object:
var someObj:Object;
var someObj;
En ActionScript 3.0 se introduce el concepto de variables sin tipo, que pueden designarse de las dos maneras siguientes:
var someObj:*;
var someObj;
Una variable sin tipo no es lo mismo que una variable de tipo Object. La principal diferencia es que las variables sin tipo pueden contener el valor especial undefined, mientras que una variable de tipo Object no puede contener ese valor.
Un programador puede definir sus propias clases mediante la palabra clave class. Las propiedades de clase se pueden declarar de tres maneras distintas: se pueden definir constantes con la palabra clave const, las variables se definen con la palabra clave var y las propiedades de captador/definidor se definen con los atributos get y set en una declaración de método. Los métodos se declaran con la palabra clave function.
Para crear una instancia de una clase hay que utilizar el operador new. En el ejemplo siguiente se crea una instancia de la clase Date denominada myBirthday.
var myBirthday:Date = new Date();
8/ Sintaxis:
Entrando un poco más a fondo en la sintaxis y el manejo del ActionScript, vamos a comenzar hablando de los operadores y de las expresiones, por ser la parte más elemental de una acción de ActionScript (y de cualquier otro lenguaje de programación). Un operador es un tipo de carácter que realiza una acción especial dentro de una expresión de ActionScript. Una expresión no es más que un conjunto de operadores, variables y constantes relacionados entre sí de un cierto modo. Por ejemplo:
x = 3 ; --> Es una expresión cuyo resultado será asignarle a la variable ' x ' el valor 3 (que es una constante). A partir de este punto, la variable x vale 3.
y = 5 + x ; --> Es una expresión cuyo resultado será asignarle a la variable ' y ' la suma de la constante 5 y la variable ' x ' que sabemos que vale 3 (porque le hemos asignado este valor antes). Por tanto, el resultado de esta expresión es asignarle 8 a y. También se puede considerar como asignar a y el valor de la expresión 5 + x
Flash nos permite usar multitud de operadores, vamos a comentar los más comunes. Se puede acceder a los demás (y a estos) desde el Panel Acciones en la carpeta Elementos de lenguaje → Operadores. Los operadores se pueden clasificar en:
•Operadores Aritméticos: son los operadores empleados en operaciones matemáticas.
•Operadores de Asignación: asigna el valor de una variable.
•Operadores de Comparación: empleados en expresiones de condicionales, devuelven un valor lógico, verdadero (TRUE o 1) si la comparación es cierta, o falso (FALSE o 0) si no lo es.
9/ Condicionales:
ActionScript 3.0 proporciona tres sentencias condicionales básicas que se pueden usar para controlar el flujo del programa.
• if..else: la sentencia condicional if..else permite comprobar una condición y ejecutar un bloque de código si dicha condición existe, o ejecutar un bloque de código alternativo si la condición no existe. Por ejemplo, el siguiente fragmento de código comprueba si el valor de x es superior a 20 y genera una función trace() en caso afirmativo o genera una función trace() diferente en caso negativo:
if (x > 20)
{
trace("x is > 20");
}
else
{
trace("x is <= 20");
}
Si no desea ejecutar un bloque de código alternativo, se puede utilizar la sentencia if sin la sentencia else.
• if..else if: para comprobar varias condiciones se puede utilizar la sentencia condicional if..else if. Por ejemplo, el siguiente fragmento de código no sólo comprueba si el valor de x es superior a 20, sino que también comprueba si el valor de x es negativo:
if (x > 20)
{
trace("x is > 20");
}
else if (x < 0)
{
trace("x is negative");
}
Si una sentencia if o else va seguida de una sola sentencia, no es necesario escribir dicha sentencia entre llaves. Por ejemplo, en el código siguiente no se usan llaves:
if (x > 0)
trace("x is positive");
else if (x < 0)
trace("x is negative");
else
trace("x is 0");
No obstante, Adobe recomienda utilizar siempre llaves, ya que podría producirse un comportamiento inesperado si más adelante se añadieran sentencias a una sentencia condicional que no esté escrita entre llaves. Por ejemplo, en el código siguiente el valor de positiveNums aumenta en 1 independientemente de si la evaluación de la condición devuelve true:
var x:int;
var positiveNums:int = 0;
if (x > 0)
trace("x is positive");
positiveNums++;
trace(positiveNums); // 1
• switch: la sentencia switch resulta útil si hay varios hilos de ejecución que dependen de la misma expresión de condición. Proporciona funcionalidad similar a una larga serie de sentencias if..else if, pero es más fácil de leer. En lugar de probar una condición para un valor booleano, la sentencia switch evalúa una expresión y utiliza el resultado para determinar el bloque de código que debe ejecutarse. Los bloques de código empiezan por una sentencia case y terminan con una sentencia break.