viernes, 28 de febrero de 2014

ActionScript 3.0: Cambio color

Una aplicación clásica en los desarrollos educativos es que el usuario (por lo general un niño) iluminen un dibujo. Hay muchas maneras de hacerlo. Una forma de solucionar este problema es tener el dibujo dvidido en diferentes movie clips blancos y un gráfico con los contornos del dibujo.

Es importante nombrar a cada uno de los clips con nombres diferentes. Por lo general necesitamos hacer "grupos" de varios pedazos del dibujo, por ejemplo las manos, el cuello y la cara van del mismo color. También necesitaremos botoncitos que representen los diferentes botones para que el usuario seleccione el color. Por lo general utilizamos un cursor personalizado, ya sea un pincel o una brocha.

Para poder cambiar el movie clip, necesitamos un objeto intermedio donde almacenaremos el color, en este caso necesitamos un objeto ColorTransform. Dicha clase se encuentra en el paquete geom, y este a su ves en el paquete flash. Recuerda que si codificas en la línea de tiempo, no es necesario importar las clases del paquete flash, pero si trabajas en clases, tienes que importarla:

import flash.geom.ColorTransform;

Así que crea un objeto de tranformación de color, donde almacenaremos el color que haya seleccionado el usuario:

var colorInfo:ColorTransform;

Aqui almacenamos el color (en formato hexadecimal, de preferencia). Supongamos que desamos cambiar el color a amarillo:

colorInfo = new ColorTransform();
colorInfo.color = 0xffff00;

Ahora aplicamos este cambio al movie clip (digamos que se llama dibujo) con la siguiente asignación:

dibujo.transform.colorTransform = colorInfo;

Listo, el movie clip cambiará de color. Hay que remarcar que si el movie clip tiene un degradado o diferentes colores que los aplicamos en tiempo de autor ed decir, con el EDI, los colores se remplazarán por el color que aplicamos.

http://www.pacoarce.com

miércoles, 26 de febrero de 2014

¿Qué diablos es un ciclo o bucle?

Bucles

Una sentencia bucle puede repetir un grupo de sentencias controladas con una o más expresiones. Las instrucciones que se ejecutarán, van encerradas entre llaves. Opcionalmente se pueden omitir las llaves, pero es una práctica no recomendada. Las sentencias de bucles incluidas en AS3.0, son las siguientes:

Sentencia for

Una sentencia for se utiliza cuando se conoce el número de interacciones que se busca. Cuenta con tres elementos: una asignación inicial. Se le conoce como valor inicial. Después una condición de control, la cual se ejecutará mientras su resultado sea verdadero.  Cuando esta condición sea falsa el bucle terminará. Por último una operación que cambia de valor a la variable de control o índice (generalmente es un incremento, pero puede ser un decremento). Los elementos del bucle se separan con punto y coma. Su sintaxis es:
for(var i:int =0; i<10; i++){
            trace(i);
}

Sentencia for..in

Este bucle sirve para recorrer objetos y arreglos. Tiene dos parámetros. El primero nos traerá en nombre de la propiedad. El segundo es el nombre del objeto o arreglo que queramos analizar. Su sintaxis es:
for(param in objeto){
            trace(param+”-> “+objeto[param]);
}
Si se quiere analizar un arreglo, su sintaxis es:
for(param in arreglo){
            trace(arreglo[param]);
}
Observe que en medio de los parámetros, va la palabra reservada in. Los objetos guardan sus parámetros sin un orden predeterminado.

Sentencia for each.. in

Esta sentencia recorre los elementos de una colección, que puede estar formada por las etiquetas de un objeto XML o XMLList, los  valores de las propiedades de un objeto o los elementos de un arreglo. Por ejemplo, como se indica en el siguiente fragmento, se puede utilizar una sentencia for each..in para recorrer un objeto genérico, pero a diferencia del bucle for..in, la variable de iteración contiene el calor de la propiedad en lugar del valor de la misma.

Sentencia while

La sentencia while se utiliza cuando no se sabe el número de interacciones que se necesitan. Hay que tener cuidado en no caer en un bucle infinito (que no tiene salida y se repite indefinidamente). Para ello contamos con la sentencia break, que corta el ciclo. También puede utilizarse en forma controlada como un for, por ejemplo:
var i:int = 0;
while(i<5){
            trace(i);
i++;
}
Para que experimente lo que es un bucle infinito, borre la sentencia i++. El compilador le enviará un mensaje con el cual podrá suspender el mismo en aproximadamente 15 segundos.

Sentencia do..while

La sentencia do..while es muy similar a la anterior, con la diferencia que el bloque de instrucciones se ejecutará al menos una vez. Por lo general se utiliza cuando no sabemos el número de interacciones que buscamos. Al igual que la sentencia anterior, hay que tener cuidado para no caer en bucles infinitos. Un ejemplo controlado de la sentencia do..while, que simula a una sentencia for, es la siguiente:
var i:int = 0;
do{
            trace(i);
            i++;
} while (i<5);

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

viernes, 21 de febrero de 2014

