loadmovie

Escrito el 30/11/2003 por Xavi Beumala

Estoy trabajando en lo que será una galería de imágenes. El funcionamiento es el siguiente. Consiste en una ventana al estilo windows que tiene que cargar una serie de imágenes y recursos externos como .swf o .jpg. Estas imágenes se cargan y el usuario puede seleccionar una de ellas. Cuando la ha seleccionado se cierra la ventana y la imagen seleccionada se carga un sitio específico de pantalla.

¿Dónde está mi problema? Pues no es ni la primera vez que lo tengo y estoy seguro que a vosotros también os ha tocado los innombrables en más de una ocasión.

Cuando cargamas un .swf o un .jpg en un clip de película este pierde todas sus funcionalidades. En mi caso el clip de película tiene que responder a eventos de ratón para que se pueda seleccionar la imagen.

He creado una clase Item que me aporta esta funcionalidad y se la asigno al MC mediante Object.registerClass, pero al hacer loadMovie pierde todas las funcionalidades que le había programado. Esto no es ni mucho menos un bug que se haya detectado recientemente y se puede solventar utilizando un precargador con ayuda de setInterval, pero ayer se me ocurrió un pequeño rodeo que quizás os resulte más sencillo.

La programación que pierde el clip de película es la asignada mediante métodos de evento como por ejemplo: myMC.onRelease = function() .... En cambio no pierde la programación asignada directamente sobre la instancia mediante onClipEvent. Pues bién la solución que planteo hace uso de ambos sistemas y de duplicateMovieClip.

duplicateMovieClip nos permite duplicar un elemento que esté en el escenario manteniendo su programación, inclusive la asignada mediante onClipEvent.

Lo que he hecho ha sido crear un clip de película totalmente vacío y lo he arrastrado a un punto de la pantalla (donde más os guste). A este clip le he asignado el siguiente código:

onClipEvent(data) {
        var movieClass = eval(this._name.split("_")[1]);
        this.__proto__ = movieClass.prototype;
        this.__constructor__ = movieClass;
        this.__constructor__();
        this.onLoad();
}

Para usarlo solo tengo que hacer un duplicateMovieClip de este clip de película con una peculiaridad. El nombre de la instancia duplicada tiene que seguir unas determinadas reglas. Se le pone como nombre loQueQuieras_nombreDeLaClase. Por ejemplo:

blank.duplicateMovieClip("adios_item2",2, {_x:200,_y:300});
adios_item2.loadMovie("elefante.swf");

Esto nos duplica el clip de película 'blank' (al que se le ha asignado el onClipEvent) con el nombre 'adios_item2'. item2 indica el nombre de la clase del que heredará el nuevo clip de película. En este nuevo clip cargamos mediante loadMovie 'elefante.swf'.

Cuando termine la carga de elefante.swf saltará el evento onData (evento que se dispara cuando el MC ha cargado datos nuevos) a través de onClipEvent(data). Es en este momento y no antes cuando hacemos la asignación de la funcionalidad y lo hacemos mediante __proto__ y prototype. Siguiendo los pasos lógicos invocamos al constructor de la clase asignada (item2) y del evento onLoad.

Aquí podéis encontrar un archivo de ejemplo de uso

Aunque duplicateMovieClip esté limitado a hacer copias de un MC dentro de un mismo nivel, este sistema me ha gustado bastante por su sencillez sin liarme con setIntervals ni onEnterFrames.

En fin... espero que os guste y que comentéis alguna cosilla ;-)