hitTest函數是用來檢測兩個物體或目標是否重疊和相交,如果相交或重疊,就執行相應的動作,這對于我們做一些互動的動畫和游戲是非常有用。比如在做點鞭炮、射擊等的動畫時,就可以用hitTest的方法。
源文件下載
hitTest用法
1、my_mc.hitTest(x, y, true[false])
影片剪輯my_mc和由x,y指定的點擊區域重疊或交叉,則執行(大括號中)命令。參數true是指my_mc的整個形狀;false是指my_mc包括邊框。
2、my_mc.hitTest(target)
影片剪輯my_mc與target的目標路徑指定的實例交叉或重疊。target 參數通常表示帶路徑的實例名。
實例應用
例1 鼠標控制影片剪輯移動。鼠標在(坐標_xmouse, _ymouse)影片剪輯qiu_mc上(與qiu_mc重疊或交叉)時,qiu_mc向右移動10個象素。打開3.4.1.fla文件。
在場景第1幀上的腳本為:
qiu_mc.onEnterFrame = function() { //qiu_mc執行onEnterFrame事件處理函數;
if (this.hitTest(_xmouse, _ymouse, false)) {
//如果鼠標坐標與qiu_mc交叉或重疊(鼠標在qiu_mc上)
this._x += 10; //qiu_mc橫坐標增加10個象素;
}
if (this._x>=500) { //qiu_mc橫坐標大于或者等于500個象素時
this._x = 0; //重新設置qiu_mc橫坐標為0;
}
};
點擊查看動畫效果<
注意,把碰撞函數中的參數false改為true,觀測不同效果,加深對mc的形狀與邊框的理解。
例2 打開3.4.2fla文件
本例中,要把圓等6個圖形拖到上面對應的文字上。6個圖形分別是tx1_mc~~tx6_mc;6個對應的文字都是動態文本,名稱分別是wz1~wz6.每個mc拖動的位置如果出錯了能夠自動回到原來的位置,當6個mc都能正確拖到對應位置上時,主時間軸從第1幀跳到第2幀,并給于文字說明。
顯然,我們只要在一個mc上的腳本寫對了,其它5個mc就可以很方便的寫出來。
在主時間軸第1幀上寫的腳本:
stop();
i=0 ; //設置用于記數的變量
在圓(tx1_mc)上的腳本為:
on (press) { //鼠標按下時
x = _x; //把本mc的坐標賦給本mc下的變量x,y
y = _y;
startDrag(this, true); //拖動這個mc
}
on (release) { //松開鼠標時
stopDrag();//停止拖動這個mc
if (this.hitTest(_root.wz1)) { //如果這個mc和動態文本wz1重疊或相交;
if (k != 1) { //這時如果這個mc上的變量k不為1
_root.i++; //主時間軸上的變量i加1;
k = 1;
//在這個mc上設置變量k=1(使一個mc拖動正確時,主時間軸上的記數變量i只加1次)
}
if(_root.i==6){ //如果主時間軸上的記數變量i等于6時(圖形都正確拖動完畢)
_root.nextFrame();//主時間軸跳到下1幀停下;
}
} else { //如果這個mc和動態文本wz1不重疊或相交
_x = x;//把這個mc的坐標設置為前面得到的這個mc的坐標的數值
_y = y;
}
}
我們可以檢測這段代碼的正確性,然后我們可以把這段代碼復制在其他5個mc上,只消把其中的wz1改為相應的wz2~wz6即可。
點擊查看動畫效果<
既然這六個mc上的代碼都非常接近,我們應該想辦法用函數的辦法來處理。這六個mc上的代碼中只有拖動的mc不同以及檢測的文本不同,因此,這個自定義函數應該有兩個參數。
例3 打開3.4.3fla文件.在主時間軸第1幀上加上如下代碼:
stop();
i = 0;
function stlx(md, mc) { //md為拖動的mc,mc為檢測的文本
stopDrag();
if (md.hitTest(mc)) {
if (md.k!=1) { //變量k是md上的,因此這里寫成md.k
i++; //自定義函數是寫在主時間軸上,因此主時間軸上的變量可以不用寫路徑
md.k = 1;
}
if (i == 6) {
nextFrame();
}
} else {
md._x = md.x;
md._y = md.y;
}
}
在mc上的代碼就可以大為簡化
在圓(tx1_mc)上的代碼就可以寫成:
on (press) {
x = _x;
y = _y;
startDrag(this, true);
}
on (release) {
_root.stlx(this, _root.wz1);
//是在mc上寫的調函數腳本,因此這里的stlx()和wz1都應該加上路徑。
}
把tx1_mc上的代碼復制到其它5個mc上,只把其中的wz1換成wz2~~wz6就行了。
為了可以重復做這個練習,在主時間軸第2幀上加上一個按扭,在按扭上加上:
on (release) {
prevFrame(); //回到第1幀
}
作業
用事件處理函數改造例2中的源文件,要求:
1、腳本都寫在主時間軸的第1幀上,所有mc上都不寫腳本;
2、注意使用onPress,onRelease處理函數及循環語句。
查看全套"Flash AS 高級教程"