Todos los que trabajamos con Flash hemos creado nuestros propios jsfl commands para ajustar el programa a nuestras necesidades, algunos más sencillos y otros más complejos nos sirven para automatizar tareas repetitivas. Cualquiera que conozca un poco JavaScript puede realizar sus propios comandos tanto para Flash como para otros programas de Adobe que faciliten acceso a una API.
Si se quiere ir más allá se pueden implementar como extensiones del programa. Uno de los proyectos más interesantes entorno a jsfl es xJSFL, un framework open source sobre jsfl para creación de herramientas y plugins para el programa Flash desarrollado por Dave Stewart.
A continuación, se muestran algunos de los comandos que yo he realizado y que en algún momento he necesitado para desarrollar tareas repetitivas.
Cambiar el tipo de compresión de las imágenes de la biblioteca
Este comando te salva de una de las tareas más tediosas en Flash si tienes que trabajar con archivos png, que tiende a colocar las imágenes importadas y pegadas en jpg.
1 2 3 4 5 6 7 8 9 |
//change bitmap compressionType to lossless for (idx in fl.getDocumentDOM().library.items) { if (fl.getDocumentDOM().library.items[idx].itemType == "bitmap") { var myItem = fl.getDocumentDOM().library.items[idx]; myItem.compressionType = "lossless"; myItem.allowSmoothing = true; } } |
Reducir el tamaño del elemento seleccionado y colocarlo en un punto determinado
Este es un comando muy sencillo pero que suele tener gran utilidad, el reposicionar elementos en el escenario.
1 2 3 4 5 6 7 |
//reduce scale 50% and set position to x=0, y=0 var element = fl.getDocumentDOM().selection[0]; element.scaleX = 0.50; element.scaleY = 0.50; element.x = 0; element.y = 0; |
Cambiar propiedades de texto
En Flash no hay un panel de estilos como en otros programas de Adobe, como Illustrator, Fireworks, etc. Por ello, para aplicar estilos a un texto tenemos que aplicar cada una de las propiedades desde los paneles de Carácter y Párrafo. Para evitar repetir el formateado de texto suelo crear comandos que funcionan como los estilos de un panel de Estilos. Uno de estos comando se puede realizar de forma muy fácil guardando como comando las diferentes acciones que quedan grabadas en el panel Historial. Generalmente, una vez guardado el comando es necesario realizar algunos ajustes para que funcione en cualquier situación y no sólo en la que se ha grabado el comando.
1 2 3 4 5 |
//change text attributes fl.getDocumentDOM().setElementTextAttr('leftMargin', 60); fl.getDocumentDOM().setElementTextAttr('face', 'Verdana'); fl.getDocumentDOM().setFillColor('#0000ff'); |
Modificar los archivos fla dentro de un directorio
Una de los mayores problemas con Flash cuando se manejan gran cantidad de archivos fla es que para modificar alguna cosa hay que abrir el archivo, modificarlo y volver a compilarlo. Si esa misma modificación hay que hacerla en varios archivos fla la solución es utilizar un comando con una función recursiva que abra, modifique y compile los diferentes archivos fla. Desde Flash CS5 en lugar de usar el formato fla podemos usar el formato XFL, lo que nos permite realizar ciertas tareas sobre distintos archivos fla simplemente reemplazando los cambios en los archivos XML, aunque después sí necesitamos recompilar el archivo.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
//change fla files in folder and subfolders fl.outputPanel.clear(); g_path = "file:///C:/flashesfolder/"; searchInFolder (g_path); function searchInFolder (path) { var filesNames = FLfile.listFolder(path + "*.fla", "files"); for (var k=0; k<filesNames.length; k++) { fl.openDocument (path + filesNames[k]); actions(); } var foldersNames = FLfile.listFolder(path,"directories") fl.trace(foldersNames); for (var h=0; h<foldersNames.length;h++) { var l_path=path+foldersNames[h]+"/"; fl.trace("path:" + l_path); searchInFolder(l_path) } } function actions() { fl.getDocumentDOM().setPlayerVersion("8"); fl.getDocumentDOM().asVersion = 2; fl.getDocumentDOM().publish(); fl.getDocumentDOM().save(); fl.getDocumentDOM().close() } |
Buscar y reemplazar ActionScript
El siguiente es un comando experimental que busca un código de ActionScript y los sustituye por otro en todos los archivos fla dentro de una carpeta. No puede acceder al código que esté sobre clips tal y como se utilizaba ActionScript 1 y 2. Si alguien quiere probar esto le recomiendo la máxima precaución posible ya que puede llegar a tardar horas en procesar un archivo fla y no usarlo sobre ficheros importantes.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
fl.outputPanel.clear(); //folder with fla files var mainPath="file:///C:/flashesfolder/"; //strings to search and replace var findString = "stop();"; var replaceString = "play();"; //execute main function to iterate in folder searchInFolder (mainPath) function searchInFolder (path) { var filesNames = FLfile.listFolder(path + "*.fla","files") for (var k=0;k<filesNames.length;k++) { fl.trace(path + filesNames[k]); fl.openDocument(path + filesNames[k]); var mainTimeline = fl.getDocumentDOM().getTimeline(); iterateLayersAndReplace (mainTimeline); //publish, save and close fl.getDocumentDOM().publish(); fl.getDocumentDOM().saveAndCompact(); fl.getDocumentDOM().close(); } var foldersNames = FLfile.listFolder(path,"directories") for (var h=0; h<foldersNames.length;h++) { var l_path=path+foldersNames[h]+"/"; searchInFolder(l_path) } } function iterateLayersAndReplace (theTimeline) { // loop for layers for ( var i = 0; i < theTimeline.layers.length; i++ ) { var layer = theTimeline.layers[i]; if(layer.layerType == "normal") { // loop for frames for ( var j = 0; j < layer.frames.length; j++ ) { var frame = layer.frames[j]; //replace AS in frames frame.actionScript = frame.actionScript.replace(findString, replaceString); // loop for elements for ( var k = 0; k < frame.elements.length; k++ ) { var element = frame.elements[k]; if(element.elementType == "instance") { if(element.libraryItem.itemType=="movie clip" || element.libraryItem.itemType=="button") { var curr_lib_item = element.libraryItem.name; fl.getDocumentDOM().library.editItem(curr_lib_item); var new_timeline = fl.getDocumentDOM().getTimeline(); iterateLayersAndReplace(new_timeline); } } } } } } } |