De ActionScript 2.0 y la herencia del MovieClip

Introducción

Una de las principales características del ActionScript 2.0 es que está realmente orientado a objetos. Esto aumenta su capacidad enormemente, y facilita el acercamiento de programadores experimentados en otros lenguajes,y familiarizados con los conceptos de la programación orientada a objetos. Aún así, al ser el Flash un entorno de diseño gráfico sigue poseyendo ciertas restricciones desde el código que intentaremos solventar en este artículo.

El IDE

Flash MX 2004 Pro posee un IDE enfocado principalmente al desarrollo gráfico, y que deja bastante que desear a cualquier programador,por no decir que utilizarlo es una verdadera tortura. Por suerte se pueden encontrar soluciones a este problema como Eclipse, que facilita la programación con la incorporación de un plugin. Se puede encontrar información detallada de como integrar Flash con Eclipse en el artículo de Carlos Rovira Towards Open Source Flash Development, en el cual además se aporta información valiosísima acerca de como instanciar MovieClips sin tenerlos previamente en la librería. Es la piedra angular de todo mi artículo.

La herencia

En el artículo anterior artículo se nos muestra como podemos programar una aplicación el Flash sin utilizar para nada el entorno de desarrollo de Macromedia. !!!GENIAL!!! Sí, para cualquier programador esto es ver sus sueños cumplidos, mandar a la porra un IDE horrible y únicamente necesario para compilar.

Quizás lo más importante de todo el artículo sea la posibilidad de crear MovieClips en tiempo de ejecución, no dependiendo de gráficos diseñados en Flash que deban ser instanciados(en el concepto de Flash) antes de poder ser utilizados. (Lease el capítulo 13 del libro ‘Essential ActionScript 2.0′ de Collin Mook publicado por O’reilly donde hay un perfecto ejemplo. Esto para un programador es “casi” una maravilla. Este “casi” se debe que normalmente un programador no trabaja solo, sino que lo hace con diseñadores que si utilizan la librería de objetos, y desean que esa clase tan maravillosa que ha creado el programador la puedan utilizar en su último diseño sin devanarse los sesos.

La mejor solución es crear una clase que herede del MovieClip, se sobrescriben un par de métodos y listo. El diseñador solo tendra que acordarse de asignar en las propiedades del MovieClip que éste pertenece a la clase ActionScript correspondiente. Todos felices, todos contentos…¿?

No,yo no. La situación actual es frustrante para el programador. Puede sobrescribir todos los métodos que quiera y hacer que el MovieClip tenga el comportamiento deseado en ese caso. Incluso puede crear métodos y propiedades nuevas. PERO (aquí está el problema), no puede utilizar estos me´todos y propiedades dentro de su código puesto que las instancias de su subclase no estarán “instanciadas” según el concepto de Flash, ya que solo se puede hacer esto en tiempo de diseño. La única manera de poder acceder a esos métodos y propiedades es llamarlos desde código que se encuentre en la propia linea de tiempo y lo cual nos obliga salirnos totalmente del esquema de programación ordenada, escribiendo funciones y código que siempre necesitaremos en la linea de tiempo, fuera de nuestro fichero de clase.

Ejemplo (ya es hora):

Supongamos que queremos crear un botón redondeado, dibujado enteramente en código. Voy a utilizar el Hack 14 del libro ‘Flash Hacks’ publicado por O’reilly.

Podemos dibujar el botón directamente en la linea de tiempo utilizando el siguiente código:

[code lang="actionscript"]

var clip:MovieClip = this.createEmptyMovieClip("circle_mc",this.getNextHighestDepth( ));

circle_mc._x = circle_mc._y = 150;

circle_mc.lineStyle(200, 0x0, 100);

circle_mc.moveTo(0, 0);

circle_mc.lineTo(0.2, 0);

[/code]

Siguiendo con el Hack 14 podemos agregar código al evento onRelease:

[code lang="actionscript"]

function createButton(dynaButton, dynaLabel, depth, x, y) { var clip = this.createEmptyMovieClip(dynaButton, depth);

clip.lineStyle(15, 0x0, 100);

clip.moveTo(0, 0);

clip.lineTo(0.2, 0);

clip._x = x;

clip._y = y;

var txt_fmt:TextFormat = new TextFormat( );

txt_fmt.font = "_sans";

txt_fmt.size = 12;

this.createTextField(dynaButton + "_txt", depth + 1,x + 10, y - 10, 100, 20);

var textLabel = this[dynaButton + "_txt"];

textLabel.text = dynaLabel;

textLabel.setTextFormat(txt_fmt);

}

createButton("home_btn", "home", 1, 100, 10);

createButton("products_btn", "products", 3, 100, 30);

createButton("about_btn", "about us", 5, 100, 50);

createButton("links_btn", "links we like", 7, 100, 70);

home_btn.onRelease = function( ) {

// Do stuff

};

products_btn.onRelease = function( ) {

// Do stuff

};

Page 1 of 3 | Next page