Flash AS入門教程第七課:影片剪輯第五節_拖動與碰撞檢測_Flash教程
推薦:Flash AS入門教程:文本與字符實例—打字游戲制作簡介:本例繼續講解AS的基礎知識,前幾節課我們學習了AS中的文本與符的理論知識,今天來實際操作一下,制作一個打字游戲,對Flash的AS編程有興趣的朋友可以到論壇與作者交流~~本文由中國教程
本文由中國教程網 sanbos 原創,轉載請保留此信息!
第五節 拖動與碰撞檢測
AS的一個重要優勢就是可以實現交互動畫,一些特效不用AS也是可以做出來的,但交互的動畫不用AS則是無法實現的。拖動MC則是交互動畫的一個例子。
startDrag() 函數或 MovieClip.startDrag() 方法:
使用startDrag()可以實現拖動效果。格式:
MC.startDrag(一個布爾值,左邊,上邊,右邊,下邊);
這個方法中的所有參數都是可選的,即可要可不要。下面介紹一下這些參數:
一個布爾值:true或false。當設定為true時鼠標位置將鎖定在要拖動的MC的注冊點上。想一想我們要自定義鼠標指針,這個參數是不是很有用呢?
后面的4個邊,確定了MC可以被拖動的范圍。想一想我們要做一個控制滑條這幾個參數是不是很有用呢?
下面練習一下:
自定義鼠標指針:
新建一個MC,畫一個或找一個你喜歡的鼠標圖形,圖形應該有一個較尖的部位作為針尖吧?將這個針尖與窗口中的十字對齊。回到主場景,將這個MC拖到舞臺上,打開屬性面板,實例名稱為:mouse_mc;打開幀動作面板輸入:
Mouse.hide();
mouse_mc.startDrag(true);
測試影片,你會發現你的鼠標已經變成你喜歡的圖形了。
stopDrag()方法:
上面介紹了開始拖動MC的方法,開始拖動總得有停止拖的時候啊,這個方法就是停止拖動。我們回想一下拖動一個MC的過程,一般來說,都是點下鼠標左鍵不放,就可以拖動了,放開鼠標后就停止拖動,是這樣的吧?所以一般將startDrag()放到MC的onPress事件(點下鼠標時)中,而將 stopDrag()放到onRelease事件(放開鼠標時)中。
滑動控制條:
有時我們會用到滑動控制條,比如控制音量大小,播放進度等。那么滑塊就需要用到拖動的方法。
用矩形工具畫一個細長的矩形,筆觸填充公隨你喜歡,要不要都行,至少要一個吧?將它轉換為MC,雙擊它進入編輯狀態,打開對齊面板選擇相對于舞臺,左對齊,回到主場景,打開屬性面板,實例名稱為blt_mc。然后再畫一個很短的矩形,做滑塊,也轉換為MC,也同細長的矩形一樣的做法,只是居中對齊,最后的實例名為hk_mc。
blt_mc移到你想它所處的位置,將hk_mc移到blt_mc上。
在幀動作面板中輸入:
| l = blt_mc._x; r = l blt_mc._width; h = blt_mc._y; hk_mc.onPress = function(){ this.startDrag("true",l,h,r,h); } hk_mc.onRelease = function(){ stopDrag(); num = (hk_mc._x-blt_mc._x)/blt_mc._width; } |
測試影片,拖動滑塊會發現滑塊只能在進度條的范圍內拖動了。這是因為我們對startDrag()由于方法運用了4個參數:l,r,h.它們分別是進度條的左右邊的x位置及y軸的位置。滑塊的移動范圍被限定在這個范圍內。
從上面的代碼中可以看出,當鼠標放開時會產生一個num變量,這個變量是用滑塊的x坐標減去進度條的x坐標除以進度條的長度,這樣就可以得到一個0~1的數字。有了這個數字,我們就可以用于任何需要用數字控制的對象了。
_droptarget 屬性:
可能會有這種情況,我們拖動一個對象,想知道它是否被拖到了另一個對象之上,比如我們拖動蘋果到盤子中,我們可能想知道蘋果是否被拖到了盤子之上,如果是蘋果則定位到盤子上,如果不是蘋果就掉到深淵中。MC的_droptarget 屬性將返回被自已重疊在下面的MC的名稱。比如將蘋果拖到盤子上時,蘋果將盤子壓在下面,蘋果的_droptarget 屬性將返回盤子的名稱。但它返回的名稱是帶反斜杠的格式的,因此需要用eval()將其轉換為標準格式,如:eval(蘋果. _droptarget)這一句結果是:盤子。
做個練習熟悉一下:
在舞臺上畫兩個園,不同的顏色,均轉換為MC,實例名稱分別為:mc1_mc,mc2_mc.右擊mc1_mc>排列>移至頂層;打開動作面板,輸入:
| mcx = mc1_mc._x; mcy = mc1_mc._y; mc1_mc.onPress = function(){ this.startDrag(true); } mc1_mc.onRelease = function(){ stopDrag(); if(eval(mc1_mc._droptarget)==mc2_mc){ this._x = mc2_mc._x; this._y = mc2_mc._y; } else { this._x = mcx; this._y = mcy; } } |
測試影片,在mc1_mc上點擊時可以拖動,將它拖到mc2_mc上放開鼠標,則與mc2_mc重疊,如果不在mc2_mc上放開鼠標,則回到原位。
這種檢查一個MC是否被拖到另一個MC之上還有另一種方法,那就是碰撞檢測。代碼中第一句將系統鼠標隱藏起來,第二句使你的圖形可以拖動了,并且鼠標指針被定位在針尖處。使用自定義鼠標要注意的是,你不能再拖動第二個MC,因為一次只能拖動一個MC,當你拖動第二個MC時,你的鼠標圖形將不會再被拖動了。
_droptarget 屬性:
可能會有這種情況,我們拖動一個對象,想知道它是否被拖到了另一個對象之上,比如我們拖動蘋果到盤子中,我們可能想知道蘋果是否被拖到了盤子之上,如果是蘋果則定位到盤子上,如果不是蘋果就掉到深淵中。MC的_droptarget 屬性將返回被自已重疊在下面的MC的名稱。比如將蘋果拖到盤子上時,蘋果將盤子壓在下面,蘋果的_droptarget 屬性將返回盤子的名稱。但它返回的名稱是帶反斜杠的格式的,因此需要用eval()將其轉換為標準格式,如:eval(蘋果. _droptarget)這一句結果是:盤子。
做個練習熟悉一下:
在舞臺上畫兩個園,不同的顏色,均轉換為MC,實例名稱分別為:mc1_mc,mc2_mc.右擊mc1_mc>排列>移至頂層;打開動作面板,輸入:
| mcx = mc1_mc._x; mcy = mc1_mc._y; mc1_mc.onPress = function(){ this.startDrag(true); } mc1_mc.onRelease = function(){ stopDrag(); if(eval(mc1_mc._droptarget)==mc2_mc){ this._x = mc2_mc._x; this._y = mc2_mc._y; } else { this._x = mcx; this._y = mcy; } } |
測試影片,在mc1_mc上點擊時可以拖動,將它拖到mc2_mc上放開鼠標,則與mc2_mc重疊,如果不在mc2_mc上放開鼠標,則回到原位。
這種檢查一個MC是否被拖到另一個MC之上還有另一種方法,那就是碰撞檢測。
hitTest()方法:
該方法將檢測MC是否與某點或與另一MC發生相交(碰撞)。如果發生相交則返回true,否則返回false.
用法:1.與某點相交: MC.hitTest(x,y,true或false);
這將檢測MC是否與括號中的x,y所確定的點(x,y)相交。后面的布爾值如果為ture,那么將檢測MC的實際圖形范圍,如果為false則檢測MC的外框是否與(x,y)相交。
2.MC與MC相交:MC.hitTest(另一MC).
把上面的的練習改為下面的代碼,可得到相同的結果:
| mcx = mc1_mc._x; mcy = mc1_mc._y; mc1_mc.onPress = function(){ this.startDrag(true); } mc1_mc.onRelease = function(){ stopDrag(); if(this.hitTest(mc2_mc)){ this._x = mc2_mc._x; this._y = mc2_mc._y; } else { this._x = mcx; this._y = mcy; } } |
分享:Flash教程:旋轉花朵效果的制作效果演示: 本課中的內容涉及:函數定義, for...in 語句, .onEnterFrame 三個關鍵內容,函數的作用是實現代碼的重用,配合for...in語句可批量賦予函數.望初學者仔細閱讀.思路:1.使用for...in
- 相關鏈接:
- 教程說明:
Flash教程-Flash AS入門教程第七課:影片剪輯第五節_拖動與碰撞檢測
。