Mostrando entradas con la etiqueta ActionScript 3.0 capabilities. Mostrar todas las entradas
Mostrando entradas con la etiqueta ActionScript 3.0 capabilities. Mostrar todas las entradas

miércoles, 21 de mayo de 2014

ActionScript: Flecha que se estira (AS 3.0)

Autor: Francisco Arce
Correo: fj_arce@yahoo.com.mx


Esta basado en el algorito para una lineaque se estira. Aqui el chiste es dibujar la punta de la flecha y hacer que gire en el mismo ángulo que tenga la línea. Para obtener este ángulo, contamos con los puntos de la linea (el inicial y el final) y calculamos el arco tangente, el cual nos regresa el angulo en radianes. Los convertimos a grados y aplicamos la propiedad rotación. Acuerdate que los angulos en FLash estan desplazados 90 grados , por lo que ajustamos el mismo.

Como siempre se calcula la linea y la punta solo se rota, no hay distorsión. El código de la clase Flecha es el siguiente:

package {
   import flash.display.Sprite;
   import flash.events.MouseEvent;
   import flash.utils.Timer;
   import flash.events.TimerEvent;

   public class Flecha extends Sprite {
      var flecha:Sprite = new Sprite();
      var tiempo:Timer = new Timer(60,0);
      var contenedor:Sprite;
      var cuadro1:Sprite;
      var cuadro2:Sprite;
      var ancho:uint=10;
      var alto:uint=15;
      var x1:int=0;
      var y1:int=0;
      var x2:int=100;
      var y2:int=100;
      var color:uint=0;

      public function Flecha(xx,yy,lon,color):void {
      //Sujetador
      this.color=color;
      this.x1=xx;
      this.y1=yy;
      this.x2=xx+lon;
      this.y2=yy;
      //
      flecha.graphics.beginFill(0,.7);
      flecha.graphics.moveTo(-(ancho/2),-alto);
      flecha.graphics.lineTo(ancho/2,-alto);
      flecha.graphics.lineTo(0,0);
      flecha.graphics.lineTo(-(ancho/2),-alto);
      //
      addChild(flecha);
      flecha.x=x2;
      flecha.y=y2;
   //
   //Calcula segmentos
   var dx:Number=x1-x2;
   var dy:Number=y1-y2;

   //Determina el ángulo y lo convierte
   var radianes:Number=Math.atan2(dy,dx);
   var grados = 360*(radianes/(2*Math.PI));

   // point at cursor
   flecha.rotation=grados+90;
   //
   cuadro1=new Sprite ;
   cuadro1.graphics.beginFill(0xffffff);
   cuadro1.graphics.lineStyle(1,0,1);
   cuadro1.graphics.moveTo(0,0);
   cuadro1.graphics.lineTo(0,5);
   cuadro1.graphics.lineTo(5,5);
   cuadro1.graphics.lineTo(5,0);
   cuadro1.graphics.lineTo(0,0);
   //Sujetador 2
   cuadro2=new Sprite ;
   cuadro2.graphics.beginFill(0xffffff);
   cuadro2.graphics.lineStyle(1,0,1);
   cuadro2.graphics.moveTo(0,0);
   cuadro2.graphics.lineTo(0,5);
   cuadro2.graphics.lineTo(5,5);
   cuadro2.graphics.lineTo(5,0);
   cuadro2.graphics.lineTo(0,0);
   //
   contenedor=new Sprite ;
   contenedor.graphics.lineStyle(2,color,.7);
   contenedor.graphics.moveTo(x1,y1);
   contenedor.graphics.lineTo(x2,y2);
   //contenedor.x=xx;
   //contenedor.y=yy;
   addChild(contenedor);
   addChild(cuadro1);
   addChild(cuadro2);
   //
   cuadro1.x=x1-2.5;
   cuadro1.y=y1-2.5;
   cuadro2.x=x2-2.5;
   cuadro2.y=y2-2.5;
   //
   cuadro1.addEventListener(MouseEvent.MOUSE_DOWN, onMueveCuadro1);
   cuadro2.addEventListener(MouseEvent.MOUSE_DOWN, onMueveCuadro1);
   //
   cuadro1.addEventListener(MouseEvent.MOUSE_UP, onMueveCuadro2);
   cuadro2.addEventListener(MouseEvent.MOUSE_UP, onMueveCuadro2);
   }

   function onMueveCuadro1(e:MouseEvent):void {
      e.target.startDrag();
      tiempo.start()
      tiempo.addEventListener(TimerEvent.TIMER, onPintaLinea);
      //trace("inicio",e.target.name,e.target.x, e.target.y);
   }

   function onMueveCuadro2(e:MouseEvent):void {
      //trace("fin", e.target.name, e.target.x, e.target.y);
      e.target.stopDrag();
      tiempo.stop();
      pintaLinea();
   }

   function onPintaLinea(e:TimerEvent):void {
      pintaLinea();
   }

   function pintaLinea() {
      //
      //Calcula segmentos
      var dx:Number=cuadro1.x-cuadro2.x;
      var dy:Number=cuadro1.y-cuadro2.y;
      //
      //Determina el ángulo y lo convierte
      var radianes:Number=Math.atan2(dy,dx);
      var grados = 360*(radianes/(2*Math.PI));
      flecha.rotation=grados+90;
      flecha.x = cuadro2.x+2.5;
      flecha.y = cuadro2.y+2.5;
      //
      this.removeChild(contenedor);
      contenedor=new Sprite ;
      contenedor.graphics.lineStyle(2,color,1);
      contenedor.graphics.moveTo(cuadro1.x+2.5,cuadro1.y+2.5);
      contenedor.graphics.lineTo(cuadro2.x+2.5,cuadro2.y+2.5);
      addChild(contenedor);
      swapChildrenAt(3, 0);
   }
}
}

