基于JSFL的Flash作品自动评价技术
2011-11-22姜华强周燕君
项 洁,姜华强,周燕君
(杭州师范大学杭州国际服务工程学院,浙江 杭州 310012)
基于JSFL的Flash作品自动评价技术
项 洁,姜华强,周燕君
(杭州师范大学杭州国际服务工程学院,浙江 杭州 310012)
文章介绍了使用JSFL脚本实现Flash作品自动评价的技术,并就评价过程中提高文档识别率提出了间接分析、实例采样、正则表达式等方法.实践证明,此类技术方法的使用,不仅简化了Flash作品自动评价的实现过程,还提高了作品评价的准确性,具有一定的实际应用价值.
Flash;JSFL;Flash DOM;自动评价
0 引 言
随着多媒体技术的发展,多媒体技术的教育也逐渐成为国内外教学的主要内容.Flash作为集向量绘图、动画制作、多媒体动画三大功能于一体的网络动画制作软件,因其文件小、传输快、多媒体、交互性强等特性,正被广泛应用于美术设计、网页制作、多媒体软件以及教学课件制作等多个领域,其在多媒体技术的教育中也占了一席重要之地.
与传统的计算机应用技术课类似,以Flash为代表的多媒体技术课也是一门强调实践应用的课程,同时它又兼具对作品的艺术性要求,因此如何尽可能避免作品评价过程中的主观性,对学生的Flash作品进行公正、合理、高效的评价是多媒体教学及计算机自动评价领域亟待解决的问题.
目前,对于Flash作品进行计算机自动评价,主要有3种方案:一种是分析SWF文件格式以逆向工程的方式进行,一种是利用数字图像处理及模式识别的方法,另一种是在Flash设计环境下通过运行JSFL脚本来对FLA文件进行模糊批阅.第一种方法不仅工作量巨大,而且由于商业因素,不可能完全逆向;第二种方法需要将Flash的每一帧截图存为BMP或JPEG格式,然后进行识别,效率太低;第三种方法,即利用JSFL脚本读取Flash对象的属性和标准答案比对,从而实现快速阅卷.这种方法开发难度低、效率高,可以大大缩短开发周期[1].在此将第三种方法的实现及其在Flash作品评价过程中提高文档识别率的几种方法进行阐述.
1 JSFL脚本介绍
Flash提供了两种形式的脚本,一种是编译后的SWF文件运行在Adobe Flash Player中执行的脚本,即AS(Action Script).另一种即在Flash作品评价中要用到的JSAPI(Java Script Application Programming Interface),它是Flash提供的基于Flash文档对象模型(DOM)的应用程序编程接口,运行在Flash编辑环境中,允许用户以对象访问的方式对Flash文档进行编程开发,其对应的脚本语言即JSFL.利用JSFL可以设置对象的属性,自动执行重复性任务,提高创作效率[1].
JSFL脚本最大的特点是简单易学,一方面它与AS类似,关键字、语法、结构都是统一遵循ECMA Script标准,有AS经验的开发者对于JSFL极易上手;另一方面,Flash自带的历史记录提供了很好的智能辅助,基于UI的操作在历史记录中都能找到相应JSFL脚本.换言之,在用JSFL脚本进行编程开发的时候,常用的基本命令可以通过可视化界面来完成,然后在其生成的代码中插入自定义的控制语句即可快速生成新的应用扩展.
JSFL脚本文件是以.jsfl为扩展名的jsfl命令集合,可用Flash或其他文本编辑器来编写,生成的文件存储于flash的Commands文件夹中即可被flash识别并用于功能扩展.对于不同版本的flash,其对应的Commands目录所在的路径略有不同,如Flash 8版本的Commands路径为C:Documents and Settings用户Local SettingsApplication DataMacromediaFlash 8语言ConfigurationCommands而Flash CS3对应的Commands路径为C:Documents and Settings用户Local SettingsApplication DataAdobeFlash CS3语言ConfigurationCommands,具体可参见联机帮助.
2 基于Flash DOM的文档访问技术
2.1 Flash DOM
图1 Flas8.0 DOM摘要Fig. 1 Abstract of Flas8.0 DOM
Flash DOM即Flash文档对象模型,包含了一组顶级函数,并以对象树的形式提供了Flash文档元素的访问接口,如图1所示.
其中flash对象是整个DOM的顶层对象,代表flash应用程序,脚本代码中用flash或fl来表示.Document为flash的子对象,表示文档.每个Document对象代表了flash文件包含的大部分元素,所以DOM里很大一部分是Document对象的子对象和属性.可以通过顶级flash对象的documents属性得到一个已经打开的文档数组,使用fl.documents[index]来得到指定的文档,使用fl.getDocumentDOM()获取当前文档.对于Document的子对象,可以通过其相应的属性得到,比如Document对象的属性library帮助得到library子对象,代码如下:fl.getDocumentDOM().library.
Timeline对象表示flash里面的时间轴,用于组织和控制文档内容在一定时间内播放的图层数和帧数,是flash文件的重要元素.其下包含图层对象(Layer)和帧对象(Frame).可通过使用Document对象的getTimeline()方法或timelines数组获取时间轴对象.如假设当前时间轴为文档中的第一个时间轴,则可用fl.getDocumentDOM().getTimeline()或fl.getDocumentDOM().timelines[0]两种方法之一获取当前时间轴.
Frame对象是flash文件中另一个重要对象,表示图层中的帧.
Element对象,即元素对象,出现在舞台上所有对象都是Element类型,该对象存在Instance子类,表示实例化的元素;Text子类,表示文档中单独的文本项;Shape子类,用于在舞台上操作或创建几何形状.
library对象,对应于flash的“库”面板,用于存储和组织在Flash中创建的各种元件及位图文件、图形文件和视频.其下属的Item对象是一种抽象基类,派生出的BitmapItem对象、folderItem对象、fontItem对象、SoundItem对象、SymbolItem对象、VideoItem对象分别表示库里的位图、文件夹、文字、声音、元件和视频.
2.2 基于DOM的文档访问
使用DOM技术对flash文档进行访问,即使用JSFL脚本语言根据文档对象树的层次关系,通过遍历查找访问文档元素及相应的属性.如需要获取当前时间轴上图层1所有帧中名称为“玫瑰”的元件,可用以下遍历语句来完成.
var curLayer,frameArray,curFrame,elts,i,j,t;
var tl=fl.getDocumentDOM().getTimeline();//获取当前文档当前时间轴
for (i=0;i curLayer=tl.layers[i]; if (curLayer.name=="图层1"){ //定位到“图层1” frameArray=curLayer.frames; //获取“图层1”上所有帧 for (j=0;j curFrame=frameArray[j]; //获取“图层1”上第j帧 elts=curFrame.elements; for (t=0;t if (elts[t]. name== "玫瑰") fl.trace("Frame "+ j +"Element "+ t +" Name = "); //输出名为“玫瑰”元件的帧号及元素编号 }}} 又如,判断库中元件是否为声音元件可使用以下JSFL脚本: var myCurrentLib = fl.library; //myCurrentLib为当前文档的库' var ItemNums=fl.library.items; for (var i=0;i if (myCurrentLib.items[i].itemType=="sound") //使用item对象的itemType属性判断库里元件类型 fl.trace("This is a sound Item");} 3.1 JSFL在Flash作品自动评价中的应用 根据计算机作品自动评价的常规流程:获取源文件知识点,将其与标准答案比对给分,设计评价脚本check.jsfl如下: var flashDoc = fl.openDocument(strInFile);//打开源文件 var score=Check(flashDoc); //读知识点信息并与标准答案匹配给分 Update(score); //上传成绩 将该脚本存于flash安装目录的Commands文件夹下,在flash编辑环境中执行“命令”菜单中“运行命令”或第三方开发软件调用flash的该命令即可执行相应的评价脚本. 其中Check(flashDoc)为知识点信息读取与比较函数,其内容根据实际作品文档具体展开.有案例如下: 设计一个主题为“水滴”的作品,实现一个水滴从叶子上滴落并渐隐的动画效果.相关答题素材及标准答案分别如图2、图3所示.作品涉及的知识点有:舞台属性(大小、背景色),新建图层,库操作(元件命名),图形对象属性(位置,透明度),补间动画.相应评分规则如表1所示. 图2 Flash答题文件Fig. 2 The test file of Flash 图3 Flash标准答案参考文件Fig. 3 The reference of Flash standard answer 题号题目描述评分细则分值1将“水滴.fla”文件的舞台大小改为400×300像素,舞台背景颜色设为#00cc99.舞台大小正确舞台背景颜色正确10分10分2新建一个名为“blank”的图层,将库中影片剪辑“我的新建”重命名为“我的树叶”.新建图层正确元件重命名正确10分10分3将“水滴动”图层第50帧的“水滴”图形的透明度设为50%,并将该帧“水滴”图形移动到所在叶片下方.图形的Alpha值正确图形的横坐标正确(误差范围68~210)图形的纵坐标正确(误差范围240~300)20分10分10分4在“水滴动”图层的第40帧和第50帧之间创建动作补间动画.创建了补间动画正确20分 Check函数代码摘要如下: if(flashdoc.width==400 && flashdoc.height==300) score=score+10; //舞台大小正确 if (flashdoc. backgroundColor==”#00cc99”) score=socre+10; //舞台背景颜色正确 var mytimeline=flashDoc.getTimeline(); var i; for(i=0; i< mytimeline.layerCount;i++) if (mytimeline.layers[i].name==”blank”) break; if (i< mytimeline.layerCount && mytimeline.layerCount>2) score=score+10; //新建图层正确 var ItemNums=flashDoc.library.items var flag1=0,flag2=0; for (i=0; i if (flashDoc.library.items[i].name==”我的树叶”) flag1=1; if (flashDoc.library.items[i].name==”我的新建”) flag2=1; if(flag1 && !flag2) score=score+10; //元件重命名正确 for(i=0; i< mytimeline.layerCount;i++) if (mytimeline.layers[i].name==”水滴动”) {var curlayer= mytimeline.layers[i]; break;} if (i {var myInstance= curlayer.frames[49].elements[0] if(myInstance. colorAlphaPercent==50) score=score+20; //图形的透明度设置正确 if (myInstance.left>=68 && myInstance.left<=210) score=score+10; if (myInstance.top>=240 && myInstance.top<=300) score=score+10;} if(curlayer.frames[40].tweenType==”motion”) score=score+10; //动作补间正确 3.2 自动评价中提高文档识别率的几种方法 Flash作品自动评价的实现及准确率的保证关键在于知识点信息的获取,其实质是对Flash文档的识别.基于DOM的脚本访问为识别Flash文档中的大部分元素提供了方便,但在实际应用过程中,尚有一些知识点的判断不能以此方法直接得到.为此提出以下几种变通方法,并且经过实验已证明可行. 3.2.1 间接分析法 此方法适用于通过对其他对象的属性或本对象的其他属性能分析出所需关键信息的情况.比如对不同帧的识别与判断. Flash动画遵循最基本的动画原理,即通过连续快速地播放静止的图片,利用人眼的“视觉暂留”现象,产生活动影像的效果.这些静止的图片称为帧,是制作动画的核心要素.根据动画实现的不同需求,flash中的帧分为普通帧、空白帧、关键帧和空白关键帧. 关键帧是包含了动画对象的属性更改或ActionScript代码以控制文档某些方法的帧.根据这些信息,flash能在两个关键帧之间自动计算出其过渡帧,从而模拟出变化过程.因此,关键帧是舞台上存在实例对象并可对其进行编辑的帧.相应的,普通帧间用于延长动画长度的帧,其上元素对象不能被编辑.空白帧即舞台上没有任何元素的帧,若该帧能被添加、编辑动画对象则为空白关键帧. 识别作品中帧的不同类型,对于判别作者最基本的动画理念及制作技术具有重要意义.在研究了JSAPI中关于帧的属性后,笔者发现没有一个属性可以直接用来区分上述帧类型.但若利用帧的startFrame属性和elements属性可根据帧定义来分析得到帧类型.如前文所述是否为空白帧可通过该帧舞台上的对象数是否为0来判断,即当某帧elements.length=0时,该帧为空白帧或空白关键帧.从动画生成的角度来看,关键帧位于动画序列的两端,而startFrame正好提供了动画序列起始帧的索引号,那么在遍历帧的过程中若当前帧的索引号正好等于所处动画序列起始帧的索引号,则可以推测该帧就为关键帧.综合上述两个条件,便可判断出所有帧的类型.代码片断如下: var flgKey,flgEmpty; flgKey=flgEmpty=0; \flgKey=0表示非关键帧,flgEmpty=0表示非空白 var frameArray = curlayer.frames; for(i=0;i< frameArray.length;i++){ var myElements= frameArray[i].elements; if (i==frameArray[i].startFrame) flgKey=1; if (myElements.length==0) flgEmpty=1; if (flgKey) if (Empty) fl.trace("Frame["+i+"] is a Blank Keyframe"); else fl.trace("Frame["+i+"] is a Keyframe"); else if (Empty) fl.trace("Frame["+i+"] is a Blank Frame"); else fl.trace("Frame["+i+"] is a Normal frame"); } 3.2.2 实例采样法 当获取完整对象比较困难或遍历某对象集需要太多时间开销时,若该对象(集)某个局部区域能反映整个对象(集)的指定特征时,可采用实例采样法获取文档信息.比如需要了解一个不规则图形被施加的编辑效果,考虑使用这种方法. 对于对象集的采样,一般在遍历过程中选定合适的循环起止来确定样本片断即可,此处不再赘述.下面介绍一下对象局部区域的采样.此采样法主要是利用Document对象的setSelectionRect方法来实现.该方法表示使用指定坐标绘制相对于舞台的矩形选取框.其语法表示及参数说明如下: 语法: document.setSelectionRect(rect [,bReplaceCurrentSelection [, bContactSensitiveSelection]]) 参数:rect 一个要设置为选中内容的矩形对象. 其格式为{left:value1,top:value2,right:value3,bottom:value4}.left和top值表示指定对象左上角的位置(如left:0,top:0表示舞台的左上角),right和bottom值指定对象右下角的位置. bReplaceCurrentSelection 一个布尔值,它指定方法是替换当前的选择(true),还是添加到当前的选择中(false).默认值为true. bContactSensitiveSelection 一个布尔值,它指定在对象选择过程中是启用(true)还是禁用(false)接触感应选择模式.默认值为false. 图4 船帆采样Fig. 4 Sampling of sail 如需要检测图4中船帆的填充色是否为“白色”时,可以在船帆中取一个具有代表性的矩形区域(图中虚线所示),以此区域的填充色为评价的样本.代码实现如下: flashDoc.setSelectionRect({left:249, top:130, right:267, bottom:178});\flashDoc表示当前文档 fl.trace (flashDoc.getCustomFill().color); 3.2.3 正则表达式 Flash动画不仅止于简单的画面顺序播放,其特色更体现在强大的交互性及数据处理能力,而这部分工作则由flash的脚本语言ActionScrip来完成.所谓ActionScript是针对Adobe Flash Player运行时环境的编程语言,它在Flash内容和应用程序中实现了交互性、数据处理以及其它许多功能.由此可见对ActionScript脚本的识别也是flash文档识别中一项重要的内容. 虽然具有一系列的语法规范,因作者的编程风格不同,实现同样的功能也会有多种不同的表达形式,所以消除冗余代码,将各种等价的表达标准化为统一的形式是提高代码识别率的有效手段之一.正则表达式在这方面可能会提供一个较好的解决方案. 所谓正则表达式,就是一种描述字符串结构模式的形式化表达方法.配合上特定的工具提供的额外支持,正则表达式能够添加、删除、分离、叠加、插入和修整各种类型的文本和数据[2].其在数据验证、文本检索方面表现出色.比如正则表达式“[0-9a-z_!.?]”能够匹配一个数字、小写字母、下画线、感叹号、点号,或者是问号,其中0-9表示9个数字中任一1个.又如表达式“user
/gi”匹配指定字符串中所有“user”后是回车换行符的子串,且对于user不区别大小写,即回车换行符前是“User”、“USER”等的情况也匹配.此处“
”、“
”分别表示回车符(对应ASCII的 基于此,将在flash文档识别的脚本中使用javascript的replace函数,并将构建的正则表达式作为该函数的参数传入即能实现部分代码的规范化.如使用以下语句将取得的ActionScript代码去掉所有回车换行符,并以不区分大小写的方式输出. var str=curFrame.actionScript,使用帧对象的actionScript属性获取当前帧中的脚本代码; fl.trace(str.replace(/
/gi, ""))
/gi为构建的正则表达式. 表2 Flash知识点自动评价正确率Tab. 2 Correct rate of Flash knowledge auto-evaluation 综合使用上述技术实现的Flash作品自动评价系统,在浙江省高中信息技术会考应用中已取得一定成效.作者以浙江省会考的5套Flash作品试题为自动评价对象,组织10人按不同方式回答该10套试题,自动评价后按照知识点分析结果如表2所示. JSFL是一种轻量级的脚本语言,基于DOM的文档访问方式使其对Flash文档及其元素的操纵变得容易实现,“间接分析”、“实例采样”、“正则表达式”等方法的结合使用又使Flash文档的识别率得以提高,给自动评价的准确性提供了有效保障.该技术已连续三年在浙江省高中信息技术会考自动化评价中加以应用,取得了良好的效果,具有一定的推广价值. [1] 王德东,杨永华,卢畅.基于JSFL的Flash自动测评系统研究[J].浙江海洋学院学报:自然科学版,2010,29(1):89-94. [2] Jeffrey E F, Fried l,余晟.精通正则表达式[M].3版.北京:电子工业出版社,2007. Auto-EvaluationTechniquesofFlashWorksBasedonJSFL XIANG Jie, JIANG Hua-qiang, ZHOU Yan-jun (Hangzhou Institute of Service Engineering, Hangzhou Normal University, Hangzhou 310012, China) This paper introduced the auto-evaluation techniques of flash works based on JSFL script,and proposed the methods of indirect analysis, sampling and regular expressions which could improve the correct identification rate of flash documents. The results show that the application of the technique not only simplifies the implementation process of flash works’ auto-evaluation, but also improves the accuracy of the evaluation work, it has some practical value. Flash; JSFL; Flash DOM; auto-evaluation 10.3969/j.issn.1674-232X.2011.02.017 2010-10-08 项 洁(1981—),女,浙江杭州人,讲师,硕士,主要从事计算机教育与应用、多媒体技术、人工智能等研究.E-mail: xj2002xj@vip.sina.com TP319 A 1674-232X(2011)02-0174-073 基于JSFL的Flash作品评价技术
4 Flash作品自动评价实例的效果分析
5 结 论