Archivos de la categoría ‘ActionScript 3.0’

Objetos y clases – ActionScript 3.0
Saturday, April 25th, 2009

Programación Procedural
Instrucciones que generan procedimientos
En ActionScript todo lo relacionado a funciones que generan tareas.

Pros
- Implantación rápida, resultados rápidos

Contras
- Poco mantenible a la larga, en aplicaciones con más de 500 líneas de código.

Orientado a Objetos
Divide el código en entidades diferentes

Pros
Escalables
Metodología de programación

Contras
Implantación lenta
Fácil abuso de ella sobrearquitectura de las cosas

Objeto
Es un subprograma que mantiene información y funcionalidad que maneja esa información que se está guardando
A los datos se los conoce como propiedades y a las funciones cómo métodos.

Clases
Plantilla para crear objetos
Definición abstracta de lo que va a ser un objeto.
Todos los objetos creados a partir de una misma clase van a tener los mismos métodos y propiedades.
Lo que crea un objeto único o diferente a otro es el valor de las propiedades.

Clases sin propiedades se hacen estáticas como la clase Math.

Todo lo que se puede hacer en flash está encapsulado en clases.

Paquetes
Un paquete puede contener otro paquete, clases o definiciones de funciones.

1.- Paquete Flash
La utilización de este paquete no añade código ni peso a nuestra película. Se encuentra integrado dentro del flash player.

2.- Librería FL
Son los componentes de flash. No viene compilada dentro del flash player. Hay que añadir el código a la película flash cuando usemos un componente.

3.- Libería mx
Componentes de Flex

Sirven para organizar el código y para que no halla colisión entre nombres.

Como crear un objeto a partir de una clase

Operador new

Actionscript:
var punto:Point = new Point(); // instancia un objeto de la clase Point

Una vez instanciado el objeto podemos acceder a sus métodos y propiedades

Actionscript:
punto.x = 30;
trace(punto);

punto.offset(30, 10); // Offset desplaza el punto
trace(punto); salida (60, 10);

El constructor puede recibir parámetros, si vienen entre corchetes, éstos son opcionales.

Si escribimos el código en línea de tiempo podemos usar los paquetes sin importarlos.
Cuando trabajemos con clases tenemos que importar las clases.

import flash.geom.Point;
import flash.geom.*; // importa el paquete entero

Importando una clase no se añade el código al swf. Si no tiene el paquete importado se va a ir al top level a buscar.
En el momento de compilación busca las clases y las compila en el .swf

Cuando se instancia una clase flash va a mirar si es una clase del top level --> si no, se pone a mirar en las directivas import del código para buscar la clase.

COMO CREAR UNA CLASE
creamos el nombre del paquete, si no va dentro de ningún paquete lo dejamos vacío pero usamos la declaración de package

Por cada archivo de ActionScript solo puede haber una definición o de función o de clase.

CLASSPATH (rutas de clase)
Ruta donde va a buscar flash las clases en el disco.

1.- DE DOCUMENTO
2.- GLOBALES

Se configuran en preferencias --> ActionScript
De manera predeterminada vienen dos classpath por defecto
"." va a buscar en el mismo directorio que el propio archivo .fla
$(AppConfig)/ActionScript 3.0/Classes va a buscar en el directorio Adobe Flash CS3 es
Archivos .swc código precompilado ,no son más que archivos .zip con un archivo xml y otro swf

Podemos insertar los classpath que queramos

Librería Standard (Clases de Flash)
Clases del proyecto (Clases que están al lado del fla)
Nuestra librería de clases

En configuración de publicación en la pestaña de Flash tenemos tambien una Ruta de Clases, pero solo para ese archivo.

En configuración de publicación tenemos una pestaña que crea un SWC, código precompilado para dar al cliente cuando no queremos dar nuestras clases.

ATRIBUTOS DE CONTROL DE ACCESO o Visibilidad

Se usan tanto en propiedades como métodos, asigna quien puede utilizar esa función, clase o método.

public: cualquiera puede ver/utilizar esa definición
private: solo se puede usar desde este código (desde esta clase), métodos de ayuda dentro de la clase. Pensado para uso interno.
protected: lo pueden ver la clase y las subclases
internal: solo puede ser visto por otras clases que estén dentro del mismo paquete. Es el valor por defecto cuando no ponemos ningún atributo.

PROGRAMACIÓN ORIENTADA A OBJETOS

CUALIDADES
1- Abstracción:
Nunca se debería saber el funcionamiento de una clase para poder usarla.

