kadazuro.com
 Tutoriales SharedObject.
 
por: kadazuro
imprimir este documento
 

Introducción:

SharedObject es implementado con el plug-in de MX de flash, es una forma de guardar información en la computadora del usuario. Pensemos en ellos como si fueran "cookies", con esto podemos guardar información que nos intereza que sea recordada la siguiente vez que el usuario accede a nuestro proyecto, como por ejemplo:

  • El nombre y el correo del usuario si llena nuestro formulario, para que así la siguiente vez no tenga que digitarlo de nuevo.
  • El marcador del último score que hizo en el juego en nuestro proyecto.
  • Las prefencias para navegar en nuestro site, ya sea que tengamos varios fondos a escoger o varios tipos de música.
  • Ultima sección o página visitada, vamos no sería bonito que cuando una entre a un site le salga un mensaje que diga: "Hola de nuevo!, deseas seguir viendo el site donde quedaste la última vez, o verlo desde el inicio?"
  • La forma en que acomodó nuestro menú la última vez que nos visitó.

entre otras muchas.

Cómo funciona:

SharedObject tiene tres métodos:

SharedObject.getLocal();
SharedObject.getSize();
SharedObject.flush();

SharedObject.getLocal(): devuelve un objeto guardado en la computadora local.
SharedObject.getSize(): devuelve el tamaño del objeto en bytes.
SharedObject.flush(): graba inmendiatamente la información.

Lo primero que tenemos que hacer es ver si hay datos guardados, para esto debemos recordar obviamente el nombre que le pusimos a nuestro sharedObject ( el nombre con que guardamos la información en la computadora del usuario, no el objeto que usamos en flash ).

ej.
so = sharedObject.getLocal("misDatos");

misDatos, es el nombre del sharedObject, en este caso lo que estoy es asignándole el valor de lo que tenga guardado en misDatos, al la variable/objeto so ( de sharedObject).
De ser la primera vez, este objeto no contendrá dato alguno, pero al no existir y preguntar por él, Flash se encargará de crearlo, sin dato alguno pero lo crea.

De haber datos estos se guardan en un objeto especial llamado "data", en nuestro caso podemos accesar a los valores de so de la siguiente forma ( recuerda que so, es la variable en flash donde hemos asignado el valor de nuestro sharedObject "misDatos" )

so.data.miVariable

Para saber si hay datos hay una forma muy fácil de hacerlo : preguntado; es decir, si el fla va a guardar información de usuario en una variable "userName" podemos preguntar haciendo lo siguiente.

if (so.data.userName != undefined ){
  ....
}

Es decir, si el dato userName es distinto a indefinido, i.e.: si existe. lo utilizamos. De no existir la información la podemos grabar.

else{
  so.data.userName = miCampoDeTexto.text;
}

suponiendo que el usuario ya haya digitado su nombre en nuestro campo de texto.
Al salir de flash el sharedObject guardará la información que este contenga, pero para estar seguros le podemos decir al SharedObject que la guarde.

else{
  so.data.userName = miCampoDeTexto.text;
  so.flush();
}

Ejemplo práctico: Recordar la posición de 4 botones.

Vamos a suponer que tenemos 4 botones en el escenario que el usuario puede mover ( drag ) y colocar donde el guste, y cuando vuelva a acceder la página los botones van a estar donde el los dejó. Para esto vamos a crear un sharedObject que nos guarde dentro de un array las posiciones x,y de cada boton.

A.- Simplifiquemonos la vida:

Vamos a tener 4 botones que va a hacer las mismas acciones. En este caso on Press startDrag, onRelease/on DragOut stopDrag, (en mi caso aparte de ponerle las acciones le voy a poner el texto dinámicamente); no sería genial tener una función que nos "instalara" estos botones?, algo como

setBtn = function(miBoton) {
  miBoton.onPress = function(){}
  miBoton.onRelease = function (){}
  miBoton.onReleaseOutside = function (){}
}

Así sólo tendríamos que pasar los nombre de las instancias de los botones

setBtn(boton1);

