• <tr id="yyy80"></tr>
  • <sup id="yyy80"></sup>
  • <tfoot id="yyy80"><noscript id="yyy80"></noscript></tfoot>
  • 99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

    Flash中碰撞檢測技術(shù)的研究與應(yīng)用

    2011-02-17 15:48:33明昀
    中國科技信息 2011年16期
    關(guān)鍵詞:碰撞檢測敵機(jī)子彈

    明昀

    Flash中碰撞檢測技術(shù)的研究與應(yīng)用

    明昀

    Flash是現(xiàn)今十分熱門的技術(shù),通過Flash可以實(shí)現(xiàn)動畫、游戲和交互多媒體等應(yīng)用,功能強(qiáng)大。

    本文重點(diǎn)討論采用Flash技術(shù)中使用actionscript進(jìn)行碰撞檢測,并舉例說明其不同的使用方式,最后通過對一款平面飛行射擊游戲中碰撞檢測的設(shè)計(jì),來說明其具體應(yīng)用方法。

    Flash; 碰撞檢測

    在Flash actionscript 2.0中我們可以使用MovieClip 類的 hitTest() 方法來檢測 SWF 文件中的沖突。它檢查某個(gè)對象是否與影片剪輯有沖突,然后返回一個(gè)布爾值(true 或 false)。我們可能想了解是否發(fā)生了沖突,以測試用戶是否已到達(dá)舞臺上的某個(gè)特定靜態(tài)區(qū)域,或確定一個(gè)影片剪輯何時(shí)到達(dá)另一個(gè)影片剪輯。利用hitTest() 方法,可以判定這些結(jié)果??梢允褂?hitTest() 的參數(shù)來指定舞臺上某個(gè)點(diǎn)擊區(qū)域的 x 和 y 坐標(biāo),或者使用另一個(gè)影片剪輯的目標(biāo)路徑作為點(diǎn)擊區(qū)域。在指定 x 和 y 時(shí),如果由 (x, y) 標(biāo)志的點(diǎn)是非透明點(diǎn),則 hitTest() 返回 true。當(dāng)目標(biāo)傳遞給 hitTest() 時(shí),會對兩個(gè)影片剪輯的邊框進(jìn)行比較。如果二者相交,則 hitTest() 返回 true。如果兩個(gè)邊框沒有相交,則 hitTest() 返回 false。hitTest具體用法為:

    用法 1:根據(jù) shapeFlag 設(shè)置,將 x和 y 坐標(biāo)與指定實(shí)例的形狀或邊框進(jìn)行比較。如果 shapeFlag 設(shè)置為 true,則只計(jì)算在舞臺上的實(shí)例實(shí)際占據(jù)的區(qū)域,并且如果 x 和 y 在任意一點(diǎn)重疊,則返回true 值。此評估對于確定影片剪輯是否處于指定的點(diǎn)擊區(qū)域或熱點(diǎn)區(qū)域中很有用。參數(shù)x為舞臺上點(diǎn)擊區(qū)域的 x 坐標(biāo),y為舞臺上點(diǎn)擊區(qū)域的 y 坐標(biāo),x 和 y 坐標(biāo)都在全局坐標(biāo)空間中定義,shapeFlag為一個(gè)布爾值,指定是計(jì)算指定實(shí)例的整個(gè)形狀(true) 還是僅計(jì)算邊框 (false);只有當(dāng)用x 和 y 坐標(biāo)參數(shù)標(biāo)志點(diǎn)擊區(qū)域時(shí),才可以指定該參數(shù)。例如,鼠標(biāo)控制影片剪輯移動。鼠標(biāo)在(坐標(biāo)_xmouse, _ymouse)影片剪輯test_mc上(與test_mc重疊或交叉)時(shí),test_mc向右移動10個(gè)像素。此時(shí)可以在場景第1幀上使用test_mc執(zhí)行onEnterFrame事件處理函數(shù),并在函數(shù)中使用hitTest進(jìn)行判斷,即“if (this.hitTest (_xmouse, _ymouse, false))”,如果鼠標(biāo)坐標(biāo)與test_mc交叉或重疊(鼠標(biāo)在test_mc上),則test_mc橫坐標(biāo)增加10個(gè)像素“this. _x += 10”,test_mc橫坐標(biāo)大于或者等于500個(gè)像素時(shí)“if (this._x>=500)”,重新設(shè)置test_mc橫坐標(biāo)為0。

    用法 2:計(jì)算target 和指定實(shí)例的邊框,如果它們在任意一點(diǎn)上重疊或交叉,則返回 true。Target為可能與影片剪輯相交或重疊的點(diǎn)擊區(qū)域的目標(biāo)路徑。target 參數(shù)通常表示一個(gè)按鈕或一個(gè)文本輸入字段。例如,要把圓等6個(gè)圖形拖到上面對應(yīng)的文字上。6個(gè)圖形分別是tx1_mc~tx6_mc,6個(gè)對應(yīng)的文字都是動態(tài)文本,名稱分別是wz1~wz6,每個(gè)mc拖動的位置如果出錯(cuò)了能夠自動回到原來的位置,當(dāng)6個(gè)mc都能正確拖到對應(yīng)位置上時(shí),主時(shí)間軸從第1幀跳到第2幀,并給予文字說明。顯然,此時(shí)我們只要在一個(gè)mc上的腳本寫對了,其他5個(gè)mc就可以很方便的寫出來;在主時(shí)間軸第1幀上寫的腳本“stop()”,設(shè)置用于記數(shù)的變量“i=0”,在圓(tx1_mc)上的腳本使用“on (press)”判斷鼠標(biāo)按下時(shí)進(jìn)行,并在on語句中把本mc的坐標(biāo)賦給本mc下的變量x、y,并拖動這個(gè)mc,即“startDrag(this, true)”;使用“on (release)”判斷松開鼠標(biāo)時(shí)動作,在做松開動作時(shí)停止拖動這個(gè)mc,并使用“if (this.hitTest(_root. wz1))”來判斷這個(gè)mc和動態(tài)文本wz1重疊或相交;相交時(shí),判斷這時(shí)如果這個(gè)mc上的變量k不為1則主時(shí)間軸上的變量i加1,并在這個(gè)mc上設(shè)置變量k=1(使一個(gè)mc拖動正確時(shí),主時(shí)間軸上的記數(shù)變量i只加1次);如相交時(shí),主時(shí)間軸上的記數(shù)變量i等于6(圖形都正確拖動完畢),主時(shí)間軸跳到下1幀停下;但如果這個(gè)mc和動態(tài)文本wz1不重疊或相交,那么把這個(gè)mc的坐標(biāo)設(shè)置為前面得到的這個(gè)mc的坐標(biāo)的數(shù)值;我們可以先檢測一個(gè)mc代碼的正確性,然后再把這代碼復(fù)制在其他5個(gè)mc上,只消把其中的wz1改為相應(yīng)的wz2~wz6即可。

    通過上面研究了解了hitTest的基本用法后,下面就以一款平面飛行游戲中碰撞檢測為例,進(jìn)一步說明其實(shí)際應(yīng)用:

    1、首先確定需要相互碰撞的對象。游戲中主角飛機(jī)與所有敵機(jī)機(jī)身會發(fā)生碰撞,被撞后雙方同歸于盡;主角子彈和其他友機(jī)子彈會與所有敵機(jī)機(jī)身發(fā)生碰撞,被撞后敵機(jī)生命將根據(jù)子彈威力扣減,為零則敵機(jī)被擊毀;敵機(jī)子彈與主角飛機(jī)發(fā)生碰撞,被撞后主角生命將根據(jù)子彈威力扣減,為零則主角被擊毀。

    2、設(shè)置碰撞范圍。在Flash庫中雙擊子彈元件,進(jìn)入元件編輯,更改主角子彈圖形為“影片剪輯”,“實(shí)例名稱”為“body”,這就是子彈進(jìn)行碰撞判斷的范圍;同樣,重復(fù)此步驟,對其他元件也設(shè)置好碰撞范圍,對于飛機(jī)元件除了設(shè)置好碰撞范圍外,還可以加多一幀,把實(shí)例屬性“顏色”為“亮度100%”,這表示是飛機(jī)被擊中時(shí)進(jìn)行一次反白顯示。

    3、子彈碰撞檢測。在庫中雙擊“敵機(jī)子彈(enemy_bullet)”元件,進(jìn)入元件編輯,新建一圖層,起名為“action”,在該層第1幀按進(jìn)入動作編輯,輸入代碼“stop ()”,在所有層第20幀處按插入幀,在“action”層第2幀按插入空白關(guān)鍵幀,更改“幀標(biāo)簽”為“end”,在第20幀按插入空白關(guān)鍵幀,更改“幀標(biāo)簽”為“remove”,在第20幀按進(jìn)入動作編輯,輸入代碼“stop()”和“this. removeMovieClip()”,“remove”標(biāo)簽表示此幀進(jìn)行子彈消失的處理;選擇子彈實(shí)例,按進(jìn)入動作編輯,先定義子彈屬性“bullet_power=1”和“bullet_speed=20”,分別表示該子彈的威力和速度;其次需定義子彈飛出畫面時(shí)消失,使用“if(元件坐標(biāo)超過規(guī)定xy范圍){ _parent.gotoAndPlay (‘remove’) }”語句設(shè)置;最后使用hitTest來判斷是否擊中主角飛機(jī),即使用“if (_parent.body.hitTest(_root.player.body))”語句來判斷當(dāng)前子彈實(shí)例是否進(jìn)入主角飛機(jī)“player”中實(shí)例名為“body”的碰撞范圍,如是則根據(jù)子彈威力扣主角飛機(jī)生命數(shù)值,如“_root.player_life-=bullet_power”;按+測試,發(fā)現(xiàn)凡是敵機(jī)子彈擊中主角飛機(jī),主角飛機(jī)都會反白一下,這表示碰撞檢測成功。其他“主角飛機(jī)子彈”和“友機(jī)子彈”的做法也基本相同,但需要調(diào)整相關(guān)子彈屬性,同時(shí)需要注意與敵機(jī)子彈的飛行方向不同。

    4、飛機(jī)碰撞檢測。在庫中雙擊“敵機(jī)(enemy)”元件,進(jìn)入元件編輯,先在最后一幀設(shè)置“幀標(biāo)簽”為“remove”,加入代碼“stop()”和“this.removeMovieClip()”,表示飛機(jī)消失處理;其次選擇飛機(jī)實(shí)例,按進(jìn)入動作編輯,同樣先設(shè)置好飛機(jī)屬性,如:“enemy_life=2”和“score=5”,分別表示敵機(jī)生命和擊毀該機(jī)得分;接著同樣使用if語句設(shè)置好判斷是否飛出邊界,超出則刪除;判斷是否與主角飛機(jī)相撞,使用“if(_parent.body.hitTest(_root. player.body))”語句來判斷當(dāng)前敵機(jī)實(shí)例是否進(jìn)入主角飛機(jī)“player”中實(shí)例名為“body”的碰撞范圍,如進(jìn)入則兩機(jī)同歸于盡,如代碼“_root.player_life-=_root. player_life”;判斷是否被主角或主角友機(jī)子彈擊中,這里由于子彈不只一發(fā),因此需要使用“for (i=1; i<=子彈最大數(shù)量; i++)”語句進(jìn)行循環(huán),使用“if(_parent. body.hitTest (_root["player_bullet"+i]. body))”語句來判斷是否與子彈相撞,如相撞則子彈消失,并根據(jù)子彈威力扣減自己生命數(shù)值;最后判斷自身生命數(shù)值是否為0,是則播放爆炸消失效果。

    10.3969/j.issn.1001-8972.2011.16.138

    猜你喜歡
    碰撞檢測敵機(jī)子彈
    沖著敵機(jī),開炮!——M1939式37毫米高射炮
    全新預(yù)測碰撞檢測系統(tǒng)
    基于BIM的鐵路信號室外設(shè)備布置與碰撞檢測方法
    三顆子彈
    子彈VS防彈
    Karma:讓子彈飛一會兒
    汽車觀察(2019年2期)2019-03-15 06:00:20
    Unity3D中碰撞檢測問題的研究
    電子測試(2018年1期)2018-04-18 11:53:00
    子彈
    新中國建國后擊落入侵?jǐn)硻C(jī)大盤點(diǎn)
    BIM技術(shù)下的某辦公樓項(xiàng)目管線碰撞檢測
    汉沽区| 钟祥市| 吐鲁番市| 故城县| 衡山县| 平遥县| 兴化市| 吉林省| 江山市| 桐庐县| 雷山县| 屏山县| 津南区| 定西市| 游戏| 宜川县| 陕西省| 乐山市| 沙雅县| 民勤县| 府谷县| 松潘县| 白朗县| 游戏| 靖安县| 合山市| 怀仁县| 仪征市| 宁都县| 亳州市| 宁化县| 含山县| 竹溪县| 渝中区| 连平县| 江门市| 新乡市| 宁都县| 济源市| 望江县| 宣武区|