2.- Encapsulamiento:
Una clase no debería dejar modificar sus propiedades.
No poner propiedades públicas.

3.- Herencia
4.- Polimorfismo

Polimorfismo – ActionScript 3.0
Saturday, April 25th, 2009

Capacidad de una clase para comportarse como diferentes tipos de clases.

Se hace la diferencia entre tipo y clase, es decir, la clase círculo es del tipo FormaGeometrica.

Actionscript:
var c:Circulo = new Circulo(); // Círculo hereda de FormaGeometrica
function medirAncho(a:FormaGeometrica) : void
{
    trace(a.ancho);
}
medirAncho(c);

Esto es posible gracias al polimorfismo, el tipo puede ser la superclase (FormaGeometrica) y el valor siempre será el objeto que pasemos, es decir, si como tipo ponemos la superclase podremos pasar como parámetro cualquiera de las subclases (Circulo, Cuadrado, Triangulo, etc).

Después con is podemos averiguar de que tipo es la clase y actuar de una forma u otra con ella.
Pej.

Actionscript:
function medirAncho(a:FormaGeometrica) : void
{
    if(a is Circle)
    {
        trace(a.radius * 2);
    }
    if(a is Rectangle)
    {
        trace(a.ancho);
    }
}

Cuando hablamos de polimorfismo podemos decir: "Tiene un..."

Herencia – ActionScript 3.0
Saturday, April 25th, 2009

La herencia es una relación entre clases.
Permite que una clase herede la funcionalidad de otra (propiedades y métodos).

A la clase superior se la conoce como clase superior o clase base. La clase que hereda se la conoce como subclase o extensión.
Una subclase solo puede tener una superclase.

Cuanto más se baja en la cadena de herencia se vuelven más especializadas las clases.

Desde una subclase no se puede acceder a las propiedades privadas de la superclase.

Podemos usar protected para acceder desde la subclase a una propiedad de la superclase, pero no permitir su acceso desde otros lugares.

Public: permite acceder a propiedades y métodos desde cualquier sitio (miembros y clases)
Protected: permite acceder desde dentro de la clase y sus subclases. (miembros)
Private: solo permite desde la propia clase. (miembros)
Internal: solo permite acceder desde el mismo paquete (miembros y clases)

* miembro: propiedades y métodos

Atributos de clase

final
dynamic
internal
public

El atributo final se usa para que no se pueda heredar de una clase.
Dynamic indica que esa clase puede tener propiedades dinámicas (ej. Object, MovieClip).

LOS MÉTODOS Y PROPIEDADES ESTÁTICOS NO SE HEREDAN

Override
Si creamos un método en la subclase con el mismo nombre que en la superclase nos sale un error para evitar problemas.
Para sobreescribir un método de la superclase tenemos que marcarla como override en la subclase, después podremos ejecutar el código del método de la superclase escribiendo super.

Actionscript:
public override function metodo() : void
{
    trace("Método de la clase base");
}

Si además queremos que se ejecute el código de la clase superior al hacer el override podemos usar super.
Para poder ocultar un método con override el método debe tener la misma firma que la superclase (exacta).

Actionscript:
public override function metodo() : void
{
    super.metodo();
    trace("Método de la subclase");
}

Cuando hablamos de herencia podemos decir: "Es un..."
Ej. Un Ferrari es un deportivo que a su vez es un coche

Donde utilizamos una superclase podemos usar una subclase.

Casting y conversión – ActionScript 3.0
Saturday, April 25th, 2009

Gracias a la herencia podemos hacer un casting de obj para tratarlo como un MovieClip:

1.- Casting

Actionscript:
var obj:Object = new MovieClip();
var mc:MovieClip = obj as MovieClip;

2.- Conversión

Actionscript:
var obj:Object = new MovieClip();
var mc:MovieClip = MovieClip(obj);

Quizá se vea más claro con Number y String:

Actionscript:
var num:uint = 1;
var str:String = String(num);

Ancla a una función – ActionScript 3.0
Saturday, April 25th, 2009

Como lanzar una función desde un campo de texto en AS3:

Actionscript:
campo_txt.addEventListener(TextEvent.LINK, campoLink);
function campoLink(event:TextEvent)
{
    trace(event.text);
}

campo_txt.htmlText = "Hola <a href='event:El texto del ancla'>Ancla</a>";

Embebiendo fuentes en Flash CS4 con Actionscript 3
Monday, March 16th, 2009

flashEmbed.jpg

