代码改变世界

FLASH 中用 JSFL 管理素材

2009-06-25 10:18  宝宝合凤凰  阅读(616)  评论(0编辑  收藏  举报

FLASH 中用 JSFL 管理素材

标签JSFL  素材  FLASH  管理  2009-05-31 15:35
细说 fjsfl
或许你不知道fjsfl是什么,
jsfl 确却的说就是Adobe Flash JavaScript API
我们在flash里的可视化编程基本由这些接口完成。
功能很强大,只要你熟悉了它,你就可以自己扩展flash ide给他添加工具面板,创作自己的工具,新建一些命令处理来完成自己想处理的事情等。
形象点说,你如果用过早期的pv3d的话一定不会对那是pv3d的组件陌生的。其实pv3d的组件在创作中也运用到了jsfl 脚本去实现了很多在flash ide里的窗口功能
或者说你如果用过asv5或者asv6这款破解软件的话,不知道你是否知道,他的还原原理其实就是生成堆jsfl文件脚本文件来还原fla文件,对,或者应该说创建比较合适。可以这么说,任何你能手动在flash操作的步骤都可以用jsfl脚本来是实现。

好了下边先让大家认识先jsfl的类库吧;
jsfl类库里提供了接近50个对象跟接近20个顶级方法。具体的你可以打开flash帮助的flash扩展一章。里边有详细的解说

全局方法
可从任何 JavaScript API 脚本调用以下方法:

alert()
confirm()
prompt()


时间轴特效
下列函数专用于时间轴特效:

configureEffect()
executeEffect()
removeEffect()


可扩展工具
在创建可扩展工具的脚本中,可调用以下函数:

activate()
configureTool()
deactivate()
keyDown()
keyUp()
mouseDoubleClick()
mouseDown()
mouseMove()
mouseUp()
notifySettingsChanged()
setCursor()

对象
描述

actionsPanel 对象
actionsPanel 对象表示当前显示的"动作"面板。

BitmapInstance 对象
BitmapInstance 对象是 Instance 对象的子类,它表示帧中的一个位图

BitmapItem 对象
一个 BitmapItem 对象是文档库中的一个位图。BitmapItem 对象是 Item 对象的子类。

CompiledClipInstance 对象
CompiledClipInstance 对象是 Instance 对象的子类。

compilerErrors 对象
compilerErrors 对象表示"编译器错误"面板,它是 flash 对象 (fl) 的一个属性,可以通过 fl.compilerErrors 访问。

ComponentInstance 对象
ComponentInstance 对象是 SymbolInstance 对象的子类,表示帧中的一个组件。

componentsPanel 对象
componentsPanel 对象表示"组件"面板,它是 flash 对象 (fl) 的一个属性,可以通过 fl.componentsPanel 访问。

Contour 对象
Contour 对象表示由形状边界上的半边缘组成的封闭路径。

Document 对象
Document 对象表示舞台。

drawingLayer 对象
drawingLayer 对象可以从 JavaScript 作为 flash 对象的子对象访问。

Edge 对象
Edge 对象表示舞台上一个形状的边缘。

Effect 对象
Effect 对象表示时间轴特效的一个实例。

Element 对象
出现在舞台上的所有对象都是 Element 类型。

Fill 对象
Fill 对象包含"工具"面板或某一选定形状的填充颜色设置的所有属性。

Filter 对象
Filter 对象包含有所有滤镜的全部属性。

flash 对象 (fl)
flash 对象表示 Flash 应用程序

FLfile 对象
FLfile 对象允许您编写可对本地文件系统中的文件和文件夹进行访问、修改和删除的 Flash 扩展。

folderItem 对象
folderItem 对象是 Item 对象的子类。

fontItem 对象
fontItem 对象是 Item 对象的子类。

Frame 对象
Frame 对象表示图层中的帧。

HalfEdge 对象
Shape 对象的边缘的有向侧。

Instance 对象
Instance 对象是 Element 对象的子类。

Item 对象
Item 对象是一种抽象基类。

Layer 对象
Layer 对象表示时间轴中的图层。

library 对象
library 对象表示"库"面板。

Math 对象
Math 对象可用作 flash 对象的只读属性;请参阅 fl.Math。

Matrix 对象
Matrix 对象表示一个变形矩阵。

outputPanel 对象
outputPanel 对象表示"输出"面板,它用来显示语法错误等疑难解答信息。

Oval 对象
Oval 对象是使用椭圆工具绘制的形状。若要确定一个项目是否为 Rectangle 对象,请使用 shape.isOvalObject。

Parameter 对象
从 screen.parameters 数组(对应于 Flash 创作工具中的屏幕"属性"检查器)或者通过 componentInstance.parameters 数组(对应于创作工具中的组件"属性"检查器)来访问 Parameter 对象类型。

Path 对象
Path 对象定义线段(直线、曲线或两者)的序列,通常在创建可扩展工具时使用。

Project 对象
Project 对象表示一个 Flash 项目 (FLP) 文件。

ProjectItem 对象
ProjectItem 对象表示一个已添加到项目中的项(磁盘上的文件)。

Rectangle 对象
Rectangle 对象是使用"矩形"工具绘制的形状。若要确定一个项目是否为 Rectangle 对象,请使用 shape.isRectangleObject。

Screen 对象
Screen 对象表示幻灯片或表单文档中的单个屏幕。

ScreenOutline 对象
ScreenOutline 对象表示幻灯片或表单文档中的一组屏幕。

Shape 对象
Shape 对象是 Element 对象的子类。当在舞台上操作或创建几何形状时,Shape 对象提供的控制比绘图 API 提供的控制更精确。

SoundItem 对象
SoundItem 对象是 Item 对象的子类。它表示一个用于创建声音的库项目。

Stroke 对象
Stroke 对象包含笔触的所有设置(包括自定义设置)。

SymbolInstance 对象
SymbolInstance 对象是 Instance 对象的子类,它表示帧中的一个元件。

SymbolItem 对象
SymbolItem 对象是 Item 对象的子类。

Text 对象
Text 对象表示文档中单独的文本项。

TextAttrs 对象
TextAttrs 对象包含能应用于部分选定的文本的所有属性。此对象是 Text 对象的子类。

TextRun 对象
TextRun 对象表示一串字符,其属性与 TextAttrs 对象中的所有属性相匹配。

Timeline 对象
Timeline 对象表示 Flash 时间轴,可通过 fl.getDocumentDOM().getTimeline() 访问当前文档的时间轴。

ToolObj 对象
一个 ToolObj 对象表示"工具"面板中的单个工具。

Tools 对象
可从 Flash 对象 (fl.tools) 访问 Tools 对象。

Vertex 对象
Vertex 对象是形状数据结构中保存坐标数据的部分。

VideoItem 对象
VideoItem 对象是 Item 对象的子类。

XMLUI 对象
XMLUI 对象能够获取和设置 XMLUI 对话框的属性,并能接受或取消其中的某个功能。

一般的说我们常用到的作对象一般为 flash 对象 (fl),Frame 对象,Layer 对象,Instance 对象,library 对象,Item 对象,outputPanel 对象等


先来个hello word  吧  jsfl中输出的方法有2个 fl.trace() 跟 outputPanel.trace() ;
步骤1:
新建一个 jsfl文件 然后 往里边写
  1. fl.trace('hello jsfl !')
复制代码
步骤2:
看到flash上方有一个绿色的箭头没有,没错,按下它就会执行了。
要清除输出内容我们要用到对象的一个方法 clear();
  1. outputPanel.clear()
复制代码
因为我们是扩展flash所以我们还可以或者直接输出的内容保存到本地
可以这样做;
outputPanel.save('file:///c:log.txt')
我们可以选择吧jsfl文件保存为命令,方便以后我们在命令菜单里调用,按crtl+s默认保存路径就可以了,当然我们也可以自己写包,但那样的话我们还需要用到
高级点的编程技巧,像fl.runScript()
fl.runScript("file:///C|/testScript.jsfl", "testFunct", 10, 1);
执行c盘目录下的testScript.jsfl脚本的testFunct方法并把参数传递过去;

还有一个高级编程里经常用到的方法MMexecute()
MMExecute("Flash JavaScript API command;":String) : String
这个可以说是整个“文档对象模型 (DOM)”的核心体现。

文档对象模型(DOM)简单的说就是把你的脚本文件转化为可执行命令行。也就是把字符串转成可执行命令行
。,它之所以强大在于你可以在程序里敲入一段字符串形式的代码,然后让他直接执行。当然了如果你是在as文件里敲的话要注意一点,如果你要执行的字符串脚本里包含有字符串就要多加一层引号才行,不要认为MMExecute的参数已经给了个引号下边的字符串脚本就不需要给,那样往往是出错的原
 
 
入门的东西我就带到着,下边给一个以前写的  jsfl 命令,给大家学习下,
大家通过这个例子可以了解到jsfl的强大方便之处也可以了解到怎么用jsfl来创建fla文件等
用法很简单,新建一个jsfl文件吧代码拷贝进去,保存成命令。然后倒入一些具有序列编号的图片到fla文件的场景,如:a-01.png,a-02.png,b-01.png,c-01.png,c-02.png,c-03.png,c-04.png这样命名的图片,然后执行下命令 然后就可以看到效果了:
 
 
/*
by wxsr
1.将导入的属于相同序列的图片批量生成到同一元件顺序幀中
2.为调整图片的质量为无损位图类型
3.设置该元件链接属性为第一幀导出基类为MovieClip;
4.发布swf到桌面
*/
fl.getDocumentDOM().getTimeline().currentFrame = 0;
fl.getDocumentDOM().selectAll()
fl.outputPanel.clear()
fl.getDocumentDOM().distributeToLayers();
var myLayers=fl.getDocumentDOM().getTimeline().layers
fl.getDocumentDOM().selectNone();
var obj={}
for(var i=0;i<myLayers.length;i++)
{
        if(myLayers[i].frames[0].elements.length>0)
        {
                var key=myLayers[i].name.slice(0,myLayers[i].name.length-7)
                obj[key]==undefined?obj[key]=[]:'';
                obj[key].push([myLayers[i].name,i])
        }
       
}
var items=new Array()
for(var k in obj)
{
        obj[k].sort();
        var name;
        for(var v=0;v<obj[k].length;v++)
        {
                fl.getDocumentDOM().selection=myLayers[obj[k][v][1]].frames[0].elements
                name=obj[k][v][0]
                }
                fl.getDocumentDOM().convertToSymbol('movie clip',name.slice(0,name.length-7), 'bottom center');
                var lib = fl.getDocumentDOM().library;
                lib.setItemProperty('linkageExportForAS', true);
                lib.setItemProperty('linkageExportInFirstFrame', true);
                fl.getDocumentDOM().enterEditMode('inPlace');
               
               
                //alert(b);

                fl.getDocumentDOM().distributeToLayers();
                var elementLayers=fl.getDocumentDOM().getTimeline().layers
                var elements=new Array
                for(var loc_1=0;loc_1<elementLayers.length;loc_1++)
                {
                        if(elementLayers[loc_1].frames[0].elements.length==0)
                        {
                               
                                fl.getDocumentDOM().getTimeline().setSelectedLayers(0);
                                fl.getDocumentDOM().getTimeline().setSelectedFrames(0,0);
                               
                fl.actionsPanel.getScriptAssistMode();
                var b=fl.actionsPanel.setText("stop();")
                                fl.getDocumentDOM().getTimeline().insertKeyframe(1)
                                fl.getDocumentDOM().getTimeline().insertKeyframe(2)
                                fl.getDocumentDOM().getTimeline().insertKeyframe(3)
                               
                        }else {
                                elements.push([elementLayers[loc_1].name,loc_1])
                                }
                }
                elements.sort();
                var frame=0
                for(var loc_2=0;loc_2<4;loc_2++)
                {
                        if(frame<elements.length)
                        {
                               
                               
                                 fl.getDocumentDOM().getTimeline().setSelectedLayers(elements[loc_2][1]);
                                 fl.getDocumentDOM().getTimeline().setSelectedFrames(0,0);
                                 fl.getDocumentDOM().getTimeline().cutFrames(0);
                               
                        }else {
                                if(elements.length==2&&frame>1){
fl.trace(frame+'---'+elements.length)
                                        if(frame==2){
                                         fl.getDocumentDOM().getTimeline().setSelectedLayers(0);
                                         fl.getDocumentDOM().getTimeline().setSelectedFrames(0,0);
                                          fl.getDocumentDOM().getTimeline().copyFrames(0);
                                        }else if(frame==3){
                                         fl.getDocumentDOM().getTimeline().setSelectedLayers(0);
                                         fl.getDocumentDOM().getTimeline().setSelectedFrames(1,1);
                                         fl.getDocumentDOM().getTimeline().copyFrames(1);
                                        }
                                }
                        }
                        fl.getDocumentDOM().getTimeline().setSelectedLayers(0);
                        fl.getDocumentDOM().getTimeline().setSelectedFrames(frame,frame);
                        fl.getDocumentDOM().getTimeline().pasteFrames(frame);
                       
                        frame+=1
                }
                        var arr=fl.getDocumentDOM().getTimeline().layers
                        for(var loc_4=1;loc_4<arr.length;loc_4++)
                        {
                                        fl.getDocumentDOM().getTimeline().setSelectedLayers(1);
                                        fl.getDocumentDOM().getTimeline().deleteLayer(1);
                        }
       
                fl.getDocumentDOM().exitEditMode();
                fl.getDocumentDOM().selectNone();
        }
        for(var i_2=1;i_2<myLayers.length;i_2++)
        {
                fl.getDocumentDOM().getTimeline().setSelectedLayers(1);
                fl.getDocumentDOM().getTimeline().deleteLayer(1);
       
        }
        fl.getDocumentDOM().exportSWF("http://www.cnblogs.com/shinings/admin/file:///C:/Documents and Settings/All Users/桌面/elementsLibs.swf");
       
 
 
 
 
==================== 文章2 ==================
 
想利用ria来生成swf,可以当看过swf文件规范之后感觉这样做似乎过于复杂了。以前衰人给过一个使用Flash CS3 IDE的扩展来制作的方式,没有怎么深入去看。周末仔细研究了一番,感觉走了弯路了。JSFL已经可以通过很简单的代码来处理所有素材包的制作了,何必非要去做个另类的生成工具。
JSFL使用起来很简单,而且调试很方便。IDE里面的历史面板可以把你每一步操作使用的JSFL源码都告诉你。第一次使用你可能需要了解他的这个DOM结构,语法是js语法,即使你没有任何js基础,但是有AS基础就够用了。
1、当前打开的文档用fl.getDocument()取得,他是一个Document对象。
2、fl.getDocument().library 取得当前文档库的引用,做素材的话这个是最常用到的了。库面板上可以进行的操作,你都可以用API来做,看一下帮助文档就了解了,并不复杂。
3、fl.getDocumentDOM().getTimeline() 来访问当前文档的时间轴。此方法返回当前正在编辑的场景或元件的时间轴。也就是你当前正在操作哪个时间轴,显示的就是哪个时间轴。
4、时间轴上又分了层layer,每一个层又有不同的帧frame。程序可以取得任何的时间轴上面的层和帧的内容。
5、有的时候操作某个东西需要把他变成选择状态。场景中正在编辑的东西的选取可以通过坐标来操作,相当于你在某个坐标点了一下,那么这一点下最上层的物体就被选中了。
6、JSFL一般存储在C:\Documents and Settings\Samsung\Local Settings\Application Data\Adobe\Flash CS3\zh_cn\Configuration 里面(这个会不一样,到你的用户名下找一下,这里我的用户名是Samsung),一般你放到这个目录下的command目录里面,那么就可以在你的 Flash CS3 IDE的菜单-》命令中找到。
说了一堆,简单看一个例子就明白了。
 
开始制作之前我们先大致确定一下我们的需求:
1、我们需要把每一位图都变成一个MC,同时把这个MC作为一个导出类来用
2、每一个位图都有一个唯一的导出类名。
3、所有的位图变成MC之后都是左上角作为原点。
4、处理完的位图和MC都在库里面分目录存放,资源的种类作为目录。
5、位图的文件名中记录了种类、名称和导出类名。(本例中的位图命名规则为:种类_名称_导出类名.png)
最后使用的JSFL代码如下。
fl.getDocumentDOM().selectAll();//选中场景中所有的位图
if(fl.getDocumentDOM().selection.length>0)
{
fl.getDocumentDOM().deleteSelection();//删除所有位图
}
var lib=fl.getDocumentDOM().library;//取得库
var libLength=lib.items.length;//库元素的长度
var bitmapArr=new Array();//库里面没有处理的位图
for(var i=0;i<libLength;i++)
{
//没有在目录中的位图则表示没有处理
if((lib.items[i].itemType=="bitmap")&&((lib.items[i].name).indexOf("/")==-1))
{
   bitmapArr.push(lib.items[i].name);
}
}
if(bitmapArr.length>0)
{
//创建目录
for(var i=0;i<bitmapArr.length;i++)
{
   var name=bitmapArr[i];//位图的完整名称
   var nameArr=bitmapArr[i].split("_");//位图名称的拆分数组
   var folder=nameArr[0];//目录名称
   var iconName=nameArr[1];//图标名称
   var code=nameArr[2].split(".")[0];//图标编码
   lib.newFolder(folder);
   lib.selectItem(name);//选中位图
   lib.addItemToDocument({x:0, y:0});//添加到场景
   fl.getDocumentDOM().selectAll();
   var mcName=iconName+"_"+code;
   //转换为mc
   fl.getDocumentDOM().convertToSymbol("movie clip",mcName,"top left") ;
   if (lib.getItemProperty('linkageImportForRS') == true) {
   lib.setItemProperty('linkageImportForRS', false);
   }
   lib.setItemProperty('linkageExportForAS', true);
   lib.setItemProperty('linkageExportForRS', false);
   lib.setItemProperty('linkageExportInFirstFrame', true);
   lib.setItemProperty('linkageClassName', code);
   lib.setItemProperty('scalingGrid', false);
   fl.getDocumentDOM().selectAll();//选中场景中所有的位图
   fl.getDocumentDOM().deleteSelection();//删除所有位图
   var bitmapFolder=folder+"/图素";
   var mcFolder=folder+"/导出类"
   lib.newFolder(bitmapFolder);
   lib.newFolder(mcFolder);
   lib.moveToFolder(mcFolder, mcName);
   lib.moveToFolder(bitmapFolder, name);
}
}
else
{
alert("没有需要处理的位图!");
}
完整例子在这里下载:jsfl制作swf素材包的例子。