当前位置:   article > 正文

细说 fjsfl_jsfl fl.trace()

jsfl fl.trace()

http://www.cnblogs.com/shinings/archive/2010/4/10.html


为什么要学习jsfl?

作为一个有些经验的FLASH开发者,想必都会形成一些自己的开发习惯,比如很多人都喜欢把主时间轴第一层命名为:“AS”,第二层命名为“Label”,类似这样的劳动都是重复的,我们有办法可以简化它们么?答案是肯定的,于是jsfl隆重登场了。

什么是jsfl?

如果说AS是用来在SWF运行时运行的脚本,而jsfl则是在Flash编辑环境下运行的脚本。在这里我不想用太多专业的术语打击新手继续学习的信心,我想先带大家做一个非常简单的实验,实验环境:操作系统(Win XP2),FLASH开发环境(FLASH 8 简体中文版)。

  1. 首先把你的文件后缀名显示出来:→工具→文件夹选项→查看→把“隐藏已知文件类型的扩展名”选项取消。
  2. 随便在那里右键新建一个空的TXT文本文件。
  3. 打开FLASH8,然后新建一个fla,这时候你会看到时间轴上已经自动产生一个图层“图层 1”。
  4. 在FLASH中打开“历史记录”面板。
  5. 然后将时间轴“图层 1”改名为“AS”,这时观察“历史记录”面板,你会发现多了一条“层命名”。
  6. 然后右键点击“层命名”,在弹出菜单中选择“复制步骤”。
  7. 打开你的TXT文件,然后粘贴,这时你会看到TXT文件中出现一段代码:
    fl.getDocumentDOM().getTimeline().setLayerProperty('name', 'AS');
  8. 保存你的TXT文件,并重命名为:“把图层命名为AS.jsfl”。
  9. 将你的“把图层命名为AS.jsfl”放到类似下面路径的文件夹下:
    C:\Documents and Settings\Administrator\Local Settings\Application Data\Macromedia\Flash 8\zh_cn\Configuration\Commands
    其中,Administrator是你的系统用户名。
  10. 这时候点击FLASH主菜单栏中的“命令”,你会发现在“运行命令”的横线下面多了一条“把图层命名为AS.jsfl”的选项。
  11. 再新建一个fla,然后选择“图层 1”,并执行“命令”菜单中的“把图层命名为AS.jsfl”,你会发现,“图层1”被自动命名为“AS”了。

上面的实验告诉我们什么?

相信大家已经能简单的体会到jsfl的作用了,它可以通过一些jsfl脚本自动完成对应的FLASH编辑操作。另外我们还应该了解到如下知识才算阶段性毕业:

  1. jsfl是一种脚本语言。
  2. jsfl文件应该放在那里。
  3. 如何运行一个jsfl命令。

jsfl脚本只能从“历史记录”面板中生成么?

当然不是,“历史记录”面板所能生成的jsfl非常有限,要想实现复杂的功能,就必须自己手动写Flash JavaScript代码了。至于jsfl的官方专业解释,大家可以去查看FLASH 8帮助文档中的《扩展 Flash》一书,书中还有jsfl的应用示例和程序字典,我就是看着这本书自己研究的。

jsfl到底有多强大?我们有必要学jsfl么?

jsfl多强大我还不能确切的告诉你,因为我也没深入学习呢:)但用过ASV5的朋友应该都知道,ASV5能把SWF中的所有元素都分离出来,并产生一个jsfl文件,然后运行这个jsfl文件就可以把那些分离出来的元素组合为一个fla源文件了,由此可见jsfl的强大能力了吧?至于有没有必要深入学jsfl,那要看你的兴趣和工作需要,火山目前的工作可能需要批量生产一些结构复杂却类似的SWF,于是对火山来说,jsfl就比较重要了。

个满足火山日常开发习惯的综合例子

火山开发习惯:目前我在开始一个面向过程的项目之前,以下三个工作是必不可少的。

  1. 时间轴最上层建立“AS”层和“Label”层
  2. AS” 层第一帧写如下注释:
    //================系统设置================//
    //——————变量初始化
    //——————数组初始化
    //——————对象初始化
    //——————系统初始化
    //——————界面初始化
    //================功能逻辑================//
    //================函数模块================//
  3. 库里建立三个文件夹:“0-image”,“1-sound”,“2-公用元件”。
    →好了,需求有了,我们就开始写代码吧,前面我们已经知道jsfl文件应该放的位置了,这次就直接在那里建立一个“火山习惯.jsfl”,然后写下面的代码:
    //第一步:自动产生AS层和Label层
    fl.getDocumentDOM().getTimeline().addNewLayer("AS");
    fl.getDocumentDOM().getTimeline().addNewLayer("Label");
    //第二步:在“AS”层第一帧上添加注释
    var layerIndex = fl.getDocumentDOM().getTimeline().findLayerIndex("AS");
    fl.getDocumentDOM().getTimeline().layers[layerIndex].frames[0].actionScript = '//================系统设置================//\n//——————变量初始化\n//——————数组初始化\n//——————对象初始化\n//——————系统初始化\n//——————界面初始化\n//================功能逻辑================//\n//================函数模块================//\n';
    //第三步:在库里自动创建文件夹
    fl.getDocumentDOM().library.newFolder("0-image");
    fl.getDocumentDOM().library.newFolder("1-sound");
    fl.getDocumentDOM().library.newFolder("2-公用元件");

新建一个fla,在“命令”菜单里运行“火山习惯”,看一下效果吧:)

经典论坛讨论
http://bbs.blueidea.com/thread-2796346-1-1.html