http://www.pacoarce.com

martes, 25 de febrero de 2014

ActionScript 3.0: Simular gravedad, hacer rebotar una pelota

Autor: Francisco Arce
Correo: fj_arce@yahoo.com.mx

Dentro de los juegos y animaciones, es muy utilizado la simulación del mundo real por medio de un poco de matemáticas. A eso lo conocemos como "Physics". Dentro de este ramo, simular la gravedad de un objeto es básica. Aqui les dejo una sutina en ActionScript 3.0 para simular el rebote de una pelotita.

Saludos :)

 stage.addEventListener(MouseEvent.CLICK, onClick);
var dy = 20;
var dx = 5
var topey = bola.y;
var topex = bola.x
var gravedad = 1.5;

function onClick(e:Event):void {
   dy = 20;
   addEventListener(Event.ENTER_FRAME, onSalta);
}

function onSalta(e:Event):void {
   bola.x += dx;
   bola.y -= dy
   dy -= gravedad
   if (bola.y > topey) {
      bola.y = topey;
      removeEventListener(Event.ENTER_FRAME, onSalta);
   }
   if (bola.x > stage.stageWidth) {
      bola.x = topex;
   }
}  

http://www.pacoarce.com

lunes, 3 de febrero de 2014

Insertar un registro en la base de datos con Adobe AIR

Para insertar un registro en una tabla, debe tener (obviamente) creada la base, la tabla y tener una conexión a la base de datos. Una vez realizada la conexión, deberá crea un objeto de la clase SQLStatement, la cual contiene la cadena del query a realizarse. El resultado exitoso se detecta con el evento SQLEvent.RESULT y el intento erróneo con SQLErrorEvent.ERROR.

El query se ejecuta con el método execute()

Para insertar hay que ejecutar un comando INSERT , pero lo parámetros se escriben con dos puntos (:) Los valores de los mismos se pasan con la propiedad "parameters". Es muy recomendable limpiar los parametros con el método clearParameters() para estar seguros de limpiar los mismos.

EJEMPLO:

