Nuestro amigo Maximiles nos hace llegar otra duda con respecto a la galería de imagenes que usa un array para mostrar las fotos, la inquietud de el es que cada vez que ingresen al sitio vea las fotos de manera diferente con respecto a su orden.
Para ellos simplemente vamos a usar un prototipo en este caso para la clase Array que se encargara de recorrer nuestros elementos y desacomodarlos y volver el mismo array con diferente orden entre sus indices.
Escribimos el prototipo, en el primer frame como siempre de nuestra peli principal.
-
Array.prototype.random = function() {
-
var len = this.length;
-
var temp = new Array();
-
for (var i = 0; i<len; i++) {
-
var ran = Math.round(Math.random()*(this.length-1));
-
temp[i] = this[ran];
-
this.splice(ran, 1);
-
}
-
for (var j = 0; j<len; j++) {
-
this[j] = temp[j];
-
}
-
};
Y simplemente para usarlo seria asi: (despues que creamos o mandamos los datos al array)
-
misFotos_array.random();
Así quedaria el codigo de nuestra galeria con este nuevo agregado:
-
//Aqui indicamos que use codificasión, por si hay caracteres como ñ, acentos o cosas raras
-
System.useCodepage = true;
-
//la carpeta que tiene nuestras fotos, con un nombre medio cambiado por si ya tenemos otra
-
//carpeta llamada imagenes
-
var fotos:String = "gal/";
-
//velocidad del efecto entre fotos
-
var fade:Number = 35;
-
//primera foto a cargar
-
var iniciarFoto:Number = 0;
-
//tiempo que se va a mostrar
-
var tiempo:Number = 100;
-
//contador fade
-
var controlFade:Number = 0;
-
//contador de tiempo
-
var controlTiempo:Number = 0;
-
//creamos un objeto xml porque en definitiva el php nos devolvera un xml
-
miXML = new XML();
-
miXML.ignoreWhite = true;
-
miXML.onLoad = function(ok) {
-
if (ok) {
-
misFotos_array = this.firstChild.childNodes;
-
misFotos_array.random();
-
_root.createEmptyMovieClip("contenedor1_mc", 10);
-
_root.createEmptyMovieClip("contenedor2_mc", 20);
-
contenedor1_mc.loadMovie(fotos+misFotos_array[iniciarFoto].attributes.name);
-
iniciarFoto++;
-
contenedor2_mc.loadMovie(fotos+misFotos_array[iniciarFoto].attributes.name);
-
contenedor2_mc._alpha = 0;
-
curr_mc = 1;
-
onEnterFrame = function () {
-
if (curr_mc == 1) {
-
controlTiempo++;
-
if (controlTiempo>=tiempo) {
-
curr_mc = 2;
-
cambio = "IN";
-
}
-
}
-
if (curr_mc == 2) {
-
if (cambio == "IN") {
-
contenedor2_mc._alpha += 100/fade;
-
if (contenedor2_mc._alpha>=100) {
-
contenedor2_mc._alpha = 100;
-
cambio = "FIJO";
-
controlTiempo = 0;
-
iniciarFoto++;
-
if (iniciarFoto == misFotos_array.length) {
-
iniciarFoto = 0;
-
}
-
contenedor1_mc.loadMovie(fotos+misFotos_array[iniciarFoto].attributes.name);
-
}
-
}
-
if (cambio == "FIJO") {
-
controlTiempo++;
-
if (controlTiempo>=tiempo) {
-
cambio = "OUT";
-
}
-
}
-
if (cambio == "OUT") {
-
contenedor2_mc._alpha -= 100/fade;
-
if (contenedor2_mc._alpha<=0) {
-
contenedor2_mc._alpha = 0;
-
curr_mc = 1;
-
controlTiempo = 0;
-
iniciarFoto++;
-
if (iniciarFoto == misFotos_array.length) {
-
iniciarFoto = 0;
-
}
-
contenedor2_mc.loadMovie(fotos+misFotos_array[iniciarFoto].attributes.name);
-
}
-
}
-
}
-
};
-
}
-
};
-
//la url de nuestro PHP que crea un xml
-
miXML.load(fotos+'lista.php');
-
//
-
Array.prototype.random = function() {
-
var len = this.length;
-
var temp = new Array();
-
for (var i = 0; i
-
var ran = Math.round(Math.random()*(this.length-1));
-
temp[i] = this[ran];
-
this.splice(ran, 1);
-
}
-
for (var j = 0; j
-
this[j] = temp[j];
-
}
-
};
Como pueden ver al prototype lo puse al final, no hay problema porque el flash tiene un orden de lectura y siempre lee las funciones y prototipos antes de seguir ejecutando el resto del codigo, pero lo mejor es ponerlo al principio asi les queda mas facil y mas ordenado sobretodas las cosas.
20 febrero, 2007 at 10:41 am
Hola de nuevo, para agregar....
una vez que termina el array (linea 65) comienza con el mismo orden por lo tanto antes de asignarle el valor 0 a iniciar foto, le aplicamos de nuevo el prototype random al nuestro array desordenado.
misFotos_array.random();
3 marzo, 2007 at 9:45 am
Hola Leo.
Ojo, que flash no lee primero los prototipos como si fueran funciones. Al tener que igualarlo Flash lo toma como una línea mas.
Array.prototype.random = function()
En el ejemplo te funcionaria, porque tenes una carga de un XML, lo cual es asincrónico, lo que le da tiempo al flash a leer la línea 78.
También encuentro errores en los bucles del prototipo. Se ve que hubo algún problema cuando coloreaste el código.
4 marzo, 2007 at 3:00 am
Hola Damian!!! pense que asi hera, como siempre todos los dias se aprense algo nuevo!! como siempre usted un capo!! con el bucle me anda bien ami pero lo voy a controlar aver que ondin.
Gracias che por tus comentarios! :)
12 abril, 2007 at 9:01 pm
Hola yo nuevamente, ya lo solucione, el orden tiene que ser 01.png, 02.png ...10.png etc.
Ahora si lo ordena correctamente.
SAludos
9 mayo, 2007 at 1:34 am
Hola!!
Muy bueno el tutorial. Solo que a mí no me ha funcionado el RANDOM... Me arroja un error de sintaxis. Estoy usando unas fotos muy grandes... ¿Será posible poner una precarga antes de cada transición?
Saludos!
25 octubre, 2007 at 5:00 pm
Cordiales saludos,
¿Cómo hago para crear de un botón una matriz? es decir yo he creado un botón llamado circulo quiero hacer 100 de ese circulo pero en una matriz circulo(i). Que cuando seleccione de una lista el número de circulos a aparecer. haga algo como for (i=0; i
8 febrero, 2008 at 4:15 pm
Necesito hacer una pelicula flash con varios rompecabezas, utilizando random pero que las imagenes cargadas en los diferentes clips esten sincronizadas cada vez que se entre
11 febrero, 2008 at 12:30 pm
Dieggo no entiendo la pregunta!!!
26 diciembre, 2008 at 7:54 pm
Hola. me puedes mandar el archivo de flash 8 pa probarlo porfavor... te lo agradeceria. bendiciones.
7 abril, 2010 at 4:11 pm
ok, cuando copie el actionscript me arrojo error de salida, asi copio esto sin lineas, saludos
Array.prototype.random = function() {
var len = this.length;
var temp = new Array();
for (var i = 0; i<len; i++) {
var ran = Math.round(Math.random()*(this.length-1));
temp[i] = this[ran];
this.splice(ran, 0);
}
for (var j = 0; j=tiempo) {
curr_mc = 2;
cambio = "IN";
}
}
if (curr_mc == 2) {
if (cambio == "IN") {
contenedor2_mc._alpha += 100/fade;
if (contenedor2_mc._alpha>=100) {
contenedor2_mc._alpha = 100;
cambio = "FIJO";
controlTiempo = 0;
iniciarFoto++;
if (iniciarFoto == misFotos_array.length) {
iniciarFoto = 0;
}
contenedor1_mc.loadMovie(fotos+misFotos_array[iniciarFoto].attributes.name);
}
}
if (cambio == "FIJO") {
controlTiempo++;
if (controlTiempo>=tiempo) {
cambio = "OUT";
}
}
if (cambio == "OUT") {
contenedor2_mc._alpha -= 100/fade;
if (contenedor2_mc._alpha<=0) {
contenedor2_mc._alpha = 0;
curr_mc = 1;
controlTiempo = 0;
iniciarFoto++;
if (iniciarFoto == misFotos_array.length) {
iniciarFoto = 0;
}
contenedor2_mc.loadMovie(fotos+misFotos_array[iniciarFoto].attributes.name);
}
}
}
};
}
};
//la url de nuestro PHP que crea un xml
miXML.load(fotos+'lista.php');
//