Crear una clase con métodos estáticos con ActionScript 3.0

Durante los proyectos, muchas veces es necesario tener rutinas (por lo general de validación) que las podemos utilizar como una caja de herramientas en cualquier función. Por ejemplo, validar las direcciones de correo, fechas, calcular edades, limpiar cadenas, llenar números con ceros, con muchas otras opciones.

Para ello es mejor hacer una clase y declarar a cada una de las funciones como públicas y estáticas. En actionScript tenemos muchas funciones estáticas, como Math, Print, etc.

También podemos almacenar variables "globales", las cuales pueden ser llamadas desde cualquier otra clase:

package com.misclases
{
    public class Aux
    {
        public static var idioma:String = "Español";
    }
}

Hasta el momento, no se crea la clase "estática", sino las propiedades y los métodos:

package  com.dysport{

public class Aux {

public function Aux() {
// constructor code
}

public static function ceros(cadena,num):String{
var l = cadena.length;
cadena = cadena.replace(" ","");
for(var i=0; i<(num-l); i++){
cadena = "0"+cadena;
}
return cadena;
}
public static function validaFecha(d, m, a){
var hoy = new Date();
//trace(d, m, a);
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()+1) 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;
}
}
}

Estas clases pueden ser llamadas, una vez importada la clase, por ejemplo

Aux.ceros(numéro, 2);
Aux.validaFecha(10,10,1966);
trace(Aux.idioma);

http://www.pacoarce.com

jueves, 20 de febrero de 2014

Los métodos getter y setter en Coldfusion 10


Uno de los principios fundamentales en la programación orientada a objetos es que el usuario sólo debe de interactuar con las propiedades del componente o clase por medio de funciones getter y setter, nunca en forma directa.

Adicionalmente, por medio de los métodos getter y setter podremos hacer validaciones de los valores recibidos o modificados:

<cfcomponent>

<cfset variables.myNumericValue = 0>

<cffunction name="getMyNumericValue" access="public" output="false" returnType="numeric">
<cfreturn variables.myNumericValue>
</cffunction>

<cffunction name="setMyNumericValue" access="public" output="false" returnType="void">
<cfargument name="myValue" type="numeric" required="true" >
<cfset variables.myNumericValue = myValue>
</cffunction>

<cfcomponent>

Uso de una propiedad en un componente <cfproperty>

• Las propiedades añadidas con <cfproperty> son vistas desde la documentación.
• La etiqueta <cfproperty> contiene algunos atributos que aydan en la definición de la propiedad
• La etiqueta <cfproperty> genera automáticamente, por medio de el atributo accesors,  los métodos getter y setter

Atributos de la etiqueta <cfproperty>

• name: nombre de la propiedad
• default: valor por omisión de la propiedad
• displayName: nombre descriptivo de la propiedad
• required: define si la propiedad es requerida
• serializable:determina si la propiedad es serializable
• type: tipo de dato de la propiedad

El atributo Accessors

• <cfcomponent> sólo generan los getters y setters en forma automática cuando de tiene el atributo accesors = "true".

Ejemplo:

<cfcomponent accessors=”true”>

<cfproperty name="dsn" displayName="dataSource" hint="Data source to be used in this component" type="string" />

<cfset variables.myNumericValue = 0>

<cffunction name="GetMyNumericValue" access="public"returnType="numeric">
<cfreturn variables.myNumericValue>
</cffunction>

<cffunction name="SetMyNumericValue" access="public" returnType="void">
<cfargument name="myValue" type="numeric" required="true" >
<cfset variables.myNumericValue = myValue>
</cffunction>

</cfcomponent>

http://www.pacoarce.com

lunes, 17 de febrero de 2014

ActionScript: Un objeto que se mueva en el sentido del cursor

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


package  {
   import flash.display.Sprite;
   import flash.events.Event;

Desde ActionScript es fácil hacer que un movieclip siga al cursor:

   public class Bola extends Sprite{
      var dx:int = 0;
      var atenuacion:Number = .10
      var margen:int = 30;

      public function Bola() {
         addEventListener(Event.ENTER_FRAME, onMueve)
      }

      private function onMueve (e:Event):void {
         this.x += dx;
         dx = (stage.mouseX - stage.stageWidth/2) * atenuacion;
         if (this.x stage.stageWidth - margen) {
            this.x = stage.stageWidth - margen
         }
      }
   }
}

http://www.pacoarce.com

jueves, 13 de febrero de 2014

Breve historia de MySQL


MySQL fue desarrollado en 1996 por una empresa sueca llamada TCX. Es una base de datos relacional de código abierto que se encuentra estrechamente relacionada con productos como PHP, Apache y Linux, que también son de código abierto.

MySql es un sistema administrador de bases de datos relacionales que permite el manejo, acceso y almacenamiento seguro y rápido de información, especializado en Internet (sistemas cliente-servidor). Usted puede bajar la base de datos en forma gratuita de la página http://www.mysql.org. Recomendamos ampliamente la instalación de la paquetería gratuita de Easyphp.org, que instala en un mismo paquete el sistema operativo web Apache y PHP con MySQL.