var fecha:Date = new Date()
var query:SQLStatement = new SQLStatement();
query.sqlConnection=conn;
var queryText = "INSERT INTO 'registro' "+
"(id, usuario, libro, bloque, unidad, leccion, actividad, fecha, hora, accion) "+
" VALUES(:id, :usuario, :libro, :bloque, :unidad, :leccion, :actividad, :fecha, :hora, :accion)";
query.clearParameters();
query.parameters[":id"] = 0;
query.parameters[":usuario"] = usuario;
query.parameters[":libro"] = libro;
query.parameters[":bloque"] = bloque;
query.parameters[":unidad"] = unidad;
query.parameters[":leccion"] = leccion;
query.parameters[":actividad"] = actividad;
query.parameters[":fecha"] = fecha.fullYear+"/"+(fecha.month+1)+"/"+fecha.date;
query.parameters[":hora"] = fecha.hours+":"+fecha.minutes+":"+fecha.seconds;
query.parameters[":accion"] = accion;
//
query.text = queryText;
//
try {
   query.execute();
}
   catch(error:SQLError){
   trace("Error: " + error.toString());
}

http://www.pacoarce.com

viernes, 31 de enero de 2014

Dibujar una flecha con ActionScript 3.0


Autor: Francisco Arce
Correo: fj_arce@yahoo.com.mx


Es util dibujar una flecha con el API de dibujo sin necesidad de las herramientas de EDI,

package {<br />
   import flash.display.Sprite;
    public class Arrow extends Sprite {<br />
    public function Arrow() {<br />
       init();<br />
    }<br /><br />
    private function init() {<br />
            graphics.lineStyle(1,0,1);<br />
            graphics.beginFill(0xffff00);<br />
            graphics.moveTo(-50,-25);<br />
            graphics.lineTo(0,-25);<br />
            graphics.lineTo(0,-50);<br />
            graphics.lineTo(50,0);<br />
            graphics.lineTo(0,50);<br />
            graphics.lineTo(0,25);<br />
            graphics.lineTo(-50,25);<br />
            graphics.lineTo(-50,25);<br />
            graphics.lineTo(-50,-25);<br />
            graphics.endFill();<br />
    }<br />
  }<br />
}

http://www.pacoarce.com

martes, 14 de enero de 2014

¿Qué diablos es una sentencia condicional?

Sentencias condicionales

En AS3.0 contaremos con tres sentencias, las cuales no sufrieron cambios de las versiones anteriores:

Sentencia if

La sentencia if efectuará una verificación de una expresión con resultado booleano (true/false). Si la condición resulta verdadera, efectuará un bloque de sentencias. Su sintaxis es:
if(condición){
            sentencia1…
            sentencia2…
            etcétera…
}

Opcionalmente puede tener una sentencia else, la cual agrupa las sentencias que se ejecutarán si la condición da como resultado un valor false, La sentencia else siempre tiene que ir precedida de un if. Su sintaxis es:

if(condición){
            sentencia1…
            sentencia2…
            etcétera…
} else {
            sentencia1…
            sentencia2…
            etcétera…
}

Sentencia if.. else if

Si necesita verificar varias condicionales se puede utilizar la sentencia if… else if…
La última sentencia if, puede llevar su contraparte else, la cual se ejecutará si no se cumple ninguna de las anteriores. Digamos que desea tomar diferentes decisiones dependiendo de la edad del usuario:
if(edad<18){
            trace(“Usted no puede acceder el portal”);
} else if(edad<25){
            trace(“Solo tiene acceso a ciertas paginas de nuestro portal”);
} else if(edad<40){
            trace(“Usted tiene acceso completo a nuestra información”);
} else {
            trace(“Lo sentimos, su edad rebasa el limite de nuestra página”);
}

Sentencia switch()

