在Flash MX Professional 2004中,雖然Flash本身提供了制作測驗(yàn)的模板,但是,一方面,運(yùn)用系統(tǒng)自帶的模板創(chuàng)作練習(xí)課件,需要掌握一定的Flash基礎(chǔ)知識(shí);另一方面,利用模板創(chuàng)作練習(xí),雖然簡便,但不利于后期的維護(hù)與修改,特別是當(dāng)需要同時(shí)添加數(shù)量較多的題目時(shí),測驗(yàn)?zāi)0寰惋@得有些力不從心了。本文介紹一種全新的制作思路:結(jié)合XML技術(shù),將試題信息存放在外部XML文件中,程序運(yùn)行時(shí),通過Flash ActionScript讀取XML文件中的數(shù)據(jù),并呈現(xiàn)給用戶。
設(shè)計(jì)思路
本練習(xí)模板主要由用戶界面文件、數(shù)據(jù)文件和動(dòng)作腳本文件三部分組成。用戶界面文件向使用者顯示試題信息、交互信息(交互按鈕和交互結(jié)果)等;數(shù)據(jù)文件主要用來存放試題內(nèi)容,如題號(hào)、題干、各備選項(xiàng)以及正確答案等,它是一個(gè)獨(dú)立的XML文件;動(dòng)作腳本文件則是用戶界面和數(shù)據(jù)間通信的橋梁,它將XML文檔中的數(shù)據(jù)解析后存放在數(shù)組中,并通過界面文件顯示出來。在Flash文件中,可以用Flash自帶的腳本編輯器編寫動(dòng)作腳本文件。運(yùn)行時(shí),要將上述三個(gè)文件放在同一目錄下。本練習(xí)模板的各部分關(guān)系及其流程如圖1所示。

圖1 模板各部分間的關(guān)系及程序流程
技術(shù)實(shí)現(xiàn)
上文中我們介紹了該練習(xí)模板的設(shè)計(jì)思路。接下來,我們結(jié)合一個(gè)具體的實(shí)例,介紹一下該練習(xí)模板的制作過程。
創(chuàng)建用戶界面文件
1.在Flash舞臺(tái)上,創(chuàng)建如圖2所示的內(nèi)容,各實(shí)例的名稱在圖中已給出。
注意:后綴為_txt的實(shí)例是動(dòng)態(tài)文本框,后綴為_pb的實(shí)例是Button組件,后綴為_rb的實(shí)例是Radio-Button組件。

