明昀
Flash中碰撞檢測技術的研究與應用
明昀
Flash是現今十分熱門的技術,通過Flash可以實現動畫、游戲和交互多媒體等應用,功能強大。
本文重點討論采用Flash技術中使用actionscript進行碰撞檢測,并舉例說明其不同的使用方式,最后通過對一款平面飛行射擊游戲中碰撞檢測的設計,來說明其具體應用方法。
Flash; 碰撞檢測
在Flash actionscript 2.0中我們可以使用MovieClip 類的 hitTest() 方法來檢測 SWF 文件中的沖突。它檢查某個對象是否與影片剪輯有沖突,然后返回一個布爾值(true 或 false)。我們可能想了解是否發生了沖突,以測試用戶是否已到達舞臺上的某個特定靜態區域,或確定一個影片剪輯何時到達另一個影片剪輯。利用hitTest() 方法,可以判定這些結果。可以使用 hitTest() 的參數來指定舞臺上某個點擊區域的 x 和 y 坐標,或者使用另一個影片剪輯的目標路徑作為點擊區域。在指定 x 和 y 時,如果由 (x, y) 標志的點是非透明點,則 hitTest() 返回 true。當目標傳遞給 hitTest() 時,會對兩個影片剪輯的邊框進行比較。如果二者相交,則 hitTest() 返回 true。如果兩個邊框沒有相交,則 hitTest() 返回 false。hitTest具體用法為:
用法 1:根據 shapeFlag 設置,將 x和 y 坐標與指定實例的形狀或邊框進行比較。如果 shapeFlag 設置為 true,則只計算在舞臺上的實例實際占據的區域,并且如果 x 和 y 在任意一點重疊,則返回true 值。此評估對于確定影片剪輯是否處于指定的點擊區域或熱點區域中很有用。參數x為舞臺上點擊區域的 x 坐標,y為舞臺上點擊區域的 y 坐標,x 和 y 坐標都在全局坐標空間中定義,shapeFlag為一個布爾值,指定是計算指定實例的整個形狀(true) 還是僅計算邊框 (false);只有當用x 和 y 坐標參數標志點擊區域時,才可以指定該參數。例如,鼠標控制影片剪輯移動。鼠標在(坐標_xmouse, _ymouse)影片剪輯test_mc上(與test_mc重疊或交叉)時,test_mc向右移動10個像素。此時可以在場景第1幀上使用test_mc執行onEnterFrame事件處理函數,并在函數中使用hitTest進行判斷,即“if (this.hitTest (_xmouse, _ymouse, false))”,如果鼠標坐標與test_mc交叉或重疊(鼠標在test_mc上),則test_mc橫坐標增加10個像素“this. _x += 10”,test_mc橫坐標大于或者等于500個像素時“if (this._x>=500)”,重新設置test_mc橫坐標為0。
用法 2:計算target 和指定實例的邊框,如果它們在任意一點上重疊或交叉,則返回 true。Target為可能與影片剪輯相交或重疊的點擊區域的目標路徑。target 參數通常表示一個按鈕或一個文本輸入字段。例如,要把圓等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)”判斷鼠標按下時進行,并在on語句中把本mc的坐標賦給本mc下的變量x、y,并拖動這個mc,即“startDrag(this, true)”;使用“on (release)”判斷松開鼠標時動作,在做松開動作時停止拖動這個mc,并使用“if (this.hitTest(_root. wz1))”來判斷這個mc和動態文本wz1重疊或相交;相交時,判斷這時如果這個mc上的變量k不為1則主時間軸上的變量i加1,并在這個mc上設置變量k=1(使一個mc拖動正確時,主時間軸上的記數變量i只加1次);如相交時,主時間軸上的記數變量i等于6(圖形都正確拖動完畢),主時間軸跳到下1幀停下;但如果這個mc和動態文本wz1不重疊或相交,那么把這個mc的坐標設置為前面得到的這個mc的坐標的數值;我們可以先檢測一個mc代碼的正確性,然后再把這代碼復制在其他5個mc上,只消把其中的wz1改為相應的wz2~wz6即可。
通過上面研究了解了hitTest的基本用法后,下面就以一款平面飛行游戲中碰撞檢測為例,進一步說明其實際應用:
1、首先確定需要相互碰撞的對象。游戲中主角飛機與所有敵機機身會發生碰撞,被撞后雙方同歸于盡;主角子彈和其他友機子彈會與所有敵機機身發生碰撞,被撞后敵機生命將根據子彈威力扣減,為零則敵機被擊毀;敵機子彈與主角飛機發生碰撞,被撞后主角生命將根據子彈威力扣減,為零則主角被擊毀。
2、設置碰撞范圍。在Flash庫中雙擊子彈元件,進入元件編輯,更改主角子彈圖形為“影片剪輯”,“實例名稱”為“body”,這就是子彈進行碰撞判斷的范圍;同樣,重復此步驟,對其他元件也設置好碰撞范圍,對于飛機元件除了設置好碰撞范圍外,還可以加多一幀,把實例屬性“顏色”為“亮度100%”,這表示是飛機被擊中時進行一次反白顯示。
3、子彈碰撞檢測。在庫中雙擊“敵機子彈(enemy_bullet)”元件,進入元件編輯,新建一圖層,起名為“action”,在該層第1幀按
4、飛機碰撞檢測。在庫中雙擊“敵機(enemy)”元件,進入元件編輯,先在最后一幀設置“幀標簽”為“remove”,加入代碼“stop()”和“this.removeMovieClip()”,表示飛機消失處理;其次選擇飛機實例,按
10.3969/j.issn.1001-8972.2011.16.138