Una sentencia switch puede sustituir a una estructura if… else if… Con la diferencia en que en ves de un resultado booleano, regresará un valor con el cual tomará las decisiones. Si se cumple la condición se ejecutarán las sentencias hasta encontrar la sentencia break, incluso si hay otras condiciones. Si ninguna de las condiciones se cumplen, se ejecutará el bloque de sentencias después de la sentencia default (la cual es opcional). Su sintaxis es:
switch(numVidas){
            case 8:
                        trace(“Felicidades, estás enterito”),
                        break;
            case 7:
            case 6:
            case 5:
                        trace(“Vas muy bien, aun puedes superar la prueba”);
                        break;
            case 4:
            case 3:
                        trace(“Ups, necesitas esforzarte más”);
                        break;
            case 2:
            case 1:
                        trace(“Vamos, estás a punto de perder el juego!”);
break;
            default:
                        trace(“Lo sentimos, vuelve a intentarlo”);
}
Enlaces de interés:
http://www.youtube.com/watch?v=xUOtWcHj-bk

http://www.pacoarce.com

miércoles, 8 de enero de 2014

Modificar las columnas de un data Grid con Adobe AIR

Uno de los controles más utilizados en el desarrollo de aplicaciones con AIR, Flash y Flex es el data Grid. Esta herramienta es aún más poderosa al momento de manipular las columnas por medio de la clase DataGridColumn. Para ello puede importar las siguientes tres clases que se muestra a continuación:

import fl.data.DataProvider;
import fl.controls.DataGrid;
import fl.controls.dataGridClasses.DataGridColumn;

Por ejemplo, una vez abierta una bas de datos, podemos leer una tabla y vaciarla en un datagrid de la siguiente forma:

function onQueryLeeTabla (e:SQLEvent) {
var q:SQLStatement=e.target as SQLStatement;
var r:SQLResult=q.getResult();
        //
var dp:DataProvider = new DataProvider();
//
datos_dg.addColumn(new DataGridColumn("Fecha"));
datos_dg.addColumn(new DataGridColumn("Cliente"));
datos_dg.addColumn(new DataGridColumn("Correo"));
datos_dg.addColumn(new DataGridColumn("Confirmada"));
//
datos_dg.dataProvider = dp;
datos_array = new Array();
datos_dg.dataProvider.removeAll();
for each (var o:Object in r.data) {
var obj:Object = new Object();
obj.Fecha = o.fecha;
obj.Cliente = o.cliente;
obj.Correo = o.correo;
obj.Confirmada = o.confirmada;
datos_dg.addItem(obj);
datos_array.push(o);
  reg++;
}
if(reg==0){
mensaje_txt.text = "No hay registros en la tabla";
} else {
//datos_dg.addEventListener(Event.CHANGE, onSelecciona);
//mensaje_txt.text = "Selecciona un registro";
}
}

Cursos gratuitos de programación web en: http://www.pacoarce.com

sábado, 21 de diciembre de 2013

El DataGrid en Flex


Ejemplo de un DataGrid

<mx:DataGrid columns="No default." dataProvider="No default." sortableColumns="true|false" . . . />

Cargar datos a un DataGrid

Los datos se cargan a un DataGrid por medio de la propiedad dataProvider.

La mejor manera de cargar datos es por medio de un ArrayCollection.

Es necesario importar la clase:


mx.collections.ArrayCollection

Cargar con datos a un DataGrid

Ejemplo para poblar un DataGrid desde un modelo de datos:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/ 2006/mxml" xmlns="*"
layout="absolute" creationComplete="restaurants = new ArrayCollection(myDataModel.item)">

<mx:Model id="myDataModel">
<item>
<key>0</key>
<style>Thai</style>
<number>6</number>
</item>
<item>
<key>1</key>
<style>Indian</style>
<number>14</number>
</item>
</mx:Model>

<mx:Script>
<![CDATA[
import mx.collections.ArrayCollection;

[Bindable]

public var restaurants:ArrayCollection;

]]>

</mx:Script>
<mx:DataGrid dataProvider="{restaurants}"/>

</mx:Application>


Una columna es creada para cada propiedad

El orden de las columnas no es previsible

El nombre de las columnas por omisión es el nombre de la propiedad

Más información: http://www.pacoarce.com

viernes, 20 de diciembre de 2013

