版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第10章碰撞檢測(cè)10.1什么是碰撞檢測(cè)10.2Flash現(xiàn)成的碰撞檢測(cè)方法10.3像素級(jí)碰撞檢測(cè)方法10.1什么是碰撞檢測(cè)在Flash互動(dòng)設(shè)計(jì)中,特別是在Flash游戲設(shè)計(jì)制作中,需要知道兩個(gè)或多個(gè)影片剪輯是否重疊或相交,如運(yùn)動(dòng)的炮彈碰到物體發(fā)生爆炸,兩輛汽車發(fā)生碰撞產(chǎn)生翻車效果等。要想創(chuàng)建這種類型的交互對(duì)象,首先需要使用一種方法,來(lái)判斷一個(gè)對(duì)象是否與另一個(gè)對(duì)象接觸,這種方法叫碰撞檢測(cè)。10.2Flash現(xiàn)成的碰撞檢測(cè)方法FlashAS3.0中有兩種現(xiàn)成的碰撞檢測(cè)方法:一、hitTestObject方法二、hitTestPoint方法4
一、hitTestObject方法
可以用來(lái)檢測(cè)任意兩個(gè)顯示對(duì)象DisplayObject是否發(fā)生碰撞。格式如下:
publicfunctionhitTestObject(obj:DisplayObject):Boolean
調(diào)用這個(gè)函數(shù)作為影片剪輯的方法,將另一個(gè)影片剪輯
的引用作為參數(shù)傳入。通常在if語(yǔ)句中使用:
if(DisplayObject1.hitTestObject(DisplayObject2)){//碰撞后的動(dòng)作}5
二、hitTestPoint方法
判斷某個(gè)點(diǎn)與顯示對(duì)象間是否發(fā)生了碰撞,可以使用顯示對(duì)象DisplayObject的hitTestPoint方法。格式如下:
publicfunctionhitTestPoint(x:Number,y:Number):Boolean
計(jì)算顯示對(duì)象,以確定它是否與x和y參數(shù)指定的點(diǎn)重疊或相交。
x和y參數(shù)指定舞臺(tái)的坐標(biāo)空間中的點(diǎn)。6實(shí)例制作1-碰花游戲
本項(xiàng)目是當(dāng)鼠標(biāo)碰觸到舞臺(tái)中隨機(jī)分布的五彩花朵,花朵會(huì)立即“躲開(kāi)”到別處。
制作思路:
通過(guò)復(fù)制庫(kù)的花元件在舞臺(tái)顯示多只花,并且需要為舞臺(tái)注冊(cè)偵聽(tīng)鼠標(biāo)移動(dòng)事件,在鼠標(biāo)移動(dòng)事件處理函數(shù)中逐一判斷舞臺(tái)上的花是否鼠標(biāo)光標(biāo)發(fā)生碰撞,如果是,則改變此花位置。
案例效果vari:uint=0;while(i<10){ varflower_mc:Flower=newFlower(); this.addChild(flower_mc); flower_mc.x=Math.random()*(stage.stageWidth-flower_mc.width/2); flower_mc.y=Math.random()*(stage.stageHeight-flower_mc.height/2); flower_mc.scaleX=flower_mc.scaleY=0.6+Math.random()*0.4;
i=i+1;}this.addEventListener(MouseEvent.MOUSE_MOVE,moveHandle);functionmoveHandle(e:MouseEvent){ varj:uint=0; while(j<10){ if(this.getChildAt(j).hitTestPoint(this.mouseX,this.mouseY)){ this.getChildAt(j).x=Math.random()*stage.stageWidth; this.getChildAt(j).y=Math.random()*stage.stageHeight; this.getChildAt(j).alpha=Math.random();this.getChildAt(j).scaleX=this.getChildAt(j).scaleY=Math.random(); } j=j+1; }}9實(shí)例制作2-射箭游戲
用鼠標(biāo)來(lái)控制箭的移動(dòng),當(dāng)松開(kāi)鼠標(biāo)的時(shí)候,將箭發(fā)射出去,如果發(fā)出的箭刺中花朵,則花朵播放一段花朵刺中的動(dòng)畫(huà),箭不管刺中花朵與否,最終都會(huì)減速飛出舞臺(tái)上方。
制作思路:
通過(guò)復(fù)制庫(kù)的花元件在舞臺(tái)顯示多只花,并且這些花的位置、大小和顏色都是隨機(jī)的。鼠標(biāo)按下弓箭時(shí),生成一只箭的影片剪輯實(shí)例,這只箭在響應(yīng)自身的進(jìn)入幀事件時(shí)不斷減少Y軸坐標(biāo),同時(shí)逐一判斷是否與舞臺(tái)上的花進(jìn)行了碰撞。案例效果for(vari:uint=0;i<10;i++){ varf_mc:Flower=newFlower(); this.addChild(f_mc); f_mc.x=Math.random()*(this.stage.stageWidth-f_mc.width)+f_mc.width/2; f_mc.y=Math.random()*(this.stage.stageHeight-f_mc.height)+f_mc.height/2; f_mc.scaleX=f_mc.scaleY=Math.random()*0.1+0.2;f_="flow_"+i;}bow_mc.stop();//弓箭影片剪輯停止在第1幀bow_mc.startDrag(true);//弓箭可以被拖動(dòng)bow_mc.addEventListener(MouseEvent.MOUSE_DOWN,playAllow);//如果弓箭被按下,則播放bow_mc影片剪輯中的拉弓動(dòng)作functionplayAllow(e:MouseEvent){ bow_mc.gotoAndPlay(1);}//鼠標(biāo)釋放之后送出箭頭bow_mc.addEventListener(MouseEvent.MOUSE_UP,createAllow);functioncreateAllow(e:MouseEvent){ vararrow_mc:Arrow=newArrow(); arrow_mc.scaleX=0.3; arrow_mc.scaleY=0.3; arrow_mc.x=this.mouseX; arrow_mc.y=this.mouseY; this.addChild(arrow_mc); arrow_mc.addEventListener(Event.ENTER_FRAME,flyAllow); arrow_mc.flySpeed=12;//設(shè)定弓箭的初始速度}functionflyAllow(e:Event):void{ varmoveArrow:Arrow=e.targetasArrow; moveArrow.flySpeed=moveArrow.flySpeed*0.98;//由于地球引力的緣故,飛行速度逐漸減慢
moveArrow.y-=moveArrow.flySpeed; for(varj:uint=0;j<10;j++){ if(this.getChildByName("flow_"+j).hitTestObject(moveArrow)){ this.getChildByName("flow_"+j).x=-this.getChildByName("flow_"+j).width; this.getChildByName("flow_"+j).y=-this.getChildByName("flow_"+j).height; break; } } if(moveArrow.y<=-moveArrow.height){ moveArrow.removeEventListener(Event.ENTER_FRAME,flyAllow); this.removeChild(moveArrow); }}10.3像素級(jí)碰撞檢測(cè)方法Flash現(xiàn)成的碰撞檢測(cè)方法雖然簡(jiǎn)單,但是精確度比較低,因?yàn)檫@種檢測(cè)方法,是以影片的矩形邊界來(lái)判斷的,而不是以影片內(nèi)圖形的實(shí)際可見(jiàn)像素判斷,誤差比較大,應(yīng)用起來(lái)有一定的局限性。
在游戲、用戶界面和很多應(yīng)用程序類型中,時(shí)常需要精確度更高的像素級(jí)別的碰撞檢測(cè),檢測(cè)的精確度越高,則實(shí)現(xiàn)起來(lái)就越復(fù)雜。
Flash沒(méi)有提供像素級(jí)別的檢測(cè)方法,這就需要我們自定義函數(shù)來(lái)實(shí)現(xiàn)像素級(jí)別的碰撞檢測(cè)方法。
像素級(jí)碰撞檢測(cè)基本思路:
將要檢測(cè)的顯示對(duì)象DisplayObject轉(zhuǎn)化為BitmapData,
然后用其內(nèi)置的hitTest方法檢測(cè)是否發(fā)生碰撞。
如下就是一個(gè)自定義的第三方像素級(jí)碰撞檢測(cè)方法hitTestPixel(shape1:DisplayObject,shape2:DisplayObject),
該方法用于檢測(cè)兩個(gè)顯示對(duì)象是否發(fā)生像素級(jí)碰撞,如果發(fā)生碰撞則返回true,否則返回false。
函數(shù)實(shí)現(xiàn)代碼如下:functionhitTestPixel(shape1:DisplayObject,shape2:DisplayObject):Boolean{ vars1x:Number=shape1.getRect(shape1).x; vars1y:Number=shape1.getRect(shape1).y; vars2x:Number=shape2.getRect(shape2).x; vars2y:Number=shape2.getRect(shape2).y; vars1w:Number=shape1.width; vars1h:Number=shape1.height; vars2w:Number=shape2.width; vars2h:Number=shape2.height; s1w=s1w<1?1:s1w; s1h=s1h<1?1:s1h; s2w=s2w<1?1:s2w; s2h=s2h<1?1:s2h; varBmpData1:BitmapData=newBitmapData(s1w,s1h,true,0x00000000); varBmpData2:BitmapData=newBitmapData(s2w,s2h,true,0x00000000); BmpData1.draw(shape1,newMatrix(1,0,0,1,-s1x,-s1y)); BmpData2.draw(shape2,newMatrix(1,0,0,1,-s2x,-s2y)); vargp1:Point=shape1.localToGlobal(newPoint(s1x,s1y)); vargp2:Point=shape2.localToGlobal(newPoint(s2x,s2y)); varisHit:Boolean=BmpData1.hitTest(gp1,0x05,BmpData2,gp2,0x05); BmpData1.dispose(); BmpData2.dispose(); returnisHit;}第17頁(yè)/共152頁(yè)17實(shí)例制作-形狀認(rèn)知游戲
舞臺(tái)下方放置的物體形狀與灰色的物體形狀之間一一對(duì)應(yīng),如果用鼠標(biāo)拖動(dòng)下方的物體形狀與對(duì)應(yīng)的灰色物體形狀發(fā)生了碰撞,則吸附在一起,且大小一致。否則拖動(dòng)的物體形狀返回原處。制作思路:
利用鼠標(biāo)拖曳對(duì)象功能和碰撞檢測(cè)實(shí)現(xiàn)形狀認(rèn)知游戲,當(dāng)鼠標(biāo)按下的時(shí)候,讓影片剪輯可以被拖曳,當(dāng)鼠標(biāo)被放開(kāi)的時(shí)候,讓影片剪輯停止被拖曳,如果此時(shí)拖曳的影片剪輯對(duì)象與特定拖目標(biāo)進(jìn)行了像素級(jí)碰撞,則自動(dòng)將拖曳的影片剪輯吸附重疊在一起。否則被拖曳的對(duì)象自動(dòng)返回原處。案例效果for(vari:uint=1;i<=8;i++){ varpicture_mc:MovieClip=this.getChildByName("t"+i+"_mc")asMovieClip; //監(jiān)聽(tīng)鼠標(biāo)按下事件
picture_mc.addEventListener(MouseEvent.MOUSE_DOWN,downHandle); //監(jiān)聽(tīng)鼠標(biāo)放開(kāi)事件
picture_mc.addEventListener(MouseEvent.MOUSE_UP,upHandle);
}functiondownHandle(e:MouseEvent):void{ //記錄下原始位置以便匹配不成功時(shí)可以返回去
e.target.startX=e.target.x; e.target.startY=e.target.y; e.target.startDrag(true);}functionupHandle(e:MouseEvent):void{ vartarget_mc:MovieClip=e.targetasMovieClip; targe
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 沈陽(yáng)理工大學(xué)《材料工程測(cè)試技術(shù)》2021-2022學(xué)年第一學(xué)期期末試卷
- 光伏組件銷售合同范本
- 果園分包合同書(shū)模板
- 合同編第十九條法條解讀
- 2024上海市電視廣播廣告發(fā)布合同(示范文本版)
- 2024化妝品品牌加盟合同
- 2024建筑委托合同協(xié)議
- 沈陽(yáng)理工大學(xué)《Java程序設(shè)計(jì)基礎(chǔ)》2021-2022學(xué)年期末試卷
- 2024表演場(chǎng)地租賃合同范本
- 2024開(kāi)店雙方入股合同協(xié)議范文
- 中國(guó)濕疹診療指南
- LTC流程介紹完整版
- 飼料加工系統(tǒng)粉塵防爆安全規(guī)程
- 一年級(jí)上冊(cè)美術(shù)課件-第11課-花兒寄深情-▏人教新課標(biāo)
- 植物的象征意義
- 夏商周考古課件 第5章 西周文化(1、2節(jié))
- 二年級(jí)上冊(cè)美術(shù)教案-7. 去遠(yuǎn)航 -冀教版
- 裝配圖畫(huà)法及要求課件
- 翻譯實(shí)習(xí)教學(xué)大綱
- 心力衰竭-英文版課件
- 邀請(qǐng)回國(guó)探親邀請(qǐng)函范本
評(píng)論
0/150
提交評(píng)論