electroduendes.com

bitácora de un desarrollador interactivo

electroduendes.com header image 1

como evitar el proxy de telefonica en Flash

January 10th, 2006 · 3 Comments

Es muy difícil explicar a un cliente que el cambio que has realizado en su página no es visible debido al proxy, e incluso hay veces que telefónicamente he tenido que borrarle la carpeta de temporales… “pulsa en herramientas>opciones de internet..>eliminar archivos… no, no, en inicio no, en el explorador, no, en el google no…”
Supongo que a todos os suena. Bien, pues hace un año mas o menos me pasó algo insólito; el proxy servía los swfs corruptos, y la página no se veía. Así que me apresuré a averiguar como demonios podía saltármelo, y encontré una idea que podía servir, adjuntar una variable aleatoria a la cadena de la URL a cargar, de tal manera que que el archivo pareciera diferente a ojos del proxy. Vale, nada nuevo, supongo que todos hemos llegado hasta ahí.

El problema de esta opción es que es bastante tedioso andar concatenando.. cada vez que tienes que hacer un loadMovie, un loadVars, un loadSound, un load… tienes que andar acordándote de ponerlo, y peor aún, acordarte de cambiarlo cuando se sube a producción.

var v:Date = new Date();
// comentar al subir a produccion 
mcl.loadMovie("principal.swf");
//mcl.loadMovie("principal.swf?antiproxy="+v.getTime());
// TODO: esto es un infierno!, hay que automatizarlo!.

Todo debido a que el player standalone no consigue cargar las cadenas del tipo “miarchivo.swf?antiproxy=90878676″.
Hasta que un día como hoy tuve un rato para pensar en algo que pudiera funcionar.

Es un simple prototipo que sobreescribe el método loadMovie de la clase MovieClip. El prototipo usa solamente el “anticaché” (loadMovie(”archivo.swf?anticache=”+v) ) cuando el swf está en producción. De esta manera, podemos subir nuestros archivos directamente a producción sin tener que acordarnos de comentar y descomentar código.

MovieClip.prototype._loadMovie = MovieClip.prototype.loadMovie;
MovieClip.prototype.loadMovie = function(url:String,method:String):Void {
	var con:LocalConnection = new LocalConnection();
	if(con.domain()=="localhost"){
		this._loadMovie(url, method); // si estamos en local todo igual...
	} else { // en caso contrario, que reviente el proxy
		v = new Date();
		//fix alex_wolff: si la query viene con mas variables, no nos la cargamos
		var separador:String = (url.indexOf("?")>-1) ? "&" : "?"; 
		this._loadMovie(url+separador+"antiproxy="+v, method);
	}
	con.close();
}
var p = _root.createEmptyMovieClip("contenedor", 1);
p.loadMovie("jaja.jpg");

→ 3 CommentsTags: Actionscript 2.0 · Flash · Librerías, recursos

blocketpc

January 5th, 2006 · 1 Comment

Mis colegas Elecash, Marcos, y Sipi han parido Blocketpc, un blog sobre PocketPC y Flash que seguro será referente para estas historias en poco tiempo. ?¡Mucha suerte!

BlocketPC

→ 1 CommentTags: Enlaces · Flash

Delegate en actionscript: ámbitos y referencias

December 23rd, 2005 · 10 Comments

Actualización: Este post es para AS2. Si trabajas con AS3 ya no hace falta delegate porque la API implementa un modelo que permite que las funciones que manejan los eventos tengan la referencia de la clase por defecto. Más información

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: asignaba 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.

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.

/**
 * @author Alejanadro Sánchez Marcos
 * @usage tutorial de uso de delegate en los parsers.
 * la clase emula un parser básico y su uso común.
 */
class ParserTradicional {
	public var xml:XML;
	public var textoResultado:TextField;
	// ouch!
	public static var ruta:ParserTradicional;
	public function ParserTradicional(URL:String, textoResultado:TextField) {
		xml = new XML();
		// off!
		ruta = this;
		this.textoResultado = textoResultado;
		xml.load(URL);
		// empiezan los problemas...
		// xml.ruta = this; // ay!           
		xml.onLoad = parse;
	}
	public function parse() {
		// no tengo ruta.. mmm meto un atributo estático con la ruta
		// buff!
		trace(ruta.xml);
		ruta.mostrarXML();
	}
	public function mostrarXML() {
		textoResultado.text = xml.toString();
	}
}

y exactamente la misma clase, pero usando delegate.

