李書有
本文介紹化學(xué)課件設(shè)計(jì)中的一種重要情形——實(shí)驗(yàn)儀器組裝部分的設(shè)計(jì)理論和設(shè)計(jì)技術(shù)。文中的示例《氧氣的實(shí)驗(yàn)室制法》模擬課件(效果如右圖所示),以Flash 8.0作為創(chuàng)作工具,使用影片剪輯的相關(guān)方法,實(shí)現(xiàn)技術(shù)要求,達(dá)到適應(yīng)開放式教學(xué)、給學(xué)生更多探究和分析空間,以實(shí)現(xiàn)以學(xué)生為主體的教學(xué)目標(biāo)的設(shè)計(jì)目的。具體的效果及源文件,請到http://www.i-wing.com.cn/dispbbs.php?boardid=5&id=36page=1頁面下載。
● 實(shí)驗(yàn)需求分析
要設(shè)計(jì)出儀器組裝模擬課件,需要實(shí)現(xiàn)兩方面的內(nèi)容:一是設(shè)計(jì)組裝實(shí)驗(yàn)裝置所需要的相關(guān)元件。這些所需元件,都可以使用Flash的繪制工具進(jìn)行繪制。需要注意的是,這些元件都需要設(shè)置為影片剪輯類型的元件,方便后面的程序控制。二是動作腳本方面。通過設(shè)計(jì)相應(yīng)的動作腳本,實(shí)現(xiàn)如下方面的技術(shù)需求:①元件能夠被拖動。此處使用影片剪輯對象的startDrag方法和stopDrage方法來實(shí)現(xiàn)。②元件能夠進(jìn)行接觸測試,即實(shí)現(xiàn)將元件拖動到指定位置時(shí),通過碰撞測試,確認(rèn)元件是否被放到了指定的位置。③元件能夠進(jìn)行順序測試,即判斷拖動和釋放的元件的順序是否符合實(shí)驗(yàn)裝置組裝的一般順序。④能夠給出反饋提示。反饋提示包括當(dāng)前拖動的元件是哪一個、釋放的位置是不是正確、是不是按照正確的順序進(jìn)行組裝等。
● 設(shè)計(jì)框架
一個實(shí)驗(yàn)儀器組裝類的探究課件可分為三大塊:元件區(qū),組裝區(qū)和提示區(qū)。
元件區(qū):用于放置原始元件的區(qū)域,在放置錯誤后,元件會自動回到原始的位置。
組裝區(qū):用于放置組裝正確的元件,并在此區(qū)域?qū)崿F(xiàn)實(shí)驗(yàn)儀器的組裝。
提示區(qū):此區(qū)域主要放置一個動態(tài)文本框,用于顯示出錯后的文本內(nèi)容。
● 核心技術(shù)
本課件的核心是通過接觸測試,確認(rèn)拖動的儀器是不是按照指定的順序,放在了指定的位置。所以在設(shè)計(jì)中,重點(diǎn)要處理的就是這方面的技術(shù)。
儀器的拖動順序:首先對每一個儀器元件附加一個thisindex屬性,表示正確拖動的位置索引,從1開始,其后一直增加。接著定義一個全局變量_global.sx,確認(rèn)當(dāng)前應(yīng)該擺放的儀器的序號,如果此序號與儀器的thisindex屬性相同,則表示順序正確,全局變量_global.sx加1,繼續(xù)下一個儀器的擺放,直到全部完成。
儀器的拖動和接觸測試:使用影片剪輯的startDrag方法進(jìn)行拖動,使用影片剪輯的hitTest方法進(jìn)行接觸測試。這樣就需要在正確的位置擺放與此相對應(yīng)的元件,不過在沒有檢測到正確擺放之前,正確的元件透明度設(shè)置要比較低,基本無法看到。然后在元件擺放到正確的位置之后,設(shè)置拖動的元件消失,而正確的元件完全顯示出來。這樣就能夠?qū)崿F(xiàn)元件的拖動和碰撞測試效果。由于在使用過程中需要多次使用此段程序,所以用類的繼承方法實(shí)現(xiàn)了一個繼承自MovieClip類的方法hit,實(shí)現(xiàn)拖動、接觸測試、文本提示等相應(yīng)的效果。此方法有兩個參數(shù),參數(shù)mc表示要被接觸到的真實(shí)儀器的實(shí)例名稱,而txt表示提示文本框的實(shí)例名稱。運(yùn)用此方法時(shí),先創(chuàng)建全局變量_global.sx,然后對要拖動的元件設(shè)置其thisindex屬性(拖動正確順序)和tip屬性(表示儀器名稱),最后執(zhí)行hit方法,就能夠?qū)崿F(xiàn)效果了。具體代碼及相應(yīng)的說明如下所示。
MovieClip.prototype.hit = function(mc:MovieClip, txt:TextField) {//自定義一個hit類函數(shù)
this.tempx = this._x;//獲得要移動的mc的初始坐標(biāo)
this.tempy = this._y;
this.onPress = function() {
txt.text = this.tip;
this.startDrag();//按下鼠標(biāo),拖動mc
};
this.onRelease = function() {//釋放鼠標(biāo)
if (this.hitTest(mc)) {
if (_global.sx == Number(this.thisindex)) {
//如果接近要接觸的mc,停止拖動,設(shè)置mc的坐標(biāo)為接近的mc的坐標(biāo)
this.stopDrag();
this._x = mc._x;
this._y = mc._y;
mc._alpha = 100;
this._alpha = 0;
_global.sx++
txt.text = "恭喜你,你的擺放正確,繼續(xù)進(jìn)行哦!";
} else {
this.stopDrag();
this._x = this.tempx;
this._y = this.tempy;
txt.text = "很遺憾,你的擺放順序不正確,繼續(xù)努力哦!";
}
} else {
//如果沒有接近,停止拖動,回到原來的位置
this.stopDrag();
this._x = this.tempx;
this._y = this.tempy;
txt.text = "很遺憾,你的擺放位置不正確,繼續(xù)努力哦!";
}
};
};
下面是對一個儀器的簡單示例代碼,其中m1為要拖動的鐵架臺元件的實(shí)例名稱,m2為處于正確位置的隱形元件的實(shí)例名稱,其他的與此相類,不再贅述。
_global.sx = 1;
m1.thisindex = 1;
m1.tip = "鐵架臺";
m1.hit(mc1, txt);