或许你不知道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这样命名的图片,然后执行下命令 然后就可以看到效果了,
  1. /*
  2. by wxsr
  3. 1.将导入的属于相同序列的图片批量生成到同一元件顺序幀中
  4. 2.为调整图片的质量为无损位图类型
  5. 3.设置该元件链接属性为第一幀导出基类为MovieClip;
  6. 4.发布swf到桌面
  7. */
  8. fl.getDocumentDOM().getTimeline().currentFrame = 0;
  9. fl.getDocumentDOM().selectAll()
  10. fl.outputPanel.clear()
  11. fl.getDocumentDOM().distributeToLayers();
  12. var myLayers=fl.getDocumentDOM().getTimeline().layers
  13. fl.getDocumentDOM().selectNone();
  14. var obj={}
  15. for(var i=0;i<myLayers.length;i++)
  16. {
  17.         if(myLayers[i].frames[0].elements.length>0)
  18.         {
  19.                 var key=myLayers[i].name.slice(0,myLayers[i].name.length-7)
  20.                 obj[key]==undefined?obj[key]=[]:'';
  21.                 obj[key].push([myLayers[i].name,i])
  22.         }
  23.        
  24. }
  25. var items=new Array()
  26. for(var k in obj)
  27. {
  28.         obj[k].sort();
  29.         var name;
  30.         for(var v=0;v<obj[k].length;v++)
  31.         {
  32.                 fl.getDocumentDOM().selection=myLayers[obj[k][v][1]].frames[0].elements
  33.                 name=obj[k][v][0]
  34.                 }
  35.                 fl.getDocumentDOM().convertToSymbol('movie clip',name.slice(0,name.length-7), 'bottom center');
  36.                 var lib = fl.getDocumentDOM().library;
  37.                 lib.setItemProperty('linkageExportForAS', true);
  38.                 lib.setItemProperty('linkageExportInFirstFrame', true);
  39.                 fl.getDocumentDOM().enterEditMode('inPlace');
  40.                
  41.                
  42.                 //alert(b);


  43.                 fl.getDocumentDOM().distributeToLayers();
  44.                 var elementLayers=fl.getDocumentDOM().getTimeline().layers
  45.                 var elements=new Array
  46.                 for(var loc_1=0;loc_1<elementLayers.length;loc_1++)
  47.                 {
  48.                         if(elementLayers[loc_1].frames[0].elements.length==0)
  49.                         {
  50.                                
  51.                                 fl.getDocumentDOM().getTimeline().setSelectedLayers(0);
  52.                                 fl.getDocumentDOM().getTimeline().setSelectedFrames(0,0);
  53.                                
  54.                 fl.actionsPanel.getScriptAssistMode();
  55.                 var b=fl.actionsPanel.setText("stop();")
  56.                                 fl.getDocumentDOM().getTimeline().insertKeyframe(1)
  57.                                 fl.getDocumentDOM().getTimeline().insertKeyframe(2)
  58.                                 fl.getDocumentDOM().getTimeline().insertKeyframe(3)
  59.                                
  60.                         }else {
  61.                                 elements.push([elementLayers[loc_1].name,loc_1])
  62.                                 }
  63.                 }
  64.                 elements.sort();
  65.                 var frame=0
  66.                 for(var loc_2=0;loc_2<4;loc_2++)
  67.                 {
  68.                         if(frame<elements.length)
  69.                         {

  70.                                
  71.                                
  72.                                  fl.getDocumentDOM().getTimeline().setSelectedLayers(elements[loc_2][1]);
  73.                                  fl.getDocumentDOM().getTimeline().setSelectedFrames(0,0);
  74.                                  fl.getDocumentDOM().getTimeline().cutFrames(0);
  75.                                
  76.                         }else {
  77.                                 if(elements.length==2&&frame>1){
  78. fl.trace(frame+'---'+elements.length)
  79.                                         if(frame==2){
  80.                                          fl.getDocumentDOM().getTimeline().setSelectedLayers(0);
  81.                                          fl.getDocumentDOM().getTimeline().setSelectedFrames(0,0);
  82.                                           fl.getDocumentDOM().getTimeline().copyFrames(0);
  83.                                         }else if(frame==3){
  84.                                          fl.getDocumentDOM().getTimeline().setSelectedLayers(0);
  85.                                          fl.getDocumentDOM().getTimeline().setSelectedFrames(1,1);
  86.                                          fl.getDocumentDOM().getTimeline().copyFrames(1);

  87.                                         }
  88.                                 }
  89.                         }
  90.                         fl.getDocumentDOM().getTimeline().setSelectedLayers(0);
  91.                         fl.getDocumentDOM().getTimeline().setSelectedFrames(frame,frame);
  92.                         fl.getDocumentDOM().getTimeline().pasteFrames(frame);
  93.                        
  94.                         frame+=1
  95.                 }
  96.                         var arr=fl.getDocumentDOM().getTimeline().layers
  97.                         for(var loc_4=1;loc_4<arr.length;loc_4++)
  98.                         {
  99.                                         fl.getDocumentDOM().getTimeline().setSelectedLayers(1);
  100.                                         fl.getDocumentDOM().getTimeline().deleteLayer(1);
  101.                         }
  102.        
  103.                 fl.getDocumentDOM().exitEditMode();

  104.                 fl.getDocumentDOM().selectNone();

  105.         }
  106.         for(var i_2=1;i_2<myLayers.length;i_2++)
  107.         {
  108.                 fl.getDocumentDOM().getTimeline().setSelectedLayers(1);
  109.                 fl.getDocumentDOM().getTimeline().deleteLayer(1);
  110.        
  111.         }
  112.         fl.getDocumentDOM().exportSWF("file:///C:/Documents and Settings/All Users/桌面/elementsLibs.swf");


本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号