圖2 各實(shí)例的名稱及布局
2.設(shè)置RadioButton實(shí)例的屬性。選中chA_rb實(shí)例,打開“屬性”面板,在“屬性”面板中選擇“參數(shù)”選項(xiàng)卡,將data參數(shù)的值設(shè)為1。以此類推,chB_rb、chC_rb、chD_rb的data參數(shù)值分別設(shè)為2、3、4,以便在程序中與正確答案進(jìn)行匹配。
3.設(shè)置動(dòng)態(tài)文本框的屬性。分別選中title_txt、chA_txt、chB_txt、chC_txt和chD_txt,在“屬性”面板中將其屬性設(shè)置為“多行”,以滿足題干及選項(xiàng)內(nèi)容過多時(shí)的需要。
數(shù)據(jù)文件
數(shù)據(jù)文件是一個(gè)XML文件,XML語言是Extensible Markup Language的簡稱,它是W3C組織采取簡化SGML的策略而制定的一種可擴(kuò)充的標(biāo)記語言,可以根據(jù)信息提供者的需要自行定義標(biāo)記、屬性名及描述法。在本實(shí)例中,讀者不需要專門學(xué)習(xí)XML語言,只要按照下面的格式創(chuàng)建一個(gè)XML文件即可。如果沒有專門的XML編輯器,可以用記事本來編寫。
<?xml version="1.0"?>
<questions>
<question>
<id>1</id>
<title>世界上第一臺(tái)電子數(shù)字計(jì)算機(jī)誕生于( )</title>
<answerA>1945年</answerA>
<answerB>1946年</answerB>
<answerC>1947年</answerC>
<answerD>1948年</answerD>
<rightanswer>2</rightanswer>
</question>
…
</questions>
在該XML文件中,<questions>是本XML文件的根元素,一個(gè)XML文件只能有一個(gè)根元素。<id>元素記錄題目的序號(hào);<title>元素記錄題干;<answerA>、<answerB>、<answerC>、<answerD>分別記錄四個(gè)備選項(xiàng);<rightanswer>記錄正確答案。當(dāng)向程序中添加題目時(shí),只需創(chuàng)建若干個(gè)<question>元素,并添加題目序號(hào)、題目名稱、備選項(xiàng)及正確答案即可。
有一點(diǎn)請(qǐng)讀者注意,當(dāng)用記事本編輯XML文件時(shí),保存時(shí)以.xml作為文件的擴(kuò)展名,并在“另存為”對(duì)話框中的“編碼”項(xiàng)中選擇UTF-8。
動(dòng)作腳本文件
我們創(chuàng)建了用戶界面文件和數(shù)據(jù)文件之后,如何才能將數(shù)據(jù)文件中的數(shù)據(jù)在用戶界面文件中顯示出來呢?這就要用到我們將要介紹的動(dòng)作腳本文件了。動(dòng)作腳本文件負(fù)責(zé)導(dǎo)入外部的XML文件,并對(duì)用戶界面文件中的交互事件(如click事件)進(jìn)行處理。
在“文件”菜單中單擊“新建”子菜單,彈出“新建文檔”對(duì)話框,在“常規(guī)”選項(xiàng)卡中選擇“動(dòng)作腳本文件”就可以創(chuàng)建一個(gè)外部動(dòng)作腳本文件,將其命名為action.as。下面是action.as文件中的幾處關(guān)鍵代碼。
1.解析XML文檔。要將外部的XML文檔中的數(shù)據(jù)導(dǎo)入到Flash程序中來,需要調(diào)用XML對(duì)象的load方法來加載外部XML文檔,格式為:questionXML.load("question.xml");
其中questionXML為XML對(duì)象,而question.xml則為外部XML文檔的相對(duì)路徑。
當(dāng)XML文檔加載到Flash程序中后,需要在XML對(duì)象的onLoad事件中對(duì)XML數(shù)據(jù)進(jìn)行解析,并將數(shù)據(jù)存入相應(yīng)的數(shù)組中,其代碼如下:
questionXML.onLoad=function(status):Void
{
for (vari=0;i<n;i++)
{
vartempNode:XMLNode=new XMLNode();
tempNode=this.firstChild.childNodes[i];
id_array.push(tempNode.firstChild.firstChild.nodeValue);
title_array.push(tempNode.childNodes[1].firstChild.nodeValue);
chA_array.push(tempNode.childNodes[2].firstChild.nodeValue);
chB_array.push(tempNode.childNodes[3].firstChild.nodeValue);
chC_array.push(tempNode.childNodes[4].firstChild.nodeValue);
chD_array.push(tempNode.childNodes[5].firstChild.nodeValue);
rightAnswer_array.push(tempNode.childNodes[6].firstChild.nodeValue);
}
}
2.處理導(dǎo)航按鈕的click事件。單擊導(dǎo)航按鈕,可以在不同的題目之間實(shí)現(xiàn)切換,這里以first_pb為例,其他按鈕的處理方式與此大體相同,只是在細(xì)節(jié)上有些差異,其代碼如下:
function first_pb_click(evt:Object):Void
{
CN=0;
first_pb.enabled=false;
prev_pb.enabled=false;
next_pb.enabled=true;
last_pb.enabled = true;
cq_txt.text = String(CN + 1);
id_txt.text = String(id_array[CN]);
title_txt.text = title_array[CN];
chA_txt.text = chA_array[CN];
chB_txt.text = chB_array[CN];
chC_txt.text = chC_array[CN];
chD_txt.text = chD_array[CN];
}
3.處理check_pb的click事件。當(dāng)用戶單擊check_pb按鈕后,可以對(duì)用戶所做的問題進(jìn)行檢查,并給出相應(yīng)的反饋信息,其代碼如下:
function check_pb_click(evt:Object):Void
{
check_pb.enabled = false;
//判斷是否答對(duì)
if(radioGroup.selectedData == rightAnswer_array[CN])
feedback_txt.text = "恭喜你,你答對(duì)了!繼續(xù)努力!";
else
feedback_txt.text = "真遺憾,你答錯(cuò)了,再仔細(xì)考慮考慮吧!";
}
4.在該Flash程序中,我們使用了Button組件和RadioButton組件。在Flash MX Professional 2004中,組件使用廣播器/偵聽器模型來處理它們的事件(如click事件等)。因此,我們需要為程序中的組件注冊(cè)偵聽器,來處理它們的事件。下面分別是first_pb和check_pb注冊(cè)偵聽器的代碼:
first_pb.addEventListener("click",first_pb_click);
check_pb.addEventListener("click",check_pb_click);
addEventListener方法有兩個(gè)參數(shù):第一個(gè)參數(shù)是事件的名稱;第二個(gè)參數(shù)是偵聽器對(duì)象,這里我們使用函數(shù)作為click事件的偵聽器對(duì)象。
動(dòng)作腳本文件創(chuàng)建后,在用戶界面文件中,新建一個(gè)action圖層,它位于所有圖層的上方。打開“動(dòng)作”面板,在該圖層的第一幀中輸入如下命令:
#include“action.as”
這樣運(yùn)行本模板就可以了。
本模板在Flash MX Professional 2004下運(yùn)行通過,其運(yùn)行效果如圖3所示。
<img src="/qkimages/xxjy/xxjy200612/xxjy20061228-3-l.jpg" hspace="15" vspace="5" align="">
圖3運(yùn)行效果圖
結(jié)束語
使用Flash制作的選擇題測驗(yàn)?zāi)0寰哂形募w積小、交互性強(qiáng)、表現(xiàn)力豐富、便于維護(hù)與更新等特點(diǎn),特別適合制作成網(wǎng)絡(luò)課件和在線測試題。本文主要介紹使用Flash設(shè)計(jì)交互選擇題測驗(yàn)?zāi)0宓姆椒ǎO(shè)計(jì)要點(diǎn)是利用UI 組件構(gòu)建選擇題模板中的交互控件;利用外部的XML文件存儲(chǔ)試題的數(shù)據(jù);利用動(dòng)作腳本語言實(shí)現(xiàn)程序邏輯結(jié)構(gòu)。當(dāng)需要對(duì)測試題進(jìn)行修改與更新時(shí),只需要修改外部的XML文檔即可。該選擇題測驗(yàn)?zāi)0宀坏梢詥为?dú)使用,而且可以和具體的課程結(jié)合起來,嵌入到網(wǎng)絡(luò)課程中。其他類型的測驗(yàn)題課件(判斷題、填空題等)也可以用類似的方法進(jìn)行設(shè)計(jì)和制作。