杜 娟
熱區(qū),通俗地講就是一個(gè)看不見的交互區(qū)域,通過單擊、滑過等響應(yīng)方式觸發(fā)其包含的其他響應(yīng)。在Flash中沒有明確這種功能,但是我們可以綜合運(yùn)用元件(影片、按鈕)和Actions語句來實(shí)現(xiàn)。
一、熱區(qū)的建立
(一)特殊按鈕法
Flash中按鈕制作共包括四幀,依次為:彈起(release)、指針經(jīng)過(pass)、按下(down)和單擊(press)。如果在前三幀不做任何設(shè)置,而只在第四幀中繪制形狀或?qū)胍环鶊D片,如五角星、動(dòng)物、地圖等,那么就制作了一個(gè)“無形”的特殊按鈕。這種按鈕放在場(chǎng)景中是看不到的,但一樣可以實(shí)現(xiàn)按鈕的交互,在繪制的形狀范圍內(nèi)單擊,熱區(qū)響應(yīng)就實(shí)現(xiàn)了,響應(yīng)的區(qū)域就是這些隱藏的圖形。
(二)元件透明法
在Flash6.0以后的版本中,圖形、影片元件是可以進(jìn)行類似于按鈕交互的。即通過給圖片、影片元件加上Actions語句實(shí)現(xiàn)一些特殊的功能,而元件可以設(shè)置多種屬性,所以我們說賦予語句的元件在某種意義上是增強(qiáng)型的按鈕。如將圖片元件的透明度(Alpha)設(shè)置為“0”并且給其加上交互語句,此時(shí)圖片就是一個(gè)熱區(qū)。再如,將動(dòng)態(tài)影片元件進(jìn)行透明度設(shè)置的話,那么熱區(qū)也在不停地變化。從而使熱區(qū)更加豐富多彩。需要提示的是:這一方法同樣適用于按鈕元件,雖然做法不同,但可以達(dá)到和前一種方法一樣的效果。
二、熱區(qū)的響應(yīng)
(一)鼠標(biāo)與熱區(qū)的響應(yīng)
當(dāng)鼠標(biāo)指向某一熱區(qū)時(shí),屏幕上會(huì)給出明顯的變化對(duì)用戶進(jìn)行提示,通常采用的方式是出現(xiàn)一段解釋文字、鼠標(biāo)外形的變化或播放聲音等。
1.文字注釋響應(yīng)
即當(dāng)鼠標(biāo)進(jìn)入由按鈕制作的隱藏區(qū)域中,出現(xiàn)文字提示。此效果可利用控制元件的透明度alhpa來完成,可以給按鈕加上如下語句實(shí)現(xiàn)提示:首先確保提示的文字內(nèi)容是一個(gè)影片元件,為其命名為實(shí)例名instancename,并將其alpha值設(shè)定為0,即不透明。在按鈕的“動(dòng)作”面板中編寫如下的Active腳本:
on (rollOver) {
instancename._alpha = 100;
}
on (rollOut) {
instancename._alpha = 0;
}
2.用自定義鼠標(biāo)注釋響應(yīng)
要?jiǎng)?chuàng)建自定義指針,可在舞臺(tái)上設(shè)計(jì)某種影片剪輯。再在動(dòng)作腳本中隱藏標(biāo)準(zhǔn)指針,并跟蹤自定義指針的移動(dòng)。要隱藏標(biāo)準(zhǔn)指針,可使用內(nèi)置Mouse類的Mouse.hide()方法。要使用影片剪輯作為自定義指針,可使用startDrag()動(dòng)作。創(chuàng)建影片剪輯,將其用做自定義指針并將該剪輯的實(shí)例放置在舞臺(tái)上。在“動(dòng)作”面板中鍵入以下內(nèi)容:
on (rollOver) {
Mouse.hide();
newmouse._alpha = 100;
startDrag(newmouse, true);
updateAfterEvent();
}
on (rollOut) {
Mouse.show();
newmouse._alpha = 0;
}
3.聲音注釋響應(yīng)
當(dāng)鼠標(biāo)進(jìn)入熱區(qū)范圍,通過一段聲音提示。這種方式往往用于低年級(jí)識(shí)字教學(xué)中。其做法是:首先將某段聲音導(dǎo)入到舞臺(tái)上。打開庫,選中剛剛導(dǎo)入的聲音,單擊右鍵,點(diǎn)擊“鏈接”,在彈出的“鏈接屬性”對(duì)話框中,輸入聲音的標(biāo)識(shí)符,如soundlable,并將“作為動(dòng)作腳本”的復(fù)選框勾中,點(diǎn)擊“確定”按鈕確認(rèn)?;氐轿枧_(tái)上,選擇“窗口”→“開發(fā)面板”→“行為”,在行為屬性框中添加聲音行為,即選擇“+”,選擇“聲音”→“從庫加載聲音”,在對(duì)話框中輸入聲音鏈接的ID,也就是聲音的標(biāo)識(shí)符sound- lable,以及聲音的實(shí)例名稱,如instancename。接下來點(diǎn)擊“確定”按鈕即可。這時(shí),會(huì)發(fā)現(xiàn)“行為”屬性面板上增加了“釋放時(shí)”的行為,只需要將其改為“移入時(shí)”即可。同樣的操作方法,“移出時(shí)”的行為是停止聲音。該部分的Active腳本如下:
on (rollOver) {
//Play Internal Sound Behavior
if(_global.Behaviors == null)_global.Behaviors = {};
if(_global.Behaviors.Sound == null)_global.Behaviors.Sound = {};
if(typeof this.createEmptyMovieClip == 'undefined'){
this._parent.createEmptyMovieClip('BS_instancename',new Date().getTime()-(Math.floor((new Date().getTime()) /10000)*10000) );
_global.Behaviors.Sound.instancename = new Sound(this._parent.BS_instancename);
} else {
this.createEmptyMovieClip('_instancename_',new Date().getTime()-(Math.floor((new Date().getTime()) /10000)*10000) );
_global.Behaviors.Sound.instancename = new Sound(this.BS_instancename);
}
_global.Behaviors.Sound.instancename.attachSound("soundlable");
if (true) {
_global.Behaviors.Sound.instancename.start(0,1);
}
//End Behavior
on (rollOut) {
//Stop Sound Behavior
_global.Behaviors.Sound.instancename.stop("soundlable");
}
以上都是以鼠標(biāo)移入熱區(qū)為例進(jìn)行熱區(qū)響應(yīng)的,其實(shí)還可以利用語句實(shí)現(xiàn)其他方式的響應(yīng)。如在熱區(qū)內(nèi)按下鼠標(biāo):MovieorbuttonName.onPress;單擊熱區(qū):MovieorbuttonName.onRelease;按下鼠標(biāo):MovieorbuttonName.onMouseDown;移動(dòng)鼠標(biāo):MovieorbuttonName.onMouseMove;鼠標(biāo)到達(dá)熱區(qū)上:MovieorbuttonName.onRollOver;鼠標(biāo)從影片移到熱區(qū)外:MovieorbuttonName.onRollOut。
(二)元件與熱區(qū)的響應(yīng)
這種響應(yīng)不僅僅是鼠標(biāo)與熱區(qū)之間的交互,而增加了第三方,也就是當(dāng)某個(gè)物體被移動(dòng)到熱區(qū)上時(shí)產(chǎn)生交互,這種方式在一些實(shí)驗(yàn)或游戲中經(jīng)常能夠見到。一般是當(dāng)物體移動(dòng)到熱區(qū)上時(shí)響應(yīng)交互,當(dāng)沒有到達(dá)熱區(qū)上時(shí)物體返回到原來的位置。
首先制作兩個(gè)元件——被拖動(dòng)的物體和熱區(qū),物體的實(shí)例名為Object,熱區(qū)的實(shí)例名為Hotarea。再為元件所在的幀加上如下Actions語句:
_root.object.onPress = function() {
_root.object.startDrag();
x0=_root.hotarea._x;
y0=_root.hotarea._y ;
x1=_root.object._x;
y1=_root.object._y;
};
_root.object.onRelease = function(){
_root.object.stopDrag();
if(_root.hotarea.hitTest(_root.object))
{
_root.object._x = x0;
_root.object._y = y0;
_root.object.stopDrag();
trace("到達(dá)目標(biāo)區(qū)域");
}
else
{ _root.object._x = x1;
_root.object._y = y1;
trace("沒有到達(dá)");
}
};
trace語句可以替換為需要的提示方式。如:gotoandplay()、music.start()等。
(作者單位:遼寧電化教育館)