ActionScript 3.0: Pasar parámetros a una película en ActionScript 3.0

Autor: Francisco Arce
Correo: fj_arce@yahoo.com.mx
Fecha: 20110222
 
Si deseas pasar código a una película AS 3.0 necesitamos un objeto de la clase LoaderInfo, el cual proporciona información sobre un objeto visual (display objet) ya sea una película swf o un archivo de imagen.

Para obtener información de un objeto LoaderInfo existen dos maneras;
  • Por la propiedad loaderInfo de los objetos visuales
  • Por la propiedad contentLoaderInfo de un objeto Loader.
Si deseas extraer la información de estos objetos, necesitamos la propiedad parameters. Según el manual:

"Las dos fuentes de parámetros son: la cadena de consulta de la URL del archivo SWF principal y el valor del parámetro HTML FlashVars (éste sólo afecta al archivo SWF principal)."

Por HTML (flashVars) o llamando al archivo SWF desde la URL (método GET).
Se puede utilizar las siguientes instrucciones:

var parametros:Object = LoaderInfo(this.root.loaderInfo).parameters;

O leerlo directamente com:

var miParametro = LoaderInfo(this.root.loaderInfo).parameters.parametro;

También se puede aceptar:

var titulo = MovieClip(this.root).loaderInfo.parameters.titulo;

Observe que this.root es la película principal. Un buen tutorial de uso de flashVars es el siguiente:

http://blogs.adobe.com/pdehaan/2006/07/using_flashvars_with_actionscr.html
http://gotoandlearn.com/play.php?id=77

lunes, 18 de noviembre de 2013

Validaciones de fechas con ActionScript 3.0

Como cualquier programador es sabido, las validaciones son de lo más engorroso pero es lo que nos permite dormir tranquilos más de 3 horas seguidas. Aqui dejo algunas funciones que nos servirán para validar fechas en ActionScript 3.0 y una rutina, sencilla pero muy util, para validar los correos electrónicos con expresiones regulares. Espero que sean de utilidad:

function validaFechaDD_MM_AAAA(fecha) {
      var datos = fecha.split("/");
      if(datos.length!=3) return false;
      return validaFecha(datos[0], datos[1], datos[2]);
  } 
  function validaCorreo(mail):Boolean{
      var reg:RegExp = /^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$/
      return reg.test(mail);
  }

  function validaFecha(d, m, a){
      var hoy = new Date();
      var dd = Number(d);
      var mm = Number(m);
      var aa = Number(a);
      var diasMes = new Array();
      //No es numerico
      if(isNaN(dd)) return false;
      if(isNaN(mm)) return false;
      if(isNaN(aa)) return false;
      //
      if(a<1900) return false;
       if(a>hoy.getFullYear()) return false;
      //
     var febrero = (((aa % 4 == 0) && ( (!(aa % 100 == 0)) || (aa % 400 == 0))) ? 29 : 28 );
      //
      for (var i = 1; i <= 12; i++) {
          diasMes[i] = 31;
          if (i==4 || i==6 || i==9 || i==11) diasMes[i] = 30;
          if (i==2) diasMes[i] = febrero;
      }
      //
      if(dd>diasMes[mm]) return false;
      //
      return true;
 }
function calculaEdad() {
     dia = dia_txt.text;
      mes = mes_txt.text;
      anio = anio_txt.text;
      if(validaFecha(dia, mes, anio)){
          var nac = new Date(Number(anio), Number(mes), Number(dia));
          var hoy = new Date();
          var pasadoCumple = ((nac.getMonth() < hoy.getMonth()) || ((nac.getMonth() == hoy.getMonth()) && (nac.getDate ()  <= hoy.getDate () )))
          var edad = pasadoCumple?(hoy.getFullYear() - nac.getFullYear()):(hoy.getFullYear() - nac.getFullYear() - 1);
         edad_txt.text = String(edad);
     } else {
          edad_txt.text = "Error";
      }
  }

http://www.pacoarce.com

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