Un poco de teoría: Datos y variables (II)

Volver al índice

¿Qué es una variable?

Básicamente, y sólo para que nos entendamos, una variable es un contenedor de datos, una caja vacía esperando a que la rellenemos. Como existen distintos tipos de datos (ver entrada anterior) cada tipo de dato necesita de una cantidad de memoria específica y por tanto las cajas pueden ser de distintos tamaños, formas y colores. Lo de “formas y colores” es una licencia que me permito para dejar claro que no vale meter un dato de tipo X en una caja que ha sido concebida para albergar datos de tipo y, aunque nos parezca a priori que cabe.
Cada caja va con su tipo de datos, como en los juegos de encajar piezas en huecos con su forma y color a los que hemos jugado todos de pequeños.

20130321-171559.jpg

¿Para que sirve una variable?

Si decidimos que un objeto se va a desplazar 10 píxeles en cada frame, es muy útil almacenar esa cantidad en una variable, para que cada vez que necesitemos utilizarla no tengamos que recordar el valor exacto. Pero es que además, podríamos querer cambiar la velocidad de este objeto más adelante. Aún mejor, podríamos decidir que el objeto tiene una aceleración, que le suma una cierta cantidad, 5 por ejemplo, al número de píxeles que desplazamos nuestro gráfico en cada fotograma.
De hecho, por esta razón se llaman variables, porque una vez definidas e inicializadas a un determinado valor, se puede modificar este.

Como imaginaréis esta es una tarea bastante habitual en la programación de animaciones. Pero la utilización de variables es tan habitual en todas las tareas de programación, sea la aplicación del tipo que sea, que no se puede concebir ésta sin el uso de las mismas.

Son la base de la programación.

Definir o declarar una variable

Las variables se definen o declaran con una sentencia que comienza por la palabra clave var seguida del mombre que le queramos dar a la variable. Depués es obligatorio especificar el tamano, forma y color de la misma, o sea, el tipo de dato que va a albergar. Esto se hace escribiendo : a continuación del nombre y acto seguido el tipo de datos. Por ejemplo:

var velocidad : Number;

Esta sentencia crea una caja de tipo Number (para números decimales), pero no inicializa la variable, no le asigna un valor. Esto significa que el sistema
le va a asignar uno por defecto.

El valor de una variable no inicializada depende del tipo de datos que tenga. En la tabla siguiente se describen los valores predeterminados de las variables, clasificados por tipo de datos:

Tipo de datos Valor predeterminado
Boolean false
int 0
Number NaN
Object null
String null
uint 0
No declarada (equivalente a anotación de tipo *) undefined
Todas las demás clases o tipos null

Aunque de momento no le vamos a encontrar utilidad directa a estos valores por defecto, es importante conocerlos, porque aparecen en algunos de los errores que arroja el compilador cuando algo está mal y esto nos puede dar información valiosa que nos ayudará a corregir nuestros fallos. También hay ocasiones en las que cuando trazamos el valor de una variable, aparecen estos valores por defecto y por lo que necesitamos conocerlos para averiguar que es lo que está pasando.

Además, el valor por defecto de algunos tipos de dato, como por ejemplo Number nos obligan a inicializar las variables antes de poder realizar operaciones con ellas, como veremos en el siguiente apartado.

Inicializar o asignar valor a una variable

Una vez declarada o definida la variable podemos asignarle un valor, lo que se denomina inicializar la variable.

var velocidad : Number;

// ...

velocidad = 10;

Fijáos en que aquí ya no se antepone var a la variable, ni se especifica de nuevo su tipo de datos. No es necesario porque la variable ya ha sido definida.

Pero lo más habitual es definir e inicializar las variables en la misma sentencia:

var velocidad : Number =  10;

Primero, porque nos ahorramos una línea de código y, segundo, porque evitamos errores asociados a que Number tiene como valor por defecto NaN.

Veamos un ejemplo. Si no inicializamos velocidad e intentamos realizar una operación matemática sencila antes de haberle asignado un valor, e intentamos trazar el resultado:

var velocidad : Number;

// ...

velocidad = velocidad + 10;

trace("Incrementando la velocidad, ahora velocidad = ", velocidad);   

obtendremos una respuesta no esperada:

Incrementando la velocidad, ahora velocidad = NaN

Y es que ese valor por defecto NaN significa que inicialmente velocidad no es un número, no hasta que nosotros le demos un valor. Por eso no le podemos sumar 10 hasta que la hayamos inicializado. Así que la forma más correcta y segura de escribir el código anterior sería:

var velocidad : Number = 0;
trace("La velocidad inicial es", velocidad);  
// ...

velocidad = velocidad + 10;

trace("Incrementando la velocidad, ahora velocidad = ", velocidad);   

Lo que aperecerá en la consola ahora sí que es lo que esperábamos

La velocidad inicial es 0
Incrementando la velocidad, ahora velocidad = 10

Así que si quereis evitar errores, sobre todo al principio, no olvidéis inicializar las variables cuando las declaréis.

