Diciembre 2005


Cuando desarrollé mi primer gran proyecto en Actionscript 2.0 con clases, la mayor parte de ellas contenían atributos estáticos "referencia" , o pasaba referencias como propiedad. Parecía que todo en flash perdía la referencia: enchufaba funciones a los onLoad de los parsers, y perdía la referencia, en los onClick de los botones perdía la referencia, los setInterval, venga a pasar referencias... parecía todos los eventos se habían aliado contra mí, :( y eso que ya tenía callo con problemas de referencias.

Incluso sugerí en algún foro la idea de hacer un FAQ de referencias por ser un problema muy común entre gente interesada por aprender Actionscript.

Pero con Flash 7.2, apareció la clase Delegate.

Éste es un ejemplo de mis frustraciones: un típico parser que simplemente visualiza un XML en un TextField en el que las referencias son todo problemas.

Actionscript:
  1.  
  2. /**
  3. * @author Alejanadro Sánchez Marcos
  4. * @usage tutorial de uso de delegate en los parsers.
  5. * la clase emula un parser básico y su uso común.
  6. */
  7. class ParserTradicional {
  8.         public var xml:XML;
  9.         public var textoResultado:TextField;
  10.         // ouch!
  11.         public static var ruta:ParserTradicional;
  12.         public function ParserTradicional(URL:String, textoResultado:TextField) {
  13.                 xml = new XML();
  14.                 // off!
  15.                 ruta = this;
  16.                 this.textoResultado = textoResultado;
  17.                 xml.load(URL);
  18.                 // empiezan los problemas...
  19.                 // xml.ruta = this; // ay!           
  20.                 xml.onLoad = parse;
  21.         }
  22.         public function parse() {
  23.                 // no tengo ruta.. mmm meto un atributo estático con la ruta
  24.                 // buff!
  25.                 trace(ruta.xml);
  26.                 ruta.mostrarXML();
  27.         }
  28.         public function mostrarXML() {
  29.                 textoResultado.text = xml.toString();
  30.         }
  31. }
  32.  
  33.  
  34.  

y ésta es exactamente la misma clase, pero usando delegate.

Actionscript:
  1.  
  2. import mx.utils.Delegate;
  3. /**
  4. * @author Alejanadro S�nchez Marcos
  5. * @usage tutorial de uso de delegate en los parsers.
  6. * la clase emula un parser básico y su uso común.
  7. */
  8. class ParserDelegate {
  9.         public var xml:XML;
  10.         public var textoResultado:TextField;
  11.         public function ParserDelegate(URL:String, textoResultado:TextField) {
  12.                 this.textoResultado = textoResultado;
  13.                 xml = new XML();
  14.                 xml.load(URL);
  15.                 // yeeeha!
  16.                 xml.onLoad = Delegate.create(this, parse);
  17.         }
  18.         public function parse(success:Boolean) {
  19.                 if (success) {
  20.                         mostrarXML();
  21.                 }
  22.         }
  23.         public function mostrarXML() {
  24.                 textoResultado.text = xml.toString();
  25.         }
  26. }
  27.  
  28.  

[ enlaces relacionados: eventos y delegate en Actionscript 3.0 ]

Noto cada día que el rollo-blog hace que todo vaya super deprisa: Escuchas un rumor y no sabes si pensar en razones que emocionan o emociones que razonan, y buscas piedad en San Google, que lo confirma y de paso te entrega una perla. Encuentras un blog de empleados de la revista Rolling Stone anunciando que hay entradas para los Strokes el sábado y lees que se venderán 500 entradas en Escridiscos a partir del viernes a las 10:30. :D tu dices... quiero esa fuente :D

 [ RSS Power ]

A 5 minutos de abrir la tienda, se acabaron las entradas... pues si que va rapido esto, si...

Aquí una pareja haciendo guarradas en la biblioteca sobre los apuntes de trigonometría


Quizá a los fans de yugop les suene este experimento. Siempre creí que la imitación es la base del aprendizaje y la puerta para la creatividad.

Aquí os dejo la fórmula base del experimento. Seguro a todos os suena.

Actionscript:
  1.  
  2.  
  3. import flash.geom.Point;
  4. // sólo 8 ball!
  5. class com.electroduendes.geom.PointUtils{
  6.     /**
  7.      *@deprecated
  8.      * calcula la distancia entre dos puntos
  9.      * la distancia se calcula con pitágoras: es la raiz cuadrada de los puntos
  10.      * al cuadrado
  11.      *
  12.      * @ see flash.geom.Point.distance(pt1:Point, pt2:Point) : Number
  13.      *  http://es.wikipedia.org/wiki/Teorema_de_Pit%C3%A1goras
  14.      *
  15.      */
  16. function distancia(p1:Point, p2:Point):Number{   
  17.         var dx:Number = p1.x - p2.x;
  18.         var dy:Number = p1.y - p2.y;
  19.         return Math.sqrt (dx*dx + dy*dy);
  20.     }
  21. }
  22.  

Para todos aquellos melómanos y perezosos:

¿Te imaginas descubrir nuevos artistas del estilo que te gusta? ¿Te imaginas disponer además, de una radio en internet que lo reproduzca?

pandora.com

Apunte nerd: La idea es la misma que la explotada last.fm o la de cualquier navegador gps: un mega-grafo de artistas y albumes en el que el peso de la arista viene determinado por el parecido "musical" entre ellos, para después, mostrar con un algoritmo de búsqueda de "adyacentes" a los artistas "afines".

a quemar el ancho de banda del curro! :P

via [yonkis.com]

Aquí os dejo la segunda entrega de mis periplo aprendiendo eventos. 100% recomendable para los que todavía no conocéis palabras como EventDispatcher, Delegate, Function.apply() o callback.
En la documentación de la clase, tenéis la explicación del ejemplo.

Actionscript:
  1.  
  2. /**
  3. *
  4. * com.electroduendes.ejercicios.callback.Perro
  5. * @author      Alejandro Sáncez Marcos
  6. * @version            0.1
  7. * @usage       Tutorial-ejemplo de uso de un callback
  8. *
  9. *
  10. * Es muy útil el uso de callbacks como manera de brindar a tu función de compor-
  11. * tamientos diferentes en base a parámetros o otras funciones.
  12. *
  13. * En este ejemplo, veremos cómo nuestra clase "perro" tiene que "advertir" a las
  14. * montañas de que ha ladrado (que jod##amente abstracto ejemplo!), para que ellas
  15. * reproduzcan eco. Con el tipo de dato Function, podremos pasar una función y
  16. * ejecutarla cuando queramos posteriormente con "apply".
  17. *
  18. *
  19. * Para aquellos que optan por la Orientación a Objetos en su código existen
  20. * maneras más óptimas, como el paquete EventDispatcher, disponible a partir de
  21. * la versión 7.2. Si todavía no dominas al máximo tu orientación a objetos, o
  22. * necesitas dotar de comportamiento simple basado en eventos tus clases,
  23. * este es tu ejemplo.
  24. *
  25. * Un ejemplo de su implementación sería:
  26. *
  27. * import com.electroduendes.ejercicios.callback.Perro;
  28. *
  29. * var mastin:Perro = new Perro();
  30. * var miCallback:Object = {func:eco, ambito:this, parms:[]};
  31. * function eco() {
  32. *       trace("guaaaauuu");
  33. * }
  34. * mastin.setOnEndLadrido(miCallback);
  35. * mastin.ladrar();
  36. *
  37. */
  38. class com.electroduendes.ejercicios.callback.Perro {
  39.        
  40.         //un objeto con tres atributos de tipo Function, ambito, Array
  41.         private var callback : Object = null;
  42.        
  43.         /**
  44.         * @usage                ladra
  45.         */
  46.         public function ladrar () : Void{
  47.                 trace ("guau");
  48.                 // TODO: selecciona apply y pulsa f1
  49.                 if (callback != null)
  50.                         //  despachamos la función
  51.                         callback.func.apply (callback.ambito, callback.parms);   
  52.         }
  53.         /**
  54.         *
  55.         * @usage                setter del callback: le enviamos una función para que
  56.         *                         la ejecute al fin del ladrido
  57.         * @param                callback que contiene una funcion
  58.         */
  59.         public function setOnEndLadrido (callback : Object) : Void {
  60.                 this.callback = callback;
  61.         }
  62. }
  63.  
  64.  

No llevo más de un año aprendiendo con eventos en mis clases y no me hizo falta ni un mes para darme cuenta de los problemas comunes que surten todos los foros. Pues bueno, parece que el nuevo Actionscript 3.0 va a ayudarnos un poco más.

# Delegates are now built into the language, making event dispatching easier.
In ActionScript 2.0, routing an event to a method required use of the mx.utils.Delegate class or other workarounds:

import mx.utils.Delegate;
myButton.addEventListener(“click”, Delegate.create(this, onClick));

In ActionScript 3.0, a reference to a method automatically remembers the object instance it was extracted from; in essence, it is an automatic delegate. So, the code can simply be written as:

myButton.addEventListener(“click”, onClick);

Si no trabajas todavía con sistemas basados en eventos... no sufras más, :D

Y el mejor argumento para persuadirte es: ¿a que se trabaja bien con los listeners de los componentes? Pues bien, a lo sumo 10 líneas más en vuestras clases pueden aumentar al máximo vuestro código reutilizable.

A lo largo de estos días iré colocando código útil en base a mi periplo con los mismos para todos aquellos que empecéis de 0 con ellos.