Antes de abordar el manejo de MySQL definiremos términos bases.

Términos básicos: Tabla, campo y registro

Una TABLA es un conjunto de información que tierre relación entre sí. Una BASE DE DATOS es el conjunto de tablas que describen una entidad de información mayor. Las tablas pueden tener relación entre ellas y ser complementarias.

Las tablas están formadas por REGISTROS o RENGLONES. Estos son la unidad básica que describe a un objeto o a una transacción, por ejemplo, los datos de un artículo de venta, la información de una persona para enviarle un correro, etc. A su vez el REGISTRO está formado por CAMPOS o COLUMNAS, que son la unidad básica de información, y son una propiedad específica de un objeto o transacción, por ejemplo, la fecha de compra, el número de ISBN de un libro o el correo electrónico de una persona.

Dependiendo de la COLUMNA, esta tendrá un TIPO DE DATO específico, que indicará la forma de almacenar, las caracterísitcas y limitantesdel CAMPO.


Diseño de una base de datos

Para diseñar una base de datos podemos seguir los siguentes pasos:

1. Cada tabla deberá tener un nombre único y específico.
2. Cada una de las tablas deberá tener al menos un campo
 
3. Cada tabla puede tener cero o más filas. estas pueden estar desordenadas.
4. Cada valor en una COLUMNA tendrá el mismo tipo de dato.
5. A su vez, el campo o conjunto de campos único (que no se repite su valor entre los diferentes REGISTROS) con el cual se accesa la información de las tablas, y cuyo valor identifica unívocamente al REGISTRO se le conoce como LLAVE PRIMARIA.
6. Solo existirá una llave primaria por tabla.
7. Una LLAVE SECUNDARIA (externa o foránea) es un campo o conjunto de campos, que es una LLAVE PRIMARIA en otra tabla.
8. La relación entre LLAVES PRIMARIAS - LLAVES FORANEAS crea una relación de padre-hijo entre las TABLAS de una base de datos.

Por ejemplo:

Supongamos que tenemos un sistema escolar. Tendremos una tabla con los datos del alumno (llamada ALUMNOS), y en ella almacenaremos una llave para el número de salón. Esta será una LLAVE SECUNDARIA.

En otra tabla (la llamaremos SALONES) almacenaremos los datos de los salones, como su ubicación en el edificio, su número de asientos y su equipamiento (pizarrones, proyectores, mapas, etc). La LLAVE PRIMARIA de esta tabla es la LLAVE SECUNDARIA de la tabla ALUMOS, por lo que se tiene una relación de PADRE (Tabla ALUMNOS) e hijo (tabla SALONES).

Antes de pasar a la creación de tablas y bases de datos, estudiaremos el elemento básico, que son los tipos de datos y los tipos de columnas para formar las tablas.

 

martes, 11 de febrero de 2014

Crear procesos automáticos para MySQL

Estado del administrador de tareas programadas Editar sección
Lista de tareas:

SHOW PROCESSLIST\G
Valor de la variable event_scheduler:

SHOW VARIABLES LIKE 'event_scheduler';
Activación del administrador:

SET GLOBAL event_scheduler = ON;

Hacer un respaldo automático en Windows


Podemos utilizar el programa mysqldump como se muestra:

set FECHA=%date%
set FECHA=%FECHA:/=%
set FECHA=%FECHA: =%
set FECHA=%FECHA::=%
set FECHA=%FECHA:,=%
set FILE=C:\\Backups\\Backup_%FECHA%.sql
C:/mysql/bin/mysqldump.exe -h localServer -u USER -p PASWWORD -r %FILE% DBNAME

Y lo programas en la tarea en Windows

Hacer un respaldo con la herramienta mysqldump


mysqldump ---user admin ---password=password mydatabase > sql.dump

http://www.pacoarce.com



miércoles, 5 de febrero de 2014

Añadir métodos a los componentes en Coldfusion 10

Añadir métodos a los componentes en Coldfusion 10

Los métodos son definidos dentro de los componentes:
Para definir los métodos, utilizamos uno de los siguientes modificadores de acceso:

private: disponible sólo en el componente donde es declarado  el método. También es válido en las clases extendidas de la clase original.
package: disponible en la clase donde se define el método, en las clases extendidas y en otras clases del paquete. Un paquete son otras clases definidas dentro del folder de la aplicación.
public: disponible para todas las clases de la aplicación.
remote: disponibles en forma local o remota por medio de una URL, Flash o web server.

Los métodos de las instancias

Funcionan igual  que las funciones definidas por el usuario.
Generalmente trabajan con los datos de la misma instancia.
Interactúan con otros métofos de la instancia


<cfset variables.birthDate = CreateDate(1975,6,9)>
<cffunction name="CalculateAge" access="public" returnType="numeric" >
<cfreturn DateDiff("yyyy", variables.birthDate, Now())>
</cffunction>

Llamar a un método

<cfset myInstance = createObject("component","components.animal")>
<cfoutput>
   Age : #myInstance.CalculateAge()#
</cfoutput>

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