Blog de Daniel Zegarra Rotating Header Image

AS3

Cache de windows, una pesadilla

He perdido muchas horas de trabajo debido a supuestos errores al momento de compilar mi codigo usando Flash CS3. ¿Era raro ya? Modificaba una clase pero cuando compilaba mi aplicacion era como si no hubiese hecho cambios. Me di cuenta de eso luego de varias pruebas. Incluso escribia cualquier cosa en mi clase y volvia a compilar mi aplicacion y Flash me decia que todo estaba correcto a pesar de que escribi algo como “$1!6″3#&%6$” en alguna zona aleatoria. Tenia que hacer cambios drásticos en mis archivos AS para que flash se diera cuenta del cambio y actualizara su cache.

Ayer me canse de este problema y decidi solucionar esta molestia de una vez por todas. Descartando que sea un problema de flash (porque antes no tenia este problema con la misma versión) supuse que seria Windows el culpable.

Y asi fue. El culpable es realmente un servicio de Windows llamado Archivos sin conexión el cual almacena archivos localmente para tener acceso a una copia de ellos cuando la PC se encuentre sin conexion a una red. Por alguna razón que no comprendo este servicio estaba cacheando archivos locales también.

Para desactivarlo ve a Panel de Control / Herramientas Administrativas / Servicios. Alli Buscas el servicio Archivos sin conexion y le da sun clic secundario y eliges Propiedades.

Desactivando el servicio archivos sin conexión

Desactivando el servicio archivos sin conexión

En la ventana que aparece dale un clic en el boton Detener y luego elije Deshabilitado en el combo de Tipo de inicio.

Talvez Microsoft ya haya soltado un parche para esto. Yo tengo Windows Vista Enterprise con SP1 pero sin actualizaciones instaladas (porque algunas actualizaciones de microsoft se comportar como un virus).

Primeros pasos con el API para Flash de Google Maps

Por fin me decidi a probarlo.

Google Maps tiene un API que te permite incrustar sus mapas en tu aplicacion Flash (solo ActionScript 3). Imagina una libreta de direcciones online en la que los usuarios puedan definir visualmente el punto exacto donde viven (aunque habria que tomar en cuenta las implicancias de eso) y en tu DB solo almacenar la latitud y longitud de la elección. Incluso podrias medir la distancia entre dos puntos.

El SDK lo puedes encontrar aquí: http://code.google.com/intl/es-ES/apis/maps/documentation/flash/intro.html#SWC_File
Debes solicitar un API Key: http://code.google.com/intl/es-ES/apis/maps/documentation/flash/intro.html#API_Key
Creando tu primera aplicacion: http://code.google.com/intl/es-ES/apis/maps/documentation/flash/tutorial-flash.html
Y la guia de referencia donde pueden encontrar toda la documentacion tecnica: http://code.google.com/intl/es-ES/apis/maps/documentation/flash/reference.html

El Golf de San Isidro

Puedes descargar las fuentes de este ejemplo en el siguiente enlace: Descargar Ejemplo de API de Google Maps

Primeros pasos con AMF y Zend Framework

Ahora que estoy de vacas tuve tiempo para leer la documentacion del framework de Zend para su PHP y esta bueno. 

Decidi aprenderlo de una vez y empezar a usarlo en mis proyectos. 

Una de las primeras cosas que busqué fue su compatibilidad con AMF puesto que estoy acostumbrado a usar AMFPHP para casi todo. Zend Framework viene con clases para trabajar con AMF y son clases muy buenas. 

En 15 minutos arme mi gateway AMF en PHP con tan solo 7 lineas de codigo y cree un flash simple para probar mi servidor. 

A este servidor solo le falta agregarle la autenticación y Zend Framework trae clases para eso tambien. 

Puedes descargarte el Gateway + Service y Flash de ejemplo en el siguiente enlace.

Descargar Gateway AMF usando ZF + Service y Flash de ejemplo

Necesita tener las librerìas de Zend Framework junto al ejemplo.

Crossdomain.xml para Flash Player 9.0.115

El archivo de politicas de flash (crossdomain.xml) le dice a Flash Player si un sitio web le concede permiso para interactuar con él.
Lamentablemente la informacion sobre su uso y su estructura que provee Flash esta desfasada. Por ejemplo: El DOCTYPE sigue apuntando hacia macromedia.com.

<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy
          SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
  <site-control permitted-cross-domain-policies="all" />
  <allow-access-from domain="*" />
</cross-domain-policy>

Esta configuración hará que flash player acepte todas las conexiones. Si deseas realizar una modificación te sugiero leas la documentacion que provee adobe. Como dije antes, no esta del todo actualizada pero lo esencial sigue ahí.

Eventos AS3 en Flash 9

Ya habia aprendido a disparar eventos en Flex, supuse que sería muy parecido en Flash9 y no me equivoque (bueno era obvio, los dos usan AS3).

Como dije, es parecido no igual. Me demoraría hallando las diferencias y explicandolas aquí, mejor dejo un ejemplo de la extensión de la clase que maneja los eventos en Flash9. Simple y practica.

En AS2

import mx.events.EventDispatcher;
mx.events.EventDispatcher.initialize(this);
var logEventos:Object = new Object();
logEventos.onNewLog = function(evtobj:Object):Void{
trace("Parametro dato2: "+evtobj.dato2);
}
addEventListener("onNewLog", logEventos);
dispatchEvent("onNewLog", new Object({dato1:"A", dato2:"B", dato3:"C"}));

En AS3
Archivo LogEvts.as

package {
import flash.events.*;
public class LogEvts extends Event{
public var data:Object;
public function LogEvts(logObj:Object, type:String):void {
super(type, true);
this.data = logObj;
}
}
}

En el .Fla

import LogEvts.as
private var logevts:LogEvts = LogEvts();
addChild(logevts);
function logsTrace(evtobj:LogEvts):void{
trace("Parametro dato2: "+evt.data.dato2);
}
addEventListener("onNewLog", logsTrace);
logevts.dispatchEvent(new LogEvts(new Object({dato1:"A", dato2:"B", dato3:"C"}), "onNewLog"));

Y si te preguntas porque coloco el addEventListener en la raiz y no al objeto, es porque el evento es diaparado pasandole como parametro bubble=TRUE (en el as).
Para entenderlo puede visitar el blog de Alberto Alcaraz, post: sobre los eventos en AS3.

Si bien los eventos personalizados en AS3 no son tan simples como en AS2. Sinceramente, me molesta tener que crear una clase para esto, pero la versatilidad es mucho mayor.