para que este ya quedara listo. =)
Los botones que tengo no son más que un movieClip con 3 frames con labels _up, _over,_down los cuales representarán los estados del "botón" más un campo de texto con nombre de instancia "campo", agregando el autoSize más la asignación de texto, como que queda mucha gente en la función.

setBtn = function(miBoton,texto) {
  miBoton.campo.autoSize = "center";
  miBoton.campo.text = texto;

  miBoton.onPress = function(){
    .... 
  }

  miBoton.onRelease = function (){
    .... 
  }

  miBoton.onReleaseOutside = function (){
    .... 
  }
}

Talvez no lo veas muy complejo por ahora, pero una vez que tengamos las funciones, será mucho más difícil de leer. para que no suceda esto vamos a partir el código en pequeños pedacitos.

customPress = function (){
  ...
}

customRelease = function(){
  ...
}

setActions = function (btn){
  btn.onPress = customPress;
  btn.onRelease = customRelease;
  btn.onReleaseOutside = customRelease;
}

setBtn= function(btn, texto){
  btn.campo.autoSize = "center";
  btn.campo.text = texto;
  setActions(btn)
}

De esta forma queda más entendible, es decir cuando llamemos a la función setBtn pasándole el botón y el texto como parámetros, esta asignará el texto, y luego llamará a la función setActions, que asigna las funciones para onPress, onRelease y onReleaseOutside, las cuales fueron previamente declaradas.

Si te fijaste bien, verás que onReleaseOutside y onRelease apuntan a la misma función, pero porqué le ponemos customRelease??..., mejor le cambiamos el nombre para que nos indique mejor lo que hace, digamos "reset", asi ni release ni releaseOutside se recienten.

B. Funciones para los Botones.

Las funciones a como las entendemos por el momento estás asi: onPress => startDragg, onRelease, releaseOutside => reset ( stopDrag ).

B.1. CustomPress.

customPress = function (){
  this.startDrag(false);
}

B.2. reset.

reset = function (){
  stopDrag();
  this._x = Math.round(this._x);
  this._y = Math.round (this._y);
}

Lo de Math.round es para que quede en píxeles enteros cuando lo suelten, esto es útil cuando se trabaja con gráficos o fuentes píxel.

C. El SharedObject.

Este es el héroe de la película. Lo primero que hacemos en pensar como vamos a guardar la información.
Tenemos 4 botones y de estos queremos guardar las posiciones x,y. podemos guardar un dato por variable:

boton1x=valor;boto1y=valor...

pero luego tendríamos que asignar todas estas variable casi que a mano.

btn1._x = so.data.boton1._x;
btn1._y = sp.data.boton1._y;
....

Ahora imagínate esto si queremos guardar la posición de 50 objetos!.

C.1. Arrays, Objetos, Arrays de Objetos, y referencias.

Una forma útil de mantener la información ordenada es el uso de Array u Objetos, y una forma sencilla de manejar objetos es usar Arrays cuyos campos apuntan (referencian) a instancias de objetos en el escenario ( en nuestro caso botones ), una vez hecho esto, podemos acceder a las propiedades de los objetos que nos interezan ( en este caso, _x, _y ).

C.1.1. Array de botones.

En este Array vamos a guardar las referencias a los botones que tenemos en el escenario ( de hecho más que botones son movieClips que actuan como botones ), y lo hacemos de la siguiente forma.

botones = [btn1,btn2,btn3,btn4]

Que vendría siendo lo mismo que :

botones = new Array (btn1,btn2,btn3,btn4)

La ventaja de usar este array es que para acceder a las propiedades de los botones solo tenemos que recorrer el Array con un simple "for"

var largo = botones.length;
for( var n = 0; n < largo; n++ ){
  trace ( botones[n]._name + "._x =" + botones[n]._x )
}

El código anterior nos muestra el nombre del boton más las propiedad _x en la ventana del ouput.

btn1._x =216
btn2._x =190
btn3._x =163
btn4._x =112

C.1.2 El Array dentro del SharedObject.