Antes ya se podía hacer con Flex, ahora también disponible en Flash CS4 :)

Embeber fuentes con ActionScript...

Actionscript:
// ActionScript 3.0
[Embed(source="assets/ARIAL.TTF", fontFamily="ArialEmbedded")]
var ArialEmbedded:Class;
 
var arialEmbeddedFont:Font = new ArialEmbedded();
 
var textFormat:TextFormat = new TextFormat();
textFormat.color = 0xFF0000;
textFormat.font = arialEmbeddedFont.fontName;
textFormat.size = 32;
 
var textField:TextField = new TextField();
textField.autoSize = TextFieldAutoSize.LEFT;
textField.wordWrap = true;
textField.defaultTextFormat = textFormat;
textField.embedFonts = true;
textField.text = "The quick brown fox jumps over the lazy dog.";
textField.width = 500;
textField.x = 25;
textField.y = 25;
addChild(textField);

Via: ActionScript Examples a través de Joseba

ANT para compilar proyectos flash y proyectos Gaia
Monday, March 16th, 2009

Dejo aquí los archivos necesarios para compilar desde Eclipse nuestros archivos Flash con ANT.

Existen tres modalidades, que podéis seleccionar en Eclipse según necesidad:

- Compile: compila el archivo que tengamos abierto en Flash.
- Compilegaia: compila todos los archivos que tengamos abiertos en Flash, dejando como último archivo para publicar Main.fla (así podemos probar el proyecto desde main con todos los flash que tengamos abiertos ya modificados.
- Compilegaiapc: pues eso, lo mismo pero para Pc.

Enumerar las fuentes en AS3
Monday, March 16th, 2009

Siempre se me olvida, así que lo pongo a modo apunte.
Aunque me he creado un template en FDT para tal efecto.

Actionscript:
var fuentes:Array = Font.enumerateFonts();
for (var i : Number = 0; i <fuentes.length; i++)
{
     trace(fuentes[i].fontName,fuentes[i].fontStyle,fuentes[i].fontType);
}

Configurar FDT para flash player 10
Tuesday, February 3rd, 2009

Copiamos el playerglobal.swc del player 10 que se encuentra en:

Applications/Adobe/Flash/CS4/Common/Configuration/ActionScript/3.0/FP10/playerglobal.swc

Creamos una carpeta con el nombre "10" en la carpeta de plugins de eclipse:

Applications/eclipse/plugins/com.powerflasher.fdt.shippedflex_3.1.0.2710_0001/flex/frameworks/libs/player

y pegamos dentro el playerglobal.swc

Después abrimos Eclipse, vamos a preferencias y en la pestaña FDT seleccionamos Core Libraries.

preferences.jpg

En las core libraries de AS3 añadimos una nueva.

corelibrary.jpg

El tipo Pure AS3 Flex, nombre FP10 y en Path Variable creamos una nueva variable con el path:
Applications/eclipse/plugins/com.powerflasher.fdt.shippedflex_3.1.0.2710_0001/flex

editvariable.jpg

Por último dentro del archivo .project (archivo oculto) de nuestro proyecto FDT cambiamos la línea LocationURI, poniendo 10 donde se encuentra el 9.

fdtproject.jpg

Reiniciamos Eclipse y listo.

Problemas con rotationX y rotationY
Tuesday, January 27th, 2009

Me he encontrado con un pequeño problema al intentar hacer una transición con el rotationX en Flash CS4 y es que parece ser que al hacer este tipo de movimiento flash añade un suavizado a los movieclips que parece no poder quitarse (al menos no he encontrado la forma) y que nos fastidia las tipografías que se encuentren dentro de él.

This movie requires Flash Player 10

La solución (o chapucilla del día) para solucionarlo, creamos un bitmap a partir del clip del que queremos hacer la animación y animamos este bitmap. Cuando la animación finaliza hacemos un visible = false del bitmap y un visible = true del contenido.

This movie requires Flash Player 10

Un ejemplo de la creación del bitmap:

Actionscript:
bmpData = new BitmapData(contenido.width, contenido.height, true, 0);
bmpData.draw(contenido);
contenido.visible = false;
bmp = new Bitmap(bmpData);
bmp.x = -bmp.width / 2;
bmp.y = -bmp.height / 2;

contenedorBitmap = new MovieClip();
contenedorBitmap.x = stage.stageWidth / 2;
contenedorBitmap.y = stage.stageHeight / 2;
addChild(contenedorBitmap);
contenedorBitmap.addChild(bmp);