Google Web after-hours

Contador en flash JSFL Traductor

The URI to TrackBack this entry is: http://www.after-hours.org/blog/archives/2006/01/03/sistema-de-precarga-multiple/trackback/

22 Responses to 'Sistema de precarga múltiple'

  1. markshock Says:

    Es genial.. yo estaba desarrollando uno parecido.. pero ahora se me plantean unas dudas.. a cerca del buen uso de este preload, y es

    ¿Como hacer MC’s Modulares.. con sus efectos e historias… como separar las capas?

    MC de grafico
    MC Sonido
    MC Datos

    Los mas claros son los 2 últimos.. pero el de Gráficos? uouuu se me hace complicado pensar como montar un site así…

    Alguna help? algo que oriente sobre el tema…

    Gracias y disculpad las molestias.

  2. Drus Says:

    Muy bueno Toni, hace tiempo que me llevo preguntando cómo desarrollar precargas de este tipo.

    Una cosa, no se qué estoy haciendo algo mal (me extraña porque has hecho el uso supersencillo) pero me pasa algo raro:
    Si publico como flash 7 me da el siguiente error:

    **Error** Scene=Scene 1, layer=Layer 1, frame=1:Line 13: Type mismatch in assignment statement: found Void where TextField is required.
    var percent_txt:TextField = _root.createTextField("text", this.getNextHighestDepth(), 15, 0, 0, 0);

    Y si publico como flash 8 me muestra los elementos antes de que se cargue el último item del array. He colocado un trace y por lo que veo el valor de currentItem las dos primeras veces es igual a 0… no entiendo que puede ser :(

    ¿alguna pista?

  3. tonilopez Says:

    Hola Marck, no entiendo bien el problema que planteas. Lo ideal para un sistema como este es tener la aplicación dividida en módulos. Pe: sonido, galeria de fotos si la hay, etc … cada módulo es independiente y pones las capas que quieras. En cuanto a los .swf que cargas en el swf principal, puedes ponerlos en capas si cada clip de pelicula contenedor (que especificas en el Array) está en una determinada capa, pero no es necesario ya que gestionaras el indice de apilamiento en el momento de cargar la película (cada pelicula cargada ocupada un nivel superior)

    Drus.,

    ocurre que escribí el código con flash 8 solo por una razón: Flash 8 visualiza los trace de los eventos del objeto movieclipLoader en local. Flash mx 2004 no. Me explico:

    Si en flash MX 2004 escribes:

    movieClipLoader.onLoadProgress = function(target_mc, loadedBytes, totalBytes) {
    trace(Math.round((loadedBytes / totalBytes) * 100) + “%")
    }

    No pasará nada. En cambio en flash 8 si, por eso no me di cuenta del fallo que comentas y que aunque he solucionado, no tengo muy claro. Simplemente cuando declares la variable percent hazlo sin declarar el tipo:

    var percent_txt = blablabla

    En cuanto a lo que comentas que muestra los elementos antes, no estoy seguro, pero puede ser que los archivos que cargas no sean muy pesados y por tanto todo sucede tan rápido que produce ese efecto (voy a repasar ese aspecto a ver que puede ser)

    He hecho un par de cambios muy peqeños, pongo aqui el código (hasta que no lo vea claro no lo cambio en el post)

    Stage.align = “TL";
    Stage.scaleMode = “noScale";
    // – variable declaration
    var itemsArray:Array = new Array();
    var itemsArray:Array = new Array();
    itemsArray[0] = {url:"img/fondo1.jpg", target:"bg_mc", msg:"Cargando background", x:0, y:0};
    itemsArray[1] = {url:"menu03.swf", target:"menu_mc", msg:"Cargando menú", x:110, y:50};
    itemsArray[2] = {url:"dynamicVolumeSlider.swf", target:"sound_mc", msg:"Cargando sonido", x:100, y:10};
    // –
    var currentItem:Number = 0;
    var totalItems:Number = itemsArray.length;
    var movieClipLoader = new MovieClipLoader();
    var percent_txt = createTextField("text", this.getNextHighestDepth(), 15, 0, 0, 0);
    percent_txt.html = true;
    percent_txt.autoSize = true;
    percent_txt.setNewTextFormat(new TextFormat("Verdana", 10, 0xffffff, false, false, false, null, null, “right"));
    // – init function
    init = function () {
    loadItems();
    };
    // – load the items function
    loadItems = function () {
    if (currentItem < totalItems) {
    newContainer_mc = this.createEmptyMovieClip(itemsArray[currentItem].target, this.getNextHighestDepth());
    newContainer_mc._y = -Stage.height;
    newContainer_mc._alpha = 0;
    movieClipLoader.loadClip(itemsArray[currentItem].url, newContainer_mc);
    }
    };
    // – onLoadProgress function
    movieClipLoader.onLoadProgress = function(target_mc, loadedBytes, totalBytes) {
    percent_txt.htmlText = itemsArray[currentItem].msg + ‘ ’ + ‘ | ‘ + ‘ ’ + (currentItem + 1) + ‘ ’ + “de” + ‘ ’ + totalItems + ‘ ’ + ‘ ’ + ‘ | ‘ + Math.round((loadedBytes / totalBytes) * 100) + “%";
    trace(percent_txt.text);
    };
    // – onLoadComplete function
    movieClipLoader.onLoadComplete = function() {
    currentItem++;
    if ((currentItem) == totalItems) {
    percent_txt.removeTextField();
    for (var i = 0; i < totalItems; i++) {
    eval(itemsArray[i].target)._x = itemsArray[i].x;
    eval(itemsArray[i].target)._y = itemsArray[i].y;
    eval(itemsArray[i].target)._alpha = 100;
    }
    }
    loadItems();
    };
    init();

    Saludos

  4. Drus Says:

    Perfecto Toni, va como la seda. Era yo que la estaba cagando, me había dejado un mc llamado “text_mc", porque al principio no vi que creabas los holder por código… los cree a mano, y luego los borré pero me dejé uno :roll:

    El error que en el 7 es un poco rarito no? ya ví que se solucionaba no definiendo el tipo pero me parece incomprensible… yo no veo el Type mismatch por ningún lado, no se porqué se empeña en que es Void…

    En fin, muchas gracias Toni.

  5. YAYA Says:

    Hola,
    podemos haber un ejemplo concreto (fla), s\’il vous plait ;-)

    Yaya

  6. tonilopez Says:

    OK Yaya, pondré un ejemplo.

    Saludos.

  7. eldavi Says:

    Era lo que buscaba!! pero para variar dudas de un negado….Que hay que escribir donde pone target despues de especificar los swf a cargar??
    GRACIAS :grin:

  8. tonilopez Says:

    Hola David,

    target, será el nombre de instancia de un clip de película que se crea dinámicamente. Justamente donde dice:

    this.createEmptyMovieClip(itemsArray[currentItem].target,this.getNextHighestDepth());

    saludos

  9. eldavi Says:

    Vaya lio, jajaja…casi espero a k pongas el ejemplo para descargar k me entero mejor…. :mrgreen:

  10. Phillipo Says:

    One question…. La clase MovieClipLoader sigue teniendo los problemas que tenia en determinados navegadores por culpa del plugin, o ya no.

  11. phpleo Says:

    :mrgreen: Muy bueno tu ejemplo tony, pero me surge una duda, ya se que tu sistema precarga archivos externos, mi duda es con respcto a como ahcer para precargar tambien el archivo principal donde cargan los demas archivos.

    Gracias y sigue asi :wink:

  12. tonilopez Says:

    Si utilizas este sistema, el archivo principal, cumple la única misión de cargar los módulos de que se compone la aplicación. Por tanto, no necesita precarga.

    Si quieres hacer precarga de este, puedes consultar en el blog hay varios sistemas de precarga. Lo que tendrias que hacer, es una vez precargado el principal, aplicar lo que se explica en este articulo en el fotograma 2.

    saludos

  13. Phillipo Says:

    Hay una cosa que se me escapa o no entiendo. Yo he usado el código y en fin, me carga los elementos bien solapandolos unos encima de otros. Hasta aki perfecto si el codigo se usa para inicializar el entorno, pero yo por ejemplo lo uso para, mediante el menu, cargar las secciones y me falla, o mejor dicho me va solapando capas sin parar. Si le meto un removeClip del futuro clip a crear, me pierde el actual antes de hacer la precarga.

    ¿Como deberia usar este sistema para cargar subsecciones? ¿Deberia implementar un sistema secundario para cargar modulos aislados?

  14. Phillipo Says:

    He puesto lo siguiente en cada boton:

    myBTN.onPress = function() {
    _root.elementos = _root.elementos.splice(0);
    _root.elementos[0] = {id:"externo_mc",url: “../swf/menus_secciones.swf",x:0,y:0};
    _root.initLoader();
    }

    y en initLoader he añadido:

    currentItem = 0;

  15. teo Says:

    :cry: un ejemplo por vafor !

  16. Yaya Says:

    Hi,

    el codigo no funciona ….. :-(
    podemos tener un fla, para un pequeño francés en sufrimiento :-P

    Yaya
    Merci beaucoup

  17. blade35_36 Says:

    :smilemuy bueno

  18. susana Says:

    ! espero que me podais echar un cable, estoy hecha un lio!!
    tengo un flash con una movie (mc) que contiene varios botones, cada boton llama a un .swf que a su vez contiene otra movie (mc) con otros botones. todo se abre pero no consigo hacer los .swf ya utilizados.
    querria dar una orden tipo “al clicar otro boton, elimina lo existente”
    creo que el problema es que todo se carga en diferentes preloders
    gracias!!

  19. Acid Reflux Says:

    Acid Reflux
    Acid Reflux

  20. tonilopez Says:

    Hola Susana, efectivamente, el problema es que abres cada .swf en un clip de película nuevo. Te recomiendo que consultes alguno de los muchos artículos sobre precarga que hay en el blog. Te dejo los enlaces para facilitarte la tarea:

    http://www.after-hours.org/blog/index.php?s=precarga&Submit=Go%21
    http://www.after-hours.org/blog/index.php?s=preloader&Submit=Go%21

    Saludos

  21. susana Says:

    o, gracias! me he descargado algunos archivos, espero encontrar la soluciòn!

    otra cosa: no consigo “submit comment” en el ejemplo de “scroll bàsico", alguien conoce al autor?? no consigo que flash me importe el texto una vez modificado el archivo original.
    serà porque trabajo en macintosh??
    + querrìa cambiarle el nombre a la variable pero no la encuentro!!
    (gracias)

  22. susana Says:

    el tema del texto lo he solucionado, un despiste! :oops: