martes, 31 de mayo de 2011

Detectar si existe un archivo en AIR

Una de las funcionalidades básicas dentro del manejo de archivos con AIR es el saber si existe o no un archivo, previo a abrirlo o borrarlo. Para eso tenemos la propiedad exists, con la cual pdemos preveer si existe un archivo antes de que lo borremos:

import flash.filesystem.*;

var fs:File = new File("app-storage:/paco.txt");
if(fs.exists){
   fs.deleteFile();
} else {
   trace("No existe el archivo")
}

viernes, 27 de mayo de 2011

unloadAndStop, cuando desaparecer la película no es suficiente

Seguramente has usado el método unload y la "musica" de la película sigue sonando. Yo lo solucionaba deteniendo primero la película, los videos, animaciones, etc. y luego descargabas la película, ya que esta, aunque ya no es visible , sigue corriendo en el background. Lo anterior se soluciona con el nuevo método (sólo para Flash Player 10) unloadAndStop. Me pregunto si no era más sencillo corregir el unload, pero bueno. Por si alguna vez te sucede, cambia tu sentencia al pelicula.
unloadAndStop().

Si gustais la refencia del manual es Español:

http://help.adobe.com/es_ES/AS3LCR/Flash_10.0/flash/display/Loader.html#unloadAndStop%28%29

Cómo detectar el directorio de la aplicación en AIR

Encontrar la ruta de la aplicación nos ayudará a ubicar muchos recursos dentro de la computadora:

Primero importar la clase File

import flash.filesystem.File;

//OBTIENE RUTA DE LA APLICACION
var directorio:File = File.applicationDirectory.nativePath.toString();;
var rutaAplicacion:String = directorio.nativePath.toString();

 Esto le dará la ruta  absoulta (desde el C:\) de la aplicación

Monitorear si hay servicio de Internet con AIR

Una de las enormes ventajas de AIR es que podemos determinar si hay conexión en Internet en nuestra aplicación, con lo cual podemos sincronizar datos y muchas cosas más. Las clases necesarias para esta tarea son:

import air.net.URLMonitor;
import flash.net.URLRequest;
import flash.events.StatusEvent;


var q:URLRequest=new URLRequest("http://www.google.com");
q.method="HEAD";
var monitor:URLMonitor=new URLMonitor(q);
monitor.addEventListener( StatusEvent.STATUS, onStatusEvent);
monitor.pollInterval=1000;
monitor.start();

function onStatusEvent(e:StatusEvent):void {
    //Recibimos el status del monitoreo
    var monitor:URLMonitor=e.target as URLMonitor;
    //Preguntamos si hay servicio
    if (monitor.available) {
        conexion_txt.text="Con conexión";
    } else {
        conexion_txt.text="Sin conexión";
    }
}

Necesitamos una caja de texto con nombre de instancia conexion_txt.

MUCHO OJO:

Según el manual:

Para utilizar el paquete air.net en Adobe ® Flash ® CS4 Professional:
  1. Seleccione el comando Archivo > Configuración de publicación.
  2. En el panel Flash, haga clic en el botón Configuración de Seleccionar ruta de biblioteca de ActionScript 3.0.
  3. Haga clic en el botón Navegar hasta el archivo SWC (Ruta de bibloteca en CS5). En la carpeta de instalación de Adobe Flash CS4, navegue hasta Adobe Flash CS4/AIK1.1/frameworks/libs/air/ y seleccione el archivo servicemoniter.swc.
  4. En CS5 sería C:\Archivos de programa\Adobe\Adobe Flash CS5\AIK2.0\frameworks\libs\air\servicemonitor.swc
  5. Haga clic en el botón Aceptar.
  6. Añada la siguiente sentencia import al código ActionScript 3.0: import air.net.*