import mx.utils.Delegate;
/**
* @author Alex Sanchez
* @usage tutorial de uso de delegate en los parsers.
* la clase emula un parser básico y su uso común.
*/
class ParserDelegate {
	public var xml:XML;
	public var textoResultado:TextField;
	public function ParserDelegate(URL:String, textoResultado:TextField) {
		this.textoResultado = textoResultado;
		xml = new XML();
		xml.load(URL);
		// yeeeha!
		xml.onLoad = Delegate.create(this, parse);
	}
	public function parse(success:Boolean) {
		if (success) {
			mostrarXML();
		}
	}
	public function mostrarXML() {
		textoResultado.text = xml.toString();
	}
}

→ 10 CommentsTags: Actionscript 2.0 · Flash · Metodología, arquitectura

Pitágoras y el sexo

December 13th, 2005 · 3 Comments

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.

 
import flash.geom.Point;
// sólo 8 ball!
class com.electroduendes.geom.PointUtils{
    /**
     *@deprecated 
     * calcula la distancia entre dos puntos
     * la distancia se calcula con pitágoras: es la raiz cuadrada de los puntos
     * al cuadrado
     * 
     * @ see flash.geom.Point.distance(pt1:Point, pt2:Point) : Number
     *  http://es.wikipedia.org/wiki/Teorema_de_Pit%C3%A1goras
     * 
     */
function distancia(p1:Point, p2:Point):Number{    
        var dx:Number = p1.x - p2.x;
        var dy:Number = p1.y - p2.y;
        return Math.sqrt (dx*dx + dy*dy);
    }
}

→ 3 CommentsTags: Actionscript 2.0 · Experimental · Flash

Eventos en actionscript 2.0 (2): callback y apply

December 5th, 2005 · 1 Comment

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.

/**
*
* com.electroduendes.ejercicios.callback.Perro
* @author      Alejandro Sáncez Marcos
* @version		0.1
* @usage       Tutorial-ejemplo de uso de un callback
* 
* 
* Es muy útil el uso de callbacks como manera de brindar a tu función de compor-
* tamientos diferentes en base a parámetros o otras funciones. 
* 
* En este ejemplo, veremos cómo nuestra clase "perro" despierta al amo 
* por un ladrido. 
* La base estriba en el tipo de dato Function, podremos pasar una función y 
* ejecutarla cuando queramos posteriormente con "apply". 
* 
* 
* Para aquellos que optan por la Orientación a Objetos en su código existen 
* maneras más óptimas, como el paquete EventDispatcher, disponible a partir de 
* la versión 7.2. del Flash Player. Si todavía no dominas al máximo tu orientación a objetos, o
* necesitas dotar de comportamiento simple basado en eventos tus clases,
* este es tu ejemplo.
* 
* Implementación:
* 
* import com.electroduendes.ejercicios.callback.Perro;
* 
* var mastin:Perro = new Perro();
* var miCallback:Object = {func:despertar, ambito:this, parms:[]};
* function despertar() {
*	trace("el amo se despierta");
* }
* mastin.setOnEndLadrido(miCallback);
* mastin.ladrar();
* 
*/
class com.electroduendes.ejercicios.callback.Perro {
 
	//un objeto con tres atributos de tipo Function, ambito, Array
	private var callback : Object = null;
 
	/**
	* @usage		ladra
	*/
	public function ladrar () : Void{
		trace ("guau");
		if (callback != null) 
			//  despachamos la función mediante apply
			callback.func.apply (callback.ambito, callback.parms);		
	}
	/**
	*
	* @usage		setter del callback: le enviamos una función para que 
	* 				la ejecute al fin del ladrido
	* @param		callback que contiene una funcion
	*/
	public function setOnEndLadrido (callback : Object) : Void {
		this.callback = callback;
	}
}

→ 1 CommentTags: Actionscript 2.0 · Flash · Metodología, arquitectura

Eventos en actionscript (1): EventDispatcher y delegate en Actionscript 3.0

December 5th, 2005 · 2 Comments

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.

→ 2 CommentsTags: Actionscript 2.0 · Flash · Metodología, arquitectura

mx.transitions.TransitionManager para flash 8

November 20th, 2005 · 6 Comments