Volver al índice

Actualización
Os dejo aquí un video que he encontrado que stá bastante bien y que cubre más o menos el mismo tema que este post:

También os dejo este otro, que explica como realizar algunas operaciones con estas variables:

Ejercicios:

  1. Repetir los ejemplos de los videos (Aquellos que me los entreguen recibirán su recompensa en el apartado de actitud de la nota)

Un poco de teoría: Datos y variables (I)

Volver al índice

Lo que vale un peine… digo un bit!

Nuestros programas necesitan datos para trabajar. La posición de una instancia en la escena, su nombre, la velocidad a la que se mueve, si es visible o no, etc.

Todos estos datos se almacenan en memoria. De momento nos importa poco entender los detalles del funcionamiento de la misma, y de como la gestiona el reproductor de flash. Lo que sí que nos importa, en esta primera fase, es gestionar bien que datos se almacenan en memoria y cuales no y como trabajar con ellos para no ocupar más de la necesaria.

Todos los lenguajes de programación definen lo que se denominan Tipos de Dato para facilitar esa tarea. Para entender como y por qué es necesario tener una visión general, aunque sea muy simplista, de como se gestiona la memoria en cualquier sistema informático.

Continuar leyendo “Un poco de teoría: Datos y variables (I)”

Los MovieClips con filtros se cachean como Bitmaps

Siempre que he podido, he evitado utilizar MovieClips con filtros porque la lógica me decía que cuantas más operaciones se realizan por fotograma más a trompicones va cualquier animación.
Quizás por eso nunca había caído en los pormenores del porqué de esta máxima en el caso de los filtros.

Hoy, por casualidad, releyendo la documentación de Greensock para optimizar las animaciones me he encontrado con esto:

If your animation looks a little jerky, it may be caused by cacheAsBitmap being set to true on your animating object(s). Whenever cacheAsBitmap is true, it only allows the object to render on whole pixel values which can make it look slightly jerky at slow speeds.

Nada nuevo, cacheAsBitmap = true convierte cualquier DisplayObject a Bitmap en tiempo real; los Bitmaps sólo se pueden colocar en píxeles exactos. Eso ya lo sabíamos. Pero después continua:

Important: whenever a DisplayObject has a filter applied to it (blur, glow, drop shadow, etc.), it forces cacheAsBitmap to true and cannot be reset to false unless the filter is removed. That’s a Flash limitation and has nothing to do with the tweening engine.

De esto no me acordaba: Un MovieClip al que se le aplican filtros se cachea automáticamente como Bitmap.

O sea, que esta es la razón principal, si el MovieClip está animado, de que se ralentice: Un MovieCLip cacheado como bitmap, al estar animado fuerza al reproductor a hacer un BitmapData.draw() en cada fotograma, lo cual es especialmente lento cuando los vectores contenidos en el MovieClip son complejos.
Además, como explican desde Greensock, como sólo se puede colocar en píxeles exactos, si se está moviendo, puede hacerloa a trompicones cunado los desplazamientos empiezan a ser cortos.

Escribiendo me doy cuenta de que probablemente esto ya lo haya leído alguna vez en otro lugar, pero nunca viene mal hacer recordatorios sobre cosas tan importantes, aunque a uno le deje una inquietante sensación de déjà vu.

Introducción a la programación de animaciones

Volver al índice

En esta primera sesión vamos a utilizar una animación preparada previamente en una instancia colocada en la escena de flash. El objetivo es aprender a hacer una animción interactiva utilizando un pequeño código en actionscript.

Podeis descargar la animación que vamos a utilizar de aquí (necesitaréis Flash CS5 como mínimo para abrirla)

Este es el resultado esperado:

[gigya src=”https://dl.dropbox.com/u/3646945/newbeForever/esne/1_Control%20de%20animaciones.swf” width=”550px” height=”400px”]

Continuar leyendo “Introducción a la programación de animaciones”

Los Singletons son el mal reencarnado. El pecado original fueron las clases estáticas

No sé si alguno de vosotros ha tenido alguna vez fuertes discusiones con algun colega programador sobre este tema, yo sí. Demasiadas. ;P

Y es que siempre resulta difícil explicarle a alguien por qué algo que es cómodo es malo. En fin, qué le vamos a hacer pero la experiencia nos ha demostrado a todos, creo, que normalmente las mejores soluciones no son las más fáciles… y punto. Pero como el sentido común no es el más común de los sentidos me voy a explicar.

El patrón Singleton facilita dos cosas:

  1. Control sobre la instaciación de una clase. Sólo permite crear una instancia (Esto suena bien)
  2. Un punto de acceso global a la única instancia de esa clase y por tanto a toda su funcionalidad (Suena todavía mejor)

Pero que algo suene bien o todavía mejor no es un argumento para utilizar una técnica a diestro y siniestro. Sobre todo cuando no se piensa en todas las implicaciones de esa melodía que parece sonar tan bien.

Continuar leyendo “Los Singletons son el mal reencarnado. El pecado original fueron las clases estáticas”