2.4影片剪輯事件
相對(duì)于前面所介紹的鼠標(biāo)事件、鍵盤事件以及幀事件而言,影片剪輯事件則顯得稍為有點(diǎn)難懂。當(dāng)我們將一個(gè)影片剪輯放到場(chǎng)景中時(shí),他就成了一個(gè)“事件發(fā)射器”,不斷地報(bào)告自己的運(yùn)行狀態(tài),如果我們捕獲這樣的事件,就可以做出相應(yīng)的反應(yīng)和處理。影片剪輯有多種,下面分門別類地加以介紹。
2.4.1onClipEvent(Load)和onClipEvent(unload)
這個(gè)事件在影片剪輯加載的時(shí)候發(fā)生,那什么是影片剪輯的加載呢?比方說(shuō),你在場(chǎng)景中添加了一個(gè)影片剪輯clip_mc,并讓他在第10幀的時(shí)候出現(xiàn)影片中,那么第10幀的時(shí)候它就會(huì)觸發(fā)這個(gè)事件。要想處理這個(gè)事件可以選擇影片剪輯clip_mc,然后在下面的腳本面板中輸入這樣的代碼(通常用來(lái)對(duì)影片剪輯進(jìn)行初始化):
onClipEvent(Load)
{
}
onClipEvent(unload)的作用和onClipEvent(load)的作用恰好相反,當(dāng)影片剪輯消失的時(shí)候,這個(gè)事件就會(huì)發(fā)生。
2.4.2OnClipEvent(enterFrame)
enterFrame事件會(huì)隨著影片的播放而不斷發(fā)生,影片每前進(jìn)一幀,影片剪輯就會(huì)觸發(fā)一次enterFrame事件。假設(shè)影片的播放速率為每秒20幀,那么這個(gè)事件就會(huì)以每秒20次的速率不斷產(chǎn)生。你一定會(huì)問(wèn),這樣的事件有什么作用?其實(shí)在影片剪輯事件中,enterFrame應(yīng)該說(shuō)是最常用的,因?yàn)樗梢杂脕?lái)制作相當(dāng)復(fù)雜的動(dòng)畫(huà)。比方說(shuō),我們要制作一個(gè)炸彈從空中不斷翻滾落下的動(dòng)畫(huà)可以按照這樣的步驟來(lái)執(zhí)行:首先建立一個(gè)影片剪輯作為炸彈,將其拖放到場(chǎng)景中建立影片剪輯實(shí)例,讓這個(gè)實(shí)例捕捉enterFrame事件,并為其設(shè)計(jì)這樣的代碼:
onClipEvent(enterFrame)
{
this._Roation+=10;
this._y+=10;
}
這段代碼的意思就是,每隔一幀將影片剪輯(this)旋轉(zhuǎn)10度,同時(shí)沿縱向移動(dòng)10個(gè)單位。這里用到了一個(gè)“+=”運(yùn)算符,可能有點(diǎn)容易讓人感到困惑,其實(shí)這是一種常用的運(yùn)算符簡(jiǎn)寫方式,意思是“自己給自己加上某個(gè)值”,例如This._Rotation+=10和This._Rotation=This._Rotation+10是等效的。
2.4.3onClipEvent(MounseMove)、onClipEvent (mouseDown)和onClipEvent (mouseUp)
這個(gè)事件和前面見(jiàn)過(guò)的很多時(shí)間似乎有些相似,這幾個(gè)事件確實(shí)是當(dāng)鼠標(biāo)移動(dòng)的時(shí)候發(fā)生,但是要特別注意一點(diǎn),不論鼠標(biāo)在場(chǎng)景的什么位置(而不一定要在影片剪輯上方),這個(gè)事件都會(huì)發(fā)生。鼠標(biāo)每動(dòng)一下,MouseMove事件都會(huì)發(fā)生一次。同樣,你又要問(wèn),這個(gè)事件能干什么了?舉例來(lái)說(shuō),我們需要制作一個(gè)類似泡泡龍那樣的游戲,屏幕下方有一門大炮,當(dāng)鼠標(biāo)移動(dòng)的時(shí)候,炮口會(huì)始終指向鼠標(biāo)的方向。這種效果就可以onClipEvent(MouseMove)來(lái)實(shí)現(xiàn)。具體來(lái)說(shuō),就是將大炮制作成一個(gè)影片剪輯,然后為其添加這樣的代碼:
onClipEvent(mouseMove)
{
var_angle=((this._x-_root._xmouse)/(this._y-_root._ymouse));
trace(var_angle);
var_angle=Math.atan(var_angle);
var_angle=var_angle*180/Math.PI;
this._Rotation=-var_angle;
}
這段代碼用到了幾個(gè)Flash提供的數(shù)學(xué)函數(shù),它們都是在Math對(duì)象內(nèi)部的,因此用起來(lái)很方面。首先,用當(dāng)前影片剪輯的橫向和縱向座標(biāo)減去鼠標(biāo)的橫向和縱向座標(biāo),然后計(jì)算及其夾角的正弦值,接著將這個(gè)值用反正切函數(shù)換算成角度(Math.atan),注意,結(jié)果是弧度數(shù),需要再轉(zhuǎn)換成常用的角度,最后在將其復(fù)制給影片剪輯的_Rotation參數(shù),實(shí)現(xiàn)大炮隨著鼠標(biāo)指針的運(yùn)動(dòng)而旋轉(zhuǎn)的效果。
搞懂了mouseMove事件,MouseDown和MouseUp的含義也就不難理解了。
2.4.4OnClipEvent(keyDown)和onClipEvent(KeyUp)
這兩個(gè)事件和前面的on(Keypress)相似,都是用來(lái)捕獲鍵盤的按鍵事件的。不過(guò),需要特別強(qiáng)調(diào)的是,OnClipEvent(KeyDown)和onClipEvent(KeyUp)這兩個(gè)事件的功能要強(qiáng)大得多,將它們結(jié)合起來(lái)使用可以捕捉用戶按下的組合鍵(比如CTRL+A),這比只能夠捕捉單個(gè)按鍵動(dòng)作的on(Keypress)要強(qiáng)大得多。比方說(shuō),如果我們需要捕捉用戶按下CTRL+F的操作可以使用這樣的代碼:
onClipEvent(keyUp)
{
if (Key.isDown(Key.CONTROL) && Key.isDown(70))
{
//執(zhí)行相應(yīng)的操作
}
}
這段代碼中使用了內(nèi)置對(duì)象Key,這個(gè)對(duì)象對(duì)于按鍵的處理非常有用。IsDown()方法用來(lái)監(jiān)測(cè)某個(gè)鍵是否已經(jīng)按下,這個(gè)函數(shù)的參數(shù)可以是鍵值比如70對(duì)應(yīng)F鍵。也可以使用Key對(duì)象內(nèi)置的鍵名稱,比如Key.CONTROL就是指CTRL鍵。將這兩個(gè)鍵是否按下的結(jié)果進(jìn)行邏輯與運(yùn)算(&&)就可以知道CTRL和F鍵是否同時(shí)按下。
2.4.5OnClipEvent(data)
如果某個(gè)影片剪輯實(shí)例進(jìn)行了數(shù)據(jù)加載的操作,那么OnClipeEvent(data)事件會(huì)在數(shù)據(jù)加載完成的時(shí)候發(fā)生。比方說(shuō),我們?cè)谀硞€(gè)按鈕的on(press)事件處理中加入了代碼執(zhí)行變量加載操作,并將代碼加載函數(shù)loadVariables()的目標(biāo)參數(shù)設(shè)置為某個(gè)影片剪輯。然后再為這個(gè)影片剪輯添加OnClipEvent(data)事件,當(dāng)參數(shù)加載完畢之后,影片剪輯就會(huì)收到一個(gè)OnClipEvent(data)事件。
前面介紹了很多事件,但事實(shí)上Action Script提供的事件還有很多。除了鍵盤事件、鼠標(biāo)事件等等這些非常直觀的事件之外,還有一些比較“抽象”的事件。比方說(shuō),一段聲音播放完成之后會(huì)產(chǎn)生一個(gè)事件,當(dāng)用戶調(diào)整播放器的窗口大小時(shí)也會(huì)產(chǎn)生一個(gè)事件。捕獲并處理這些事件可以進(jìn)一步提升Flash影片的互動(dòng)性能。
聯(lián)系客服