Como siempre, el código se ve más bonito en una clase: 

 package  com.misitio.miproyecto{
    import air.net.URLMonitor;
    import flash.net.URLRequest;
    import flash.events.StatusEvent;
  
    public class DetectarInternet {
        private var _bandera:Boolean;

        public function DetectarInternet() {
            var q:URLRequest=new URLRequest("http://www.google.com");
            q.method="HEAD";
            var monitor:URLMonitor=new URLMonitor(q);
            monitor.addEventListener( StatusEvent.STATUS, onStatusEvent);
            monitor.pollInterval=1000;
            monitor.start();  
            _bandera = false;
        }
      
        function onStatusEvent(e:StatusEvent):void {
            //Recibimos el status del monitoreo
            var monitor:URLMonitor=e.target as URLMonitor;
            //Preguntamos si hay servicio
            _bandera = monitor.available;
        }
        public function get estado ():Boolean{
            return _bandera;
        }
    }
}

 

    miércoles, 25 de mayo de 2011

    El viejo truco de mandar una pantalla a FullScreen con ActionScript 3.0

    Aunque este ejemplo sale hasta en las cajas de cereal, es bueno tenerlo a mano:

    if (stage.displayState==StageDisplayState.NORMAL) {
        stage.displayState=StageDisplayState.FULL_SCREEN;
    } else {
        stage.displayState=StageDisplayState.NORMAL;
    }

    Simplemente hay que cambiar el estado del escenario. Se uede meter esta rutina en una función de listener para tener el también clásico botoncito de fullscreen/normal

    lunes, 23 de mayo de 2011

    Vectores vs. Arreglos en ActionScript 3.0

    Un vector es un arreglo donde sólo admite elementos del mismo tipo. Una ventaja de los arreglos, en actionscript, es que pueden admitir cualquier tipo de dato en el mismo arreglo sin generar un error, es decir:

    datos_array[0] = 30;
    datos_array[1] = "Mi nombre";
    datos_array[2] = true;

    Esto no causa errores de ningún tipo pero tiene una desventaja: es relativamente lento para operar ya que el compilador necesita hacer muchas validaciones. La clase Vector sólo admite un tipo de objetos de la misma clase, y si tratas de introducir un elemento de diferente clase, el compilador te enviará un mensaje de error. La diferencia contra un objeto Array es que es mucho más rápido de operar (el maula no presiza que es "mucho más rápido").


     La clase Vector se encuentra en las clase base. por lo que no hay que importar nada (bravo!).

    Un ejemplo de crear un vector es:

    var v:Vector.<String>;
     v = new Vector.<String>();
     
    y la forma de acceder a la información es exactamente igual que la de un arreglo
    v[1]
    De hecho tiene la mayoría de los métodos de la clase Array, como push, pop, length, shift, etc.
     

    viernes, 20 de mayo de 2011

    Como detectar la entrada y salida de dispositivos USB con AIR 2.0

    Para detectar cuando el usuario monta o demonta una unidad USB de la computadora, necesitamos importar la clase

    import flash.events.StorageVolumeChangeEvent;

    y crear el siguiente evento para detectar que se ha montado una USB:

    StorageVolumeInfo.storageVolumeInfo.addEventListener(StorageVolumeChangeEvent.STORAGE_VOLUME_MOUNT, onMontaUSB);

    function onMontaUSB(e:StorageVolumeChangeEvent):void
    {
        trace("se ha montado la unidad:", e.rootDirectory.nativePath);
    }

    Para detectar si el usuario desmontó la unidad de USB de la computadora, hay que crear el sisguiente listener con su función:

    StorageVolumeInfo.storageVolumeInfo.addEventListener(StorageVolumeChangeEvent.STORAGE_VOLUME_UNMOUNT, onDesmontaUSB);
    function onDesmontaUSB(e:StorageVolumeChangeEvent):void
    {
        var usbExtraida = e.rootDirectory.nativePath;
       trace("Usted ha retirado la USB", usbExtraida);
    }

    Recuerde que solo corre en AIR 2.0

    jueves, 19 de mayo de 2011

    Cómo leer los dispositivos USB de con Adobe AIR 2.0

    Estas propiedades sólo corren en Adobe AIR 2.0. La clase importantes es

    import flash.filesystem.StorageVolumeInfo;

    Que nos arrojará la información de los mismos en un vector por medio del objeto del mismo nobre de la clase (observe que se escribe uno a mayúsculas y el obsjeto en minúsculas). El método getStorageVolumes() nos dará los objetos de los volúmenes, incluso las USB conectadas y unidades DVD, etc.

    StorageVolumeInfo.storageVolumeInfo.getStorageVolumes();

    Uno de las propiedades que nos darán la letra del volumne (este ejemplo es en una PC.

    Para correr este ejemplo necesitamos una caja de texto llamada "salida_txt". A continuación mostramos el código para desplegar los volúmenes de la computadora:

    import flash.filesystem.StorageVolumeInfo;
    //
    var volumes:Vector. = new Vector.;
    //
    init()
    //
    function init(){
        volumes = StorageVolumeInfo.storageVolumeInfo.getStorageVolumes();
        var cadena = "Estos son los volumenes de tu compu:\n\n";
        for (var i:int = 0; i < volumes.length; i++) {

          var drive = volumes[i].rootDirectory.nativePath; 
          cadena += drive +"\n"; 
       } 
       salida_txt.text = cadena; 



    La salida deberá ser semejante a la siguiente imagen:

    miércoles, 18 de mayo de 2011

    Desarrollo para iPhone y iPad con Flash CS5

    Una fuerte tendencia actual es el desarrollo para smart phones y tabletas. Podemos aplicar toda nuestra experiencia en el desarrollo con ActionScript (A.k.a Flashcoders) utilizando las herramientas de Flash CS5 y Flash CS5.5. Aqui pongo la primera de tres partes de los fundamentos para desarrollar en esta interesante plataforma:


    sábado, 7 de mayo de 2011

    Características del sistema operativo detectadaas desde ActionScript 3.0

    Algunas caracterísiticas de utilidad de la computadora que podemos detectar con ActionScript 3.0, pueden ser las siguientes:

    trace("Sistema Operativo    :",Capabilities.os);
    trace("Lenguaje de la compu :",Capabilities.language);
    trace("Resolución horizontal:",Capabilities.screenResolutionX);
    trace("Resolución verical   :",Capabilities.screenResolutionY);

    La salida, al menos en mo computadora son:

    Sistema Operativo    : Windows XP
    Lenguaje de la compu : es
    Resolución horizontal: 1280
    Resolución verical   : 800

    viernes, 6 de mayo de 2011

    Detener un sonido y reanudarlo luego desde el punto que se quedó, con ActionScript 3.0

    Los objetos de la clase SoundChannel tienen una propiedad, llamada position que nos devuelve la posición en la que se quedó ejecutando el sonido. Para reanudarla, corremos la sentencia play en esa posición. Supongamos que tenemos un sonido en la librería que se llama SonidoLibreria, y un par de botones, play_btn y pausa_btn, en el escenario:

    var posicion:Number;
    var sonido:SonidoLibreria= new SonidoLibreria;
    var vol = .5;
    var canal:SoundChannel = new SoundChannel();
    var trans:SoundTransform = new SoundTransform(vol,0);

    canal = sonido.play();
    canal.soundTransform = trans;

    play_btn.addEventListener(MouseEvent.CLICK, onPlay);
    pausa_btn.addEventListener(MouseEvent.CLICK, onPausa);

    function onPausa() {
        posicion = canal.position;
        canal.stop();
    }
    function onPlay() {
        canal = sonido.play(posicion);
    }

    jueves, 5 de mayo de 2011

    ¿Internas o públicas? Las funciones dentro de un paquete

    Para hacer a una función accesible en un paquete (package) utilizamos el modificador de acceso internal, con lo cual podemos llamar a la función:

    package misClases{

       internal function miFuncion(){
       }
    }

    Para hacer a una función accesible (o sea, para poder llamarla desde) en todo el programa, el modificador de acceso debe ser public.

    package misClases{

       internal function miFuncion(){
       }

    }

    El modificador de acceso por omisión es internal, por lo que si a una función no le anteponemos un modificador de acceso, sólo podrá verse dentro del paquete.

    Cada archivo de clase en AS 3.0 deberá tener al menos una clase, una función, una variable o parámetro . una interface o un nombre de espacio (se oye raro, no?) un nameSpace con un modificador de acceso ya sea public o internal, de lo contrario nos mandará un mensaje de horror, perdón, de error.

    Sincronizar los labios de los personajes con Flash

    Para todos ellos que aman los dibujos animados con Flash, unos tips para la sincronización de labios, a.k.a. lipsink.