Me he llevado una grata sorpresa al ojear la ayuda de flash 8. Se trata de la clase mx.transitions.TransitionManager, que permite trabajar con una serie de transiciones de una manera muy ágil. Supongo que casi todos los programadores, nos hemos imaginado, o tratado de implementar una clase de este tipo, que “encapsule” el comportamiento del conjunto de transiciones de nuestro repositorio. Pues bien, para aquellos que no lo han hecho todavía, Macromedia se les ha adelantado.

Editado: después del comentario de mi amigo manjeet, entiendo que este post, puede ser muy arduo sin un ejemplo. Aquí os pongo el resultado del código:




y el código.

import mx.transitions.*;
import mx.transitions.easing.*;
var animador:TransitionManager = new TransitionManager(mc);
// configuramos nuestros objetos de transiciones
var objBlinds:Object = {type:Blinds, direction:Transition.IN, duration:2, easing:None.easeNone, numStrips:10, dimension:0};
var objFadeTransition:Object = {type:Fade, direction:Transition.IN, duration:3, easing:None.easeNone};
var objFlyTransition:Object = {type:Fly, direction:Transition.IN, duration:3, easing:Elastic.easeOut, startPoint:9};
var objIrisTransition:Object = {type:Iris, direction:Transition.IN, duration:2, easing:Strong.easeOut, startPoint:5, shape:Iris.CIRCLE};
var objPhotoTransition:Object = {type:Photo, direction:Transition.IN, duration:1, easing:None.easeNone};
var objPixelTransition:Object = {type:PixelDissolve, direction:Transition.IN, duration:2, easing:None.easeNone, xSections:10, ySections:10};
var objRotateTransition:Object = {type:Rotate, direction:Transition.IN, duration:3, easing:Strong.easeInOut, ccw:false, degrees:720};
var objSqueezeTransition:Object = {type:Squeeze, direction:Transition.IN, duration:2, easing:Elastic.easeOut, dimension:1};
var objWipeTransition:Object = {type:Wipe, direction:Transition.IN, duration:2, easing:Elastic.easeOut, startPoint:1};
var objZoomTransition:Object = {type:Zoom, direction:Transition.IN, duration:2, easing:Elastic.easeOut};
// rellenamos nuestro combo
combo.addItem({data:objBlinds, label:"Blinds"});
combo.addItem({data:objFadeTransition, label:"Fade"});
combo.addItem({data:objFlyTransition, label:"Fly"});
combo.addItem({data:objIrisTransition, label:"Iris"});
combo.addItem({data:objPhotoTransition, label:"Photo"});
combo.addItem({data:objPixelTransition, label:"PixelDissolve"});
combo.addItem({data:objRotateTransition, label:"Rotate"});
combo.addItem({data:objSqueezeTransition, label:"Squeeze"});
combo.addItem({data:objWipeTransition, label:"Wipe"});
combo.addItem({data:objZoomTransition, label:"Zoom"});
// cargamos el evento change
var obj:Object = new Object();
obj.change = function(evt_obj:Object):Void  {
	var seleccion:Object = evt_obj.target.selectedItem;
	animador.startTransition(seleccion.data);
};
combo.addEventListener("change", obj);
var obj2:Object = new Object();
// cargamos el eveno
obj2.allTransitionsInDone = function(eventObj:Object) {
	trace("evento despachado, fin de la animación");
};
animador.addEventListener("allTransitionsInDone", obj2);

→ 6 CommentsTags: Actionscript 2.0 · Flash · Librerías, recursos

Menú fibonacci 2

November 4th, 2005 · 2 Comments

he mejorado el script del menú. Creo que me ha quedado más o menos decente, y como tenía bastante desangelado el index, pues lo he plantado ahí.

Lo podéis ver [ aqui ]

PD: se aceptan sugerencias, (alguien se atreve a inagurar los comentarios?) :S

→ 2 CommentsTags: Actionscript 2.0 · Experimental · Flash

Menú espiral

November 3rd, 2005 · 2 Comments

Está basado en una vieja idea de un gestor de organigramas que hice hace tiempo. La espiral es “cuasi-aurea”, puesto que si uso la progresión de fibonacci, apenas puedo mostrar 4 o 5 items.

→ 2 CommentsTags: Actionscript 2.0 · Experimental

En el interior de una cebra

November 1st, 2005 · 2 Comments

Sigo con chorradas respecto a curvas en el día de los Difuntos. Resulta que ayer por la noche, viendo posesión infernal, una cebra zombi me tragó. Ahora escribo desde dentro de ella desde mi nuevo teclado inalámbrico

→ 2 CommentsTags: Actionscript 2.0 · Experimental · Flash