王德東,楊永華,盧 暢
(浙江海洋學院公共實驗中心,浙江舟山 316004)
Flash是Macromedia公司(現(xiàn)已被Adobe公司收購)開發(fā)的一款矢量動畫創(chuàng)作工具,主要用來創(chuàng)建二維動畫,也可以用它來創(chuàng)建幻燈片演示文稿、表單應用程序以及通過腳本程序來建立人機交互的內容。Flash可以包含文字、圖形、圖片、聲音以及視頻文件,由于是矢量格式,文件體積很小,很適合應用在網絡廣告、在線游戲以及網絡多媒體教程等領域,其精簡版Flash Lite在手機方面的應用也日漸豐富起來[1]。目前,各個高校大都開設了Flash軟件選修課程,由于選修此類課程的學生人數(shù)往往比較多,教師批改作業(yè)及閱卷工作量都很大,因此設計一個計算機自動測評系統(tǒng)就顯得很有必要。
對真實環(huán)境下產生的Flash文件進行計算機自動閱卷,可以考慮三種方案:一是分析SWF文件格式以逆向工程的方式進行,二是利用數(shù)字圖像處理[2]及模式識別的方法[3],三是在Flash設計環(huán)境下通過運行JSFL腳本來對FLA文件進行模糊批閱。第一種方法不僅工作量巨大,而且由于商業(yè)因素,不可能完全逆向分析。第二種方法需要將Flash的每一幀截圖存為BMP或JPEG格式,然后進行識別,效率太低。第三種方法,有點類似于MS OFFICE中的VBA的閱卷方式,利用腳本語言讀取對象的屬性和標準答案比對,從而實現(xiàn)快速閱卷。這種方法開發(fā)難度低,效率高,可以大大縮短開發(fā)周期。
Flash提供了兩種形式的腳本,一種是編譯后的SWF文件運行時在Adobe Flash Player中執(zhí)行的腳本,即AS(Action Script)。另一種即我們要討論的Flash JavaScript API(簡稱JSAPI),它是Flash提供的應用程序編程接口,運行在Flash編輯環(huán)境中,用于擴展Flash IDE運行時的功能,其對應的腳本語言即JSFL。利用JSFL可以設置對象的屬性,自動執(zhí)行重復性任務,提高創(chuàng)作效率。同時,也可以利用它讀取對象的屬性來達到閱卷的目的。
Flash JavaScript API基于文檔對象模型(DOM),該模型允許使用JavaScript對象訪問Flash文檔。DOM包含一組頂級函數(shù)和兩個頂級對象FLfile對象和flash對象。FLfile對象用于對本地文件系統(tǒng)中的文件和文件夾進行操作,fl.documents代表當前打開的Flash文件數(shù)組。例如fl.documents[0]代表第一個打開的FLA文檔,而通過fl.getDocumentDOM().library.items[0],則可以獲得庫中第一個元素的引用。每個Document對象由子對象和屬性組成。DOM對象模型見圖1。
圖1 FLASH文檔對象模型(DOM)Fig.1 Flash document object model(DOM)
主要測試內容有:文檔屬性;時間軸、圖層、幀等屬性及操作;動畫類型;庫、元件、位圖、聲音、視頻等屬性;靜態(tài)文本、濾鏡屬性;筆觸、顏色、填充操作;規(guī)則圖形(直線、圓、橢圓及多邊形)繪制操作;不規(guī)則圖形操作等。
這里的文檔就是指舞臺,是演員表演的場所。在一個FLASH動畫中,舞臺的大小和幀頻都是一樣的,要想調整某一段動畫的播放速度,可以通過增加或減少幀的方法來解決。
fl.getDocumentDOM().width 和 fl.getDocumentDOM().height 可以返回舞臺的寬度及高度;fl.getDocumentDOM().backgroundColor返回舞臺的背景顏色,格式為"#RRGGBB"的字符串,例如返回值為"0000FF"代表藍色。document.frameRate它指定播放動畫播放的速度,默認值為每秒12幀,其取值范圍為0.01~120之間。通過getMetadata返回文檔的標題及其描述性文字,這樣GOOGLE等搜索引擎就可以對其進行索引。調用getMetadata函數(shù)后自動產生XML文件,讀取它即可獲得文檔的“標題”及“描述”2個屬性。
圖2 設置文檔(舞臺)屬性Fig.2 Set up parameters of the document(stage)
4.2.1 場景(scene)及時間軸對象的主要屬性
一場戲劇可以分為很多幕,這個“幕”就可以理解為場景,也可以理解為一本書中的一個章節(jié)。復雜的動畫往往分為多個場景,便于設計及管理。演員、音響、背景等各種因素需要按照事先安排好的次序及時間來進行演出,這個總調度是由時間軸來完成的。主要屬性有,timeline.name:場景(時間軸)名稱;timeline.currentLayer:當前活動圖層的編號;timeline.layerCount:圖層總數(shù);timeline.layers :圖層對象數(shù)組。
4.2.2 圖層(layer)對象的主要屬性
圖層可以看成是拍攝用的膠片,每層膠片是透明的,多個圖層按次序垂直排列。處于上面圖層中的對象會遮住下層相同位置的對象。圖層的主要屬性有,layer.color:圖層輪廓顏色;layer.frameCount:圖層幀數(shù);layer.frames:幀對象數(shù)組;layer.height:以百分比表示的圖層高度;layer.layerType:圖層類型;layer.parentLayer:圖層包含的文件夾、引導圖層或遮罩圖層。layer.locked:圖層的鎖定狀態(tài);layer.name:圖層的名稱;layer.visible:圖層是否被掩藏。
4.2.3 幀(frame)對象的主要屬性
“幀”是時間軸上的一個小格,是舞臺內容中的一個片斷,多個幀按照一定速度播放就形成了動畫。主要屬性有,frame.name:幀名稱;timeline.currentFrame:當前幀編號;frame.actionScript:ActionScript 代碼;frame.duration:幀的數(shù)量;frame.tweenType:補間的類型;frame.tweenEasing:補間對象的緩動數(shù)量;frame.labelType:幀名稱的類型,分為名稱、注釋、錨記三種;frame.motionTweenOrientToPath:動畫運動時是否旋,其中,motionTweenRotate說明旋轉方向(順時針或逆時針),motionTweenRotateTimes代表定補間元素在起始關鍵幀和下一關鍵幀之間旋轉的次數(shù);frame.motionTweenScale:對象移動時是否縮放,motionTweenSnap表示是否對齊到路徑,motionTweenSync表示對象運動時是否和時間軸同步。另外還有聲音名稱,播放方式及次數(shù)等屬性。
元素是一個統(tǒng)稱,在舞臺上輸入的文本、繪制的圖形、導入的位圖等都是元素,element.elementType表示元素的類型,有常用的有三種:"shape"、"text"、"instance"。Shpae對象是形狀對象。Instance 是庫項目的實例,對于位圖,通過instanceType屬性返回“bitmap”來判斷,然后通過getBits函數(shù)來測試其高度、寬度和顏色位數(shù)。文本類型分為靜態(tài)、動態(tài)及輸入三種,本系統(tǒng)著重測試靜態(tài)(static)文本。通過getTextAttr函數(shù)來測試字體名稱、顏色、大小、加粗、斜體、對齊方式等項目。濾鏡的概念是自FLASH8.0以后增加的,類似于PHOTOSHOP的濾鏡,用于增強位圖、文本、元件實例的效果。用getFilters函數(shù)可以獲得濾鏡對象,進而獲得其它的相應屬性。
庫(library)對象相當于一模板,包含元件(Symbol)、位圖、聲音和視頻。元件的類型分為 "movie clip"、"button"和"graphic",分別代表“影片剪輯”、“按鈕”及“圖形”。對于反復使用的元素,盡可能設計為元件,便于管理并能減少文件體積。通過getItemType屬性可以獲得其類型,通過getItemProperty函數(shù)獲取所選項目的屬性。
getCustomStroke()返回筆觸對象。stroke.capType,指定筆觸端類型的字符串。可接受的值為 "none"、"round"和 "square";stroke.thickness 返回筆觸高度;stroke.color返回筆觸顏色。通過 getCustomFill()獲得取所選內容的填充對象,然后通過 fill.style、fill.color、fill.colorArray、fill.posArrayt等來返回填充類型、顏色、漸變及位置等屬性。
對于標準的矢量圖形的識別,例如直線、圓、橢圓、三角形、矩形、多邊形、星形等,可以統(tǒng)一采用模糊判斷方法。即在題目里明確規(guī)定形狀的高度、寬度以及X、Y的坐標,這樣便于閱卷。Flash編輯環(huán)境中元素的坐標位置見圖3及圖4。通過程序獲取其邊界點(參考6.1小節(jié)里的 getEgePoint()函數(shù)),然后和知識庫里的標準點比對,只要存在這些點(允許一定的誤差)就認為操作是正確的。
對于不規(guī)則區(qū)域的識別相對比較復雜,不規(guī)則區(qū)域是由貝塞爾曲線組成的。在獲取了邊界點后,利用貝塞爾曲線公式,根據(jù)統(tǒng)計方法進行判斷[4]。
圖3 屬性設置面板Fig.3 Panel of parameter setting-up
圖4 圓的坐標點分配示意圖Fig.4 Map of distribution of circle points on the coordinate
閱卷系統(tǒng)可以采取兩種方式給出成績:一是在JSFL文件里輸出各種對象的屬性值,并保存為文本文件,然后利用其它高級語言(例如VB)來讀取這個文件和標準答案比對;另一種方法是利用JSFL直接評分,并將分數(shù)寫在文件里,然后利用VB來讀取這個分數(shù)。前者比較靈活,可以結合數(shù)據(jù)庫做成通用的系統(tǒng),后者則可以設計一些比較復雜的題目,閱卷效率比較高。示例1采用了第一種方法,示例2則采取了第二種方法。另外,為了節(jié)約篇幅,程序中略去了錯誤處理代碼,具體閱卷時,需要詳細考慮容錯問題,例如考生沒有全部完成題目,此時JSFL代碼可能得不到正確的結果,可以使用try…catch(error)…finnaly以及使用if語句來處理。
繪制 1個圓,半徑為 60,位置(X、Y)為(100,100)。筆觸顏色為為紅色,高度為4,用放射狀顏色填充,顏色點位置大概為(0,255),顏色分別為藍色、白色。見圖5。
圖5 閱卷示例1Fig.5 Example 1 of Assessment
關鍵閱卷代碼及分析:
表1 score1.txt文件的內容Tab.1 Content of the file score1.txt
表1所示的內容,用VB打開該文件,使用Instr()等函數(shù)就可以進行閱卷,只要判斷存在第1行的數(shù)據(jù),就可以認為正確繪制了一個圓。然后判斷第2、3行的內容,和標準答案比較即可給出分數(shù)。
新建1個FLA文件,將圖層1命名為“背景”,導入素材“乒乓桌.jpg”到舞臺上,將其設置為背景。新建1個元件“乒乓球”,類型為“影片剪輯”。新建1個圖層,命名為“乒乓球”,將“乒乓球”元件拖到主舞臺中,從第1幀到第10幀建立補間動畫,見圖6。
圖6 閱卷示例2Fig.6 Example 2 of assessment
關鍵閱卷代碼:
Flash操作題目閱卷系統(tǒng)分為兩個部分:出題系統(tǒng)及閱卷系統(tǒng),主程序及控制部分用VB開發(fā),F(xiàn)lash對象屬性的獲得通過JSFL來獲取。系統(tǒng)框架圖見圖7。在VB中結合ADO來操作數(shù)據(jù)庫[5],出題時用JSFL讀取FLA文件對象的各種屬性并寫入數(shù)據(jù)庫。閱卷時,再次利用JSFL獲得對象的屬性,進行比對,給出成績并寫入數(shù)據(jù)庫。閱卷的JSFL文件以及VB閱卷腳本保存在數(shù)據(jù)庫里,可以動態(tài)增加修改,因此本系統(tǒng)具有靈活的可擴展性。
圖7 閱卷系統(tǒng)框架圖Fig.7 The framework of the assessment system
VB關鍵代碼:
對于Flash軟件的考核,主要是測試學生對基本工具掌握的情況等,通過實例可以看出,該測試方法完全可行,結合在線理論測試系統(tǒng)及CAI輔助學習系統(tǒng),可以大大減少教師的工作量,提高學生的學習興趣及積極性,提高了閱卷的公正性。本系統(tǒng)在我校的Flash公選課程里試用,取得了不錯的效果。下一步打算將其做成COM插件[6]的形式運行于IE瀏覽器里,這樣整個系統(tǒng)都是基于B/S結構,方便了系統(tǒng)的使用及更新。
[1]張 震.中文Flash8動畫網頁制作與實例教程[M].北京:冶金工業(yè)出版社,2006.
[2]孫家廣.計算機圖形學[M].北京:清華大學出版社,2002.
[3]張新峰,沈蘭蓀.模式識別及其在圖像處理中的應用[J].測控技術,2004,23(5):28-32.
[4]徐文勝.真實環(huán)境下FLASH自動測評系統(tǒng)[J].農機化研究,2004(1):227-229.
[5]魯佩云.ADO對象模型和用VB實現(xiàn)其應用的兩種方式[J].計算機工程與設計,2005,26(7):1 947-1 949.
[6]游慶祥,姚世軍,韓 強.一種基于接口匹配的構件庫設計[J].微計算機信息:管控一體化,2006,22(9273):269-271.