LeoBaraldi – Ejemplos Flash, Ejemplos actionscript, Tutoriales Flash, Tutoriales actionscript, actionscript 3, curso de actionscript

Recursos y ejemplos de actionscript, Flash, AIR, Flex, CSS y HTML. Tutoriales de actionscript 2 y actionscript 3

Desordenar un array random en flash 8

| 10 Comments

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.

Actionscript:
  1. Array.prototype.random = function() {
  2. var len = this.length;
  3. var temp = new Array();
  4. for (var i = 0; i<len; i++) {
  5. var ran = Math.round(Math.random()*(this.length-1));
  6. temp[i] = this[ran];
  7. this.splice(ran, 1);
  8. }
  9. for (var j = 0; j<len; j++) {
  10. this[j] = temp[j];
  11. }
  12. };

Y simplemente para usarlo seria asi: (despues que creamos o mandamos los datos al array)

Actionscript:
  1. misFotos_array.random();

Así quedaria el codigo de nuestra galeria con este nuevo agregado:

Actionscript:
  1. //Aqui indicamos que use codificasión, por si hay caracteres como ñ, acentos o cosas raras
  2. System.useCodepage = true;
  3. //la carpeta que tiene nuestras fotos, con un nombre medio cambiado por si ya tenemos otra
  4. //carpeta llamada imagenes
  5. var fotos:String = "gal/";
  6. //velocidad del efecto entre fotos
  7. var fade:Number = 35;
  8. //primera foto a cargar
  9. var iniciarFoto:Number = 0;
  10. //tiempo que se va a mostrar
  11. var tiempo:Number = 100;
  12. //contador fade
  13. var controlFade:Number = 0;
  14. //contador de tiempo
  15. var controlTiempo:Number = 0;
  16. //creamos un objeto xml porque en definitiva el php nos devolvera un xml
  17. miXML = new XML();
  18. miXML.ignoreWhite = true;
  19. miXML.onLoad = function(ok) {
  20. if (ok) {
  21. misFotos_array = this.firstChild.childNodes;
  22. misFotos_array.random();
  23. _root.createEmptyMovieClip("contenedor1_mc", 10);
  24. _root.createEmptyMovieClip("contenedor2_mc", 20);
  25. contenedor1_mc.loadMovie(fotos+misFotos_array[iniciarFoto].attributes.name);
  26. iniciarFoto++;
  27. contenedor2_mc.loadMovie(fotos+misFotos_array[iniciarFoto].attributes.name);
  28. contenedor2_mc._alpha = 0;
  29. curr_mc = 1;
  30. onEnterFrame = function () {
  31. if (curr_mc == 1) {
  32. controlTiempo++;
  33. if (controlTiempo>=tiempo) {
  34. curr_mc = 2;
  35. cambio = "IN";
  36. }
  37. }
  38. if (curr_mc == 2) {
  39. if (cambio == "IN") {
  40. contenedor2_mc._alpha += 100/fade;
  41. if (contenedor2_mc._alpha>=100) {
  42. contenedor2_mc._alpha = 100;
  43. cambio = "FIJO";
  44. controlTiempo = 0;
  45. iniciarFoto++;
  46. if (iniciarFoto == misFotos_array.length) {
  47. iniciarFoto = 0;
  48. }
  49. contenedor1_mc.loadMovie(fotos+misFotos_array[iniciarFoto].attributes.name);
  50. }
  51. }
  52. if (cambio == "FIJO") {
  53. controlTiempo++;
  54. if (controlTiempo>=tiempo) {
  55. cambio = "OUT";
  56. }
  57. }
  58. if (cambio == "OUT") {
  59. contenedor2_mc._alpha -= 100/fade;
  60. if (contenedor2_mc._alpha<=0) {
  61. contenedor2_mc._alpha = 0;
  62. curr_mc = 1;
  63. controlTiempo = 0;
  64. iniciarFoto++;
  65. if (iniciarFoto == misFotos_array.length) {
  66. iniciarFoto = 0;
  67. }
  68. contenedor2_mc.loadMovie(fotos+misFotos_array[iniciarFoto].attributes.name);
  69. }
  70. }
  71. }
  72. };
  73. }
  74. };
  75. //la url de nuestro PHP que crea un xml
  76. miXML.load(fotos+'lista.php');
  77. //
  78. Array.prototype.random = function() {
  79. var len = this.length;
  80. var temp = new Array();
  81. for (var i = 0; i
  82. var ran = Math.round(Math.random()*(this.length-1));
  83. temp[i] = this[ran];
  84. this.splice(ran, 1);
  85. }
  86. for (var j = 0; j
  87. this[j] = temp[j];
  88. }
  89. };

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.

Author: LeoBaraldi

Diseñador gráfico y programador en Web, con experiencia profesional en el rubro desde 1998. Experto en diseño de interfaces Frontend y Backend, sitios, portales y dispositivos móviles. Experto en estándares, CSS y HTML, amplios conocimientos en CEO. Desarrollador de sitios multi plataformas, HTML5, CSS3 y JQuery. Experto programador en Adobe Flex, AIR y ActionScript 3.0. Conocimientos en lenguajes como PHP, Javascript y bases de datos MySQL. Profesor de Diseño y Diseño Web en la Escuela Superior de Diseño Aguas de la Cañada, asesor y colaborador para medios gráficos, editoriales y revistas afines. Actualmente Jefe de Producción en Manifesto solutions.

10 Comments

  1. 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();

  2. 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.

  3. 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! :)

  4. Hola yo nuevamente, ya lo solucione, el orden tiene que ser 01.png, 02.png ...10.png etc.
    Ahora si lo ordena correctamente.
    SAludos

  5. 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!

  6. 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

  7. 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

  8. Dieggo no entiendo la pregunta!!!

  9. Hola. me puedes mandar el archivo de flash 8 pa probarlo porfavor... te lo agradeceria. bendiciones.

  10. 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');
    //

Deja un comentario

Required fields are marked *.

*