第10章碰撞檢測(cè)_第1頁(yè)
第10章碰撞檢測(cè)_第2頁(yè)
第10章碰撞檢測(cè)_第3頁(yè)
第10章碰撞檢測(cè)_第4頁(yè)
第10章碰撞檢測(cè)_第5頁(yè)
已閱讀5頁(yè),還剩15頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論