Ya que tenemos un array con las referencias a los botones, podemos aprovechar para hacer uno dentro del sharedObject, ya que de esta forma ambos arrays serían del mismo largo, y podríamos actualizar u obtener la información con un "for". En este caso no vamos a guardar referencias a los botones sino más bien vamos a guardar sus propiedades dentro de un Objeto de manera que para acceder a los datos guardados del objeto sharedObject podemos hacerlo asi:

so.data.btns[n].x = valor// mostrando el x valor del botonN donde N es un indice del array.

Si n vale 0 y buscamos en el array botones de nuestra movie, botones[n] corresponde a la referencia hacia el btn1 por lo que el valor x se refiere a la propiedad _x (btn1._x) que tenía btn1 cuando grabamos la información. Para grabar esta información dentro del Array btns dentro de nuestro SharedObject ocupamos también el Array botones en el que tenemos las referencias, asi dentro del bucle ("for") mientras vamos referenciando a cada clip con el indice, igualmente vamos guardarndo su información con el mismo indice pero en el array del sharedObject.

var l = botones.length;
for ( var n = 0; n < l; n++){
  so.data.btns[n] = {x : botones[n]._x, y: botones[n]._y};
}

Que es la versión corta para.

var l = botones.length;
for ( var n = 0; n < l; n++){
  so.data.btns[n] = new Object();
  so.data.btns[n].x = botones[n]._x;
  so.data.btns[n].y = botones[n]._y;
}

C.2. Actualizar y Asignación.

Nos detenemos a analizar que debemos hacer y cuando debemos hacerlo.

caso 1. El usuario entra por primera vez, por lo que el sharedObject no existe, debemos crearlo junto con las posiciones de los botones (Actualizar).

caso2. El usuario ya ha visitado nuestra página, así que debemos asignar las posiciones a los botones que tenemos guardadas en nuestro sharedObject (Asignación).

caso3. El usuario arrastra un botón y cambia la posición de algún botón, este cambio también debemos guardarlo (Actualizar).

Una vez hecho este estudio podemos ver que ocupamos sólo dos funciones : upDate para cuando hagan cambios o se entre a nuestro proyecto no siendo visitado antes; y setPos únicamente cuando ya se ha entrado a nuestro proyecto anteriormente.
Notémos también que cada vez que el usuario mueve un botón esta posición debe ser guaradada llamando a la función upDate, como cuando el botón deja de hacer Drag llama a la función reset, lo lógico sería que desde reset se llame a la función upDate.

upDate = function(){
  var l = botones.length;
  for ( var n = 0; n < l; n++){
    so.data.btns[n] = {x : botones[n]._x, y: botones[n]._y};
  }
}

setPos= function(){
  var l = botones.length;
  for ( var n = 0; n < l; n++){
    botones[n]._x = so.data.btns[n].x;
    botones[n]._y = so.data.btns[n].y;
  }
}

y la función reset con la llamada a upDate queda así:

reset = function (){
  stopDrag();
  this._x = Math.round(this._x);
  this._y = Math.round (this._y);
  this._parent.upDate();
}

C.3 Creación del sharedObject.

Como vamos a guardar la información dentro de un Array llamado btns, lo que tenemos que hacer una vez creado el objeto es preguntar si btns ( dentro de data, del sharedObject) existe, si no es así, que lo cree y que nos guarde la información; si este existe, que nos actualize la posición de nuestros botones.

if(so.data.btns == undefined ){
  so.data.btns = new Array();
  upDate()
}else{
  setPos()
}

D. Optimización

Como habrás notado cada vez que se mueve un botón se actualizan todos, siendo esto algo poco funcional en el caso que se tuvieran muchos objetos.
En el zip, podrás encontrar una versión extra, con esta optimización.

E. Ejemplo.

Para ver el ejemplo funcionando: abre el ejemplo, mueve los botones, cierra la ventana y lo abres de nuevo.

F. Soporte.

Si tienes preguntas sobre este tutorial, puedes ver las echas por otros usuarios o postear una nueva dentro del tema que hay en FlashLA presionando en botón.

fla's a fondo

 

 
regresar
{diccionario}
 
feb 05 2003: Se publica el documento.