Una de las caracterí sticas que más me llamó la atención cuando apareció Flash MX fue el nuevo estilo para escribir scripts, lo que yo denomino scritps remotos. Me explico, antes de MX, era necesario escribir los scripts asociados a un objeto en las acciones del propio objeto, por ejemplo, para escribir las acciones de un botón, lo seleccionábamos, abrí amos el panel acciones y escribí amos algo así :
on (release) {
// acciones
}
Flash MX nos brinda la posibilidad de escribir los scripts en la lí nea de tiempo principal, lo cual considero una gran ventaja, los scripts son mucho más estructurados al estar todos en la misma lí nea de tiempo. Con las versiones anteriores, si querí as ver que acciones tení a un objeto tenias que buscarlo, seleccionarlo y abrir el panel acciones, o en el caso de un clip de pelí cula, tení amos que editar el clip (editar en contexto), tarea que se podí a convertir en una odisea cuando se trataba de una pelí cula compleja.
A partir de flash MX, al igual que los clips de pelí cula, los botones y campos de texto, pueden instanciarse, por lo que podemos cambiar propiedades, crear métodos etc. unificando todo el código actionScript en un mismo bloque, facilitando la lectura y comprensión de la programación de la pelí cula. Por ejemplo para el caso anterior, escribirí amos :
boton.onRelease=function(){
// acciones
}
Bien, yo que soy de la vieja escuela (cuando empecé no existí a Internet, ni editores visuales), estaba acostumbrado a escribir mis aplicaciones con un editor de texto un poco más complejo que el bloc de notas e infinitamente más rudimentario que cualquier editor de textos actual, esto puede parecer un inconveniente, pero en realidad la forma de trabajar de entonces, obligaba a conocer más a fondo el lenguaje con el que programabas (en mi caso RPG-400 y Clipper).
Teniendo en cuenta lo anterior es de suponer que mi entusiasmo fue bastante grande, nunca me habí a convencido la manera en que se estructuraba la programación en flash, en consecuencia me lancé rápidamente a cambiar todos los hábitos adquiridos desde la versión 3 y todos mis scripts van siempre en un fotograma clave ( o mejor aún en un archivo externo .as)
Pero hay un caso en el que es necesario volver al viejo modelo, un caso bastante tí pico es el utilizar onClipEvent(load) para asignar propiedades a un clip de pelí cula cuando es cargado.
Ejemplo:cargar un clip de pelí cula con la propiedad _visible = 0
onClipEvent (load) {
this._visible = 0;
}
Esto está bien, pero va en contra de mi ideal de escritura de scripts, y es aquí donde el tí tulo de este post cobra sentido. Como ya he comentado, no me gusta esparcir código por toda la pelí cula, esta es la opción que propongo para el caso anterior:
if (inicio == undefined) {
mc_miclip._visible = 0;
inicio = true;
}
Ejemplo
La pelí cula consta de un clip de pelí cula con la propiedad _visible = 0 al cargar y un botón que al ser pulsado cambia la propiedad _visible=1, se trata de un ejemplo muy sencillo pero que creo que ilustra bien lo que explico.
this.onEnterFrame = function() {
if (inicio == undefined) {
mc_miclip._visible = 0;
inicio = true;
}
mc_boton.onRollOver = function() {};
mc_boton.onRelease = function() {
mc_miclip._visible = 1;
};
};
Marzo 28th, 2004 at 8:59 am
Si señor, muy bien.
Marzo 28th, 2004 at 12:27 pm
Toni.
Acabas de resolver una de mis molestias cuando escribo AS.
Se podrí a resumir que:
/*como esto no funciona:
mc_miclip.onLoad = function() {
this._visible = 0;
}*/
//sustituir por esto otro:
this.onEnterFrame = function() {
mc_miclip._visible = 0;
delete this.onEnterFrame;
}
Saludos
Marzo 28th, 2004 at 1:30 pm
Sergio,
la solución que propones no digo que no funcione, pero no es muy correcto crear un evento enterframe para un solo ciclo, entiendo que lo que haces para evitar que el clip de pelí cula permanezca siempre con la propiedad _visible = false; esa es la razón por la que en mi propuesta utilizo una variable, una vez cumplido el objetivo (el clip no se ve), le asigno un valor a la variable de manera que variable != undefined y deja de tener efecto el condicional.
Marzo 28th, 2004 at 2:07 pm
Gracias Toni por tu comentario.
El añadir la lí nea ‘delete this.onEnterFrame;’ fue para evitar que el mc procesara continuamente un evento que ya no tiene motivo.
tienes razón cuando dices que:
“no es muy correcto crear un evento enterframe para un solo ciclo”
saludos
Marzo 28th, 2004 at 4:25 pm
Toni, me gustarí a que me respondieses a esta pregunta: ¿Cuales son ‘las cosas’ (eventos, objetos…) que cargan más un SWF? ¿Porqué se reproducen a tan ‘lentos’, a pesar de configurarlos a 25 o 30 fps?
Marzo 28th, 2004 at 4:55 pm
Montxo,
hay varios motivos por los que una pelí cula se puede reproducir lentamente, dejando de lado el procesador de que dispongas, podrí a citar:
script mal estructurado
imágenes muy pesadas
abuso de los degradados
textos convertidos a gráficos
archivos de sonido muy pesados
archivos de ví deo muy pesados
animaciones muy complejas o poco optimizadas
uso de escenas
algunos trucos para mejorar la reproducción
1. utilizar loadMovie
es decir, no construir webs cuyo contenido está en un mismo SWF, por ejemplo: un web con cuatro secciones, se monta la pelí cula principal y cuatro pelí culas aparte que se cargan en la principal con loadMovie()
Con loadMovie, no solo podemos cargar otros SWF, tambiem podemos cargar archivos de imagen (JPG), imagina una galerí a de fotos con 50 imágenes, mejor cargar cada imagen cuando el usuario solicite verla (por ejemplo por medio de un ví nculo o botón)
2. loadVars
Con el objeto loadVars cargamos archivos de texto externos (.txt, .PHP, .XML, etc.). Con este método no solo aligeramos ‘peso’ a nuestras webs, sino que además se le da un aspecto mas limpio a las tipografias, ya que utilizamos campos de texto dinámico para depositar el contenido de los archivos cargados.
3. funciones
está demostrado que el uso de funciones es clave para mejorar el rendimiento de los SWF cuando se repite mucho código.
4. gráficos
es recomendable, optimizar los gráficos en lo posible, cuidar los trazados(si amplias un dibujo hecho con flash, comprobarás la cantidad de lí neas que sobran o que están separadas unas de otras), evitar formas con trazado si no son necesarios, evitar en lo posible el uso de los degradados.
5. reutilizar objetos
por ejemplo, si tienes 10 botones en tu pelí cula, intenta usar un solo objeto con 10 nombre de instancia diferentes.
caso práctico:
1. creo el objeto botón
2. en una capa inserto los gráficos
3. en una capa inserto un campo de texto dinámico
(por ejemplo mitexto)
ahora necesito 3 botones
abro la biblioteca y a cada botón le asigno un nombre de instancia diferente:
boton1, boton2, boton3
con un sencillo script controlo cada instancia de botón:
boton1.mistexto.text ="yo”
boton2.mistexto.text ="portfolio”
boton3.mistexto.text ="contacto”
boton1.onRelease=fuction(){
// acciones
}
boton1.onRollOver=function(){
// acciones
}
y lo mismo para cada botón.
Esta misma práctica la podemos aplicar a cualquier tipo de objeto.
La verdad es que el tema puede ser mucho más largo, desde aquí invito a quien se anime a contribuir en estas notas.
saludos
Marzo 28th, 2004 at 6:02 pm
Permí teme cerrar el corchete, Si señor, muy bien.
Saludos
Marzo 28th, 2004 at 7:05 pm
A mi también me ha fastidiado lo del clip.onLoad de toda la vida. Sin embargo encontré una curiosa manera de solucionarlo.
Puedes poner los onLoad en la lí nea de tiempo principal si abres el panel de acciones para el clip de pelí cula al que te quieras referir y le añades un espacio o unas barras de comentario.
No me preguntéis por qué funciona ni como lo encontré porque fue pura casualidad (bueno, y muchas horas de estar ca***dome en la madre del flash buscando una solución). Es un poco tedioso de utilizar si tienes muchos clips, xq tienes q abrirlos todos, pero funciona.
Espero haberme explicado bien.
Marzo 29th, 2004 at 9:48 am
Vale, pero de lo que trata este tip es de escribir todo el actionScript en una misma lí nea de tiempo.
Para hacer como tu dices, mejor nos ceñimos al sistema tí pico.
saludos
Marzo 29th, 2004 at 10:49 am
Si, hombre, si. Lo comentaba a modo de curiosidad por que me sorprendí mucho al descubrirlo. De hecho no lo suelo usar.
Salud
Marzo 29th, 2004 at 5:36 pm
Gracias por la respuesta Toni, pero no hací a falta ser tan explí cito, que algunos (anónimos sin más) sabemos programar un poquiiiito :].
Un saludo, y gracias por las molestias.
Marzo 29th, 2004 at 5:40 pm
Algo más que se me olvidaba. Querí a saber más sobre usar el tamaño 100% de altura y anchura del SWF, que posibilidades da y si hay alguna forma para que los objetos no augmenten, simplemente se distribuyan (usando un solo SWF en toda la pagina). ¿Conoces algun artí culo respecto este tema?
Gracias de antemano.
Marzo 30th, 2004 at 8:55 am
Hola Toni,
no acabo de ver lo que intentas explicar en este post. Si bien es cierto que el evento onLoad carece de sentido, la forma común de inicializar variables y propiedades es con asignaciones directas en la linea de tiempo (primer frame normalmente). Un enterFrame para decir que sea invisible un movieclip???? No lo entiendo…
Un saludo!
Marzo 30th, 2004 at 10:08 am
Hola Danisan,
Lo que intento explicar, es un método para evitar
dividir el código ationScript entre la lí nea de tiempo principal y un objeto, en este caso he elegido un clip de pelí cula y la propiedad _visible (es solo un ejemplo).
Vale, olvidate del enterFrame, no es necesario, lo puse simulando que el ejemplo formaba parte de un sript más amplio, no obstante no es el evento enterFrame el que condiciona si la propiedad _visible es false si no la variable que no se ha definido.
if (inicio == undefined) {
mc_miclip._visible = 0;
inicio = true;
}
Lo tí pico serí a hacer lo siguiente:
// – en la lí nea de tiempo principal
mc_boton.onRollOver = function() {};
mc_boton.onRelease = function() {
mc_miclip._visible = 1;
// – en la lí nea de tiempo del clip de pelí cula
onClipEvent(load){
_visible=0
}
esto es lo que yo trato de evitar.
Te propongo que hagas el mismo ejemplo a tu manera, quizá entiendas mejor lo que intento.
Ojo! si tienes una solución mejor, me encantarí a que la expusieras aquí , simpre puede ser que yo esté equivocado.
saludos.
Marzo 30th, 2004 at 3:52 pm
Hola nuevamente,
no, no tengo soluciones mejores (o inicializas las variables en la linea de tiempo tal cual o como mucho en una función si hay mucho código), pero que vaya, no da mucho más esto.
Mi comentario era porque no sabí a si intentabas explicar algo más de fondo que no estaba captando. Bueno, ahí muere.
Un saludo y te sigo leyendo!!
Marzo 31st, 2004 at 10:06 am
Creo que es una buena lección para los cabezotas como yo que dejan toneladas de código desperdigado por mil objetos jeje.
Realmente esa la mejor forma de trabajar que se me ocurre, sobretodo si pasado algún tiempo queremos revisar el código para hacer algún tipo de cambio… y bueno, para mantener un orden claro.
Gracias Toni por compartirlo,
Salu2
Abril 29th, 2004 at 12:46 pm
Hola a todos;
Mi problema es el siguiente. Tengo un formulario dividido en varios frames (porque los datos no me caben en pantalla). Al final de la tercera pantalla tengo un botón “comprobar” que me manda a otra escena distinta…pero no consigo pasar los valores de los campos de “introducción te texto” que hay en las pantallas del formulario, a la escena de comprobación (que lo único que hace es visualizar por pantalla los datos introducidos).
Es decir…¿cómo paso los datos introducidos en un campo de introducción de texto a otra escena donde se me muestren en un campo de texto dinámico?.
Junio 24th, 2004 at 6:15 pm
¡Hola!
Yo estoy haciendo un sitio con Flash, para lo cual estoy totalmente de acuerdo en que no debemos tener todo el contenido en un solo SWF y mejor es cargarlos con loadMovie a petición.
Yo tengo una parte en el sitio donde pondré banners y creé un clip en el que estarán estos banners que iré cargando.
Pido una recomendación:
1.- Tengo un clip llamado “banners” en el cual iré cargando los SWF correspondiente a cada banner.
2.- Dentro de “banners” estoy codificando lo correspondiente con AS.
3.- Creé un clip llamado “miclip”
4.- Dentro de “banners” creé tantas instancias de “miclip” como SWF’s correspondientes a cada banner.
Ahora bien, estaba haciendo la carga de cada SWF desde un frame, pero creo que serí a más fácil si lo hago directamente desde cada instancia de “miclip".
Ya desde el frame 1 lo hago y funciona, sólo que para irle dando forma a cada instancia debo hacer referencia por su nombre y como estoy copiando el código para cada SWF que cargo, creo que al momento de dar mantenimiento es más fácil si el código está en cada instancia ya que las referencias a cada una se harí a con “this” y al cambiar algo, prácticamente harí a un copy-paste y serí a más rápido el cambio.
Si hago esto en el frame 1 sí funciona
var my_mcl = new MovieClipLoader();
my_mcl.loadClip("Nokia01.swf","Nokia01″);
Pero si hago esto en cada instancia ya no:
onClipEvent(load){
my_mcl.loadClip("Nokia01.swf","this");
}
¿Alguien sabe por qué?
Ya hice miles de pruebas y no logro hacer que se cargue el swf.
Bueno, ahora otra pregunta.
¿Serí a bueno que cargue y descargue a cada momento los SWF’s correspondientes a cada banner? O sea, cargo cuando vaya a mostrar el banner que corresponda en un momento dado y cuando termine lo descargo (unloadMovie)…
¿O qué me sugieren para optimizar esto?
Digo, ya pensé dos alternativas:
1.- Cargar y descargar para que no sature la memoria.
2.- Sólo cargar y no quitar de memoria para ahorrar tiempo de acceso.
Saludos.
Febrero 18th, 2006 at 6:50 pm
hola, esta es la primera ves que entro en algo como esto, yo tengo una pregunta ,,, que espero me aclaren ,,, se puede cargar varios swf’s desde un boton para que se vea en un lugar especifico con loadMovie?? si se puede, podrian decirme como…,,, lo que pasa es que yo quiero cargar varios con eso pero no se como, lo que si puedo es cargar solo uno.. bueno espero me puedan ayudar contestando mi pregunta… saludos desde mexico!!! =)
////
on(release){
loadMovie("mi.swf", “show");
}
///
Febrero 18th, 2006 at 8:35 pm
Hola Carlos, se puede claro que si. Hay muchas formas, una de ellas podria ser esta
Saludos