版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第10章碰撞檢測10.1什么是碰撞檢測10.2Flash現(xiàn)成的碰撞檢測方法10.3像素級碰撞檢測方法10.1什么是碰撞檢測在Flash互動設(shè)計(jì)中,特別是在Flash游戲設(shè)計(jì)制作中,需要知道兩個(gè)或多個(gè)影片剪輯是否重疊或相交,如運(yùn)動的炮彈碰到物體發(fā)生爆炸,兩輛汽車發(fā)生碰撞產(chǎn)生翻車效果等。要想創(chuàng)建這種類型的交互對象,首先需要使用一種方法,來判斷一個(gè)對象是否與另一個(gè)對象接觸,這種方法叫碰撞檢測。10.2Flash現(xiàn)成的碰撞檢測方法FlashAS3.0中有兩種現(xiàn)成的碰撞檢測方法:一、hitTestObject方法二、hitTestPoint方法4
一、hitTestObject方法
可以用來檢測任意兩個(gè)顯示對象DisplayObject是否發(fā)生碰撞。格式如下:
publicfunctionhitTestObject(obj:DisplayObject):Boolean
調(diào)用這個(gè)函數(shù)作為影片剪輯的方法,將另一個(gè)影片剪輯
的引用作為參數(shù)傳入。通常在if語句中使用:
if(DisplayObject1.hitTestObject(DisplayObject2)){//碰撞后的動作}5
二、hitTestPoint方法
判斷某個(gè)點(diǎn)與顯示對象間是否發(fā)生了碰撞,可以使用顯示對象DisplayObject的hitTestPoint方法。格式如下:
publicfunctionhitTestPoint(x:Number,y:Number):Boolean
計(jì)算顯示對象,以確定它是否與x和y參數(shù)指定的點(diǎn)重疊或相交。
x和y參數(shù)指定舞臺的坐標(biāo)空間中的點(diǎn)。6實(shí)例制作1-碰花游戲
本項(xiàng)目是當(dāng)鼠標(biāo)碰觸到舞臺中隨機(jī)分布的五彩花朵,花朵會立即“躲開”到別處。
制作思路:
通過復(fù)制庫的花元件在舞臺顯示多只花,并且需要為舞臺注冊偵聽鼠標(biāo)移動事件,在鼠標(biāo)移動事件處理函數(shù)中逐一判斷舞臺上的花是否鼠標(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)來控制箭的移動,當(dāng)松開鼠標(biāo)的時(shí)候,將箭發(fā)射出去,如果發(fā)出的箭刺中花朵,則花朵播放一段花朵刺中的動畫,箭不管刺中花朵與否,最終都會減速飛出舞臺上方。
制作思路:
通過復(fù)制庫的花元件在舞臺顯示多只花,并且這些花的位置、大小和顏色都是隨機(jī)的。鼠標(biāo)按下弓箭時(shí),生成一只箭的影片剪輯實(shí)例,這只箭在響應(yīng)自身的進(jìn)入幀事件時(shí)不斷減少Y軸坐標(biāo),同時(shí)逐一判斷是否與舞臺上的花進(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);//弓箭可以被拖動bow_mc.addEventListener(MouseEvent.MOUSE_DOWN,playAllow);//如果弓箭被按下,則播放bow_mc影片剪輯中的拉弓動作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像素級碰撞檢測方法Flash現(xiàn)成的碰撞檢測方法雖然簡單,但是精確度比較低,因?yàn)檫@種檢測方法,是以影片的矩形邊界來判斷的,而不是以影片內(nèi)圖形的實(shí)際可見像素判斷,誤差比較大,應(yīng)用起來有一定的局限性。
在游戲、用戶界面和很多應(yīng)用程序類型中,時(shí)常需要精確度更高的像素級別的碰撞檢測,檢測的精確度越高,則實(shí)現(xiàn)起來就越復(fù)雜。
Flash沒有提供像素級別的檢測方法,這就需要我們自定義函數(shù)來實(shí)現(xiàn)像素級別的碰撞檢測方法。
像素級碰撞檢測基本思路:
將要檢測的顯示對象DisplayObject轉(zhuǎn)化為BitmapData,
然后用其內(nèi)置的hitTest方法檢測是否發(fā)生碰撞。
如下就是一個(gè)自定義的第三方像素級碰撞檢測方法hitTestPixel(shape1:DisplayObject,shape2:DisplayObject),
該方法用于檢測兩個(gè)顯示對象是否發(fā)生像素級碰撞,如果發(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頁/共152頁17實(shí)例制作-形狀認(rèn)知游戲
舞臺下方放置的物體形狀與灰色的物體形狀之間一一對應(yīng),如果用鼠標(biāo)拖動下方的物體形狀與對應(yīng)的灰色物體形狀發(fā)生了碰撞,則吸附在一起,且大小一致。否則拖動的物體形狀返回原處。制作思路:
利用鼠標(biāo)拖曳對象功能和碰撞檢測實(shí)現(xiàn)形狀認(rèn)知游戲,當(dāng)鼠標(biāo)按下的時(shí)候,讓影片剪輯可以被拖曳,當(dāng)鼠標(biāo)被放開的時(shí)候,讓影片剪輯停止被拖曳,如果此時(shí)拖曳的影片剪輯對象與特定拖目標(biāo)進(jìn)行了像素級碰撞,則自動將拖曳的影片剪輯吸附重疊在一起。否則被拖曳的對象自動返回原處。案例效果for(vari:uint=1;i<=8;i++){ varpicture_mc:MovieClip=this.getChildByName("t"+i+"_mc")asMovieClip; //監(jiān)聽鼠標(biāo)按下事件
picture_mc.addEventListener(MouseEvent.MOUSE_DOWN,downHandle); //監(jiān)聽鼠標(biāo)放開事件
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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年幼兒園后勤工作補(bǔ)充計(jì)劃
- 研學(xué)旅游合同管理辦法
- 音樂會現(xiàn)場廣告牌租賃合同范本
- 高爐建設(shè)材料供應(yīng)合同
- 武漢市計(jì)劃生育政策建筑行業(yè)實(shí)施
- 餐飲用地預(yù)審管理辦法
- 水毀河道疏浚施工合同
- 公園道路修補(bǔ)合同
- 2025年專用儀器儀表:化工儀表項(xiàng)目申請報(bào)告模范
- 2025年濾波型無功補(bǔ)償裝置項(xiàng)目申請報(bào)告模板
- 體檢營銷話術(shù)與技巧培訓(xùn)
- TSG 07-2019電梯安裝修理維護(hù)質(zhì)量保證手冊程序文件制度文件表單一整套
- 養(yǎng)殖場巡查制度模板
- 建設(shè)工程造價(jià)案例分析-形成性考核2(占形考總分25%)-國開(SC)-參考資料
- 《期貨市場發(fā)展之》課件
- 酒店旅游業(yè)OTA平臺整合營銷推廣策略
- 淋巴水腫康復(fù)治療技術(shù)
- 2024年國家公務(wù)員考試《申論》真題(副省級)及參考答案
- 零星維修工程 投標(biāo)方案(技術(shù)方案)
- 10KV電力配電工程施工方案
- 茶葉采購合同范本電子版
評論
0/150
提交評論