利用JSFL批量制作

想利用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的菜单-》命令中找到。 

  如果想多了解多一点他的用法,可以参考衰人的帖子。http://bbs.actionscript3.cn/viewthread.php?tid=19760highlight=jsfl 

  说了一堆,简单看一个例子就明白了。 

  开始制作之前我们先大致确定一下我们的需求: 

  1、我们需要把每一位图都变成一个MC,同时把这个MC作为一个导出类来用 

  2、每一个位图都有一个唯一的导出类名。 

  3、所有的位图变成MC之后都是左上角作为原点。 

  4、处理完的位图和MC都在库里面分目录存放,资源的种类作为目录。 

  5、位图的文件名中记录了种类、名称和导出类名。(本例中的位图命名规则为:种类_名称_导出类名.png) 

  最后使用的JSFL代码如下。 
为什么要学习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

  { 

  //没有在目录中的位图则表示没有处理 

  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

  { 

   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("没有需要处理的位图!"); 

  }





 
 

作为一个有些经验的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,在“命令”菜单里运行“火山习惯”,看一下效果吧:)

你可能感兴趣的:(JavaScript,脚本,Flash,ide,actionscript)