版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第10章碰撞檢測10.1什么是碰撞檢測10.2Flash現(xiàn)成的碰撞檢測方法10.3像素級碰撞檢測方法10.1什么是碰撞檢測在Flash互動設(shè)計中,特別是在Flash游戲設(shè)計制作中,需要知道兩個或多個影片剪輯是否重疊或相交,如運動的炮彈碰到物體發(fā)生爆炸,兩輛汽車發(fā)生碰撞產(chǎn)生翻車效果等。要想創(chuàng)建這種類型的交互對象,首先需要使用一種方法,來判斷一個對象是否與另一個對象接觸,這種方法叫碰撞檢測。10.2Flash現(xiàn)成的碰撞檢測方法FlashAS3.0中有兩種現(xiàn)成的碰撞檢測方法:一、hitTestObject方法二、hitTestPoint方法4
一、hitTestObject方法
可以用來檢測任意兩個顯示對象DisplayObject是否發(fā)生碰撞。格式如下:
publicfunctionhitTestObject(obj:DisplayObject):Boolean
調(diào)用這個函數(shù)作為影片剪輯的方法,將另一個影片剪輯
的引用作為參數(shù)傳入。通常在if語句中使用:
if(DisplayObject1.hitTestObject(DisplayObject2)){//碰撞后的動作}5
二、hitTestPoint方法
判斷某個點與顯示對象間是否發(fā)生了碰撞,可以使用顯示對象DisplayObject的hitTestPoint方法。格式如下:
publicfunctionhitTestPoint(x:Number,y:Number):Boolean
計算顯示對象,以確定它是否與x和y參數(shù)指定的點重疊或相交。
x和y參數(shù)指定舞臺的坐標空間中的點。6實例制作1-碰花游戲
本項目是當鼠標碰觸到舞臺中隨機分布的五彩花朵,花朵會立即“躲開”到別處。
制作思路:
通過復制庫的花元件在舞臺顯示多只花,并且需要為舞臺注冊偵聽鼠標移動事件,在鼠標移動事件處理函數(shù)中逐一判斷舞臺上的花是否鼠標光標發(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實例制作2-射箭游戲
用鼠標來控制箭的移動,當松開鼠標的時候,將箭發(fā)射出去,如果發(fā)出的箭刺中花朵,則花朵播放一段花朵刺中的動畫,箭不管刺中花朵與否,最終都會減速飛出舞臺上方。
制作思路:
通過復制庫的花元件在舞臺顯示多只花,并且這些花的位置、大小和顏色都是隨機的。鼠標按下弓箭時,生成一只箭的影片剪輯實例,這只箭在響應自身的進入幀事件時不斷減少Y軸坐標,同時逐一判斷是否與舞臺上的花進行了碰撞。案例效果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);}//鼠標釋放之后送出箭頭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)成的碰撞檢測方法雖然簡單,但是精確度比較低,因為這種檢測方法,是以影片的矩形邊界來判斷的,而不是以影片內(nèi)圖形的實際可見像素判斷,誤差比較大,應用起來有一定的局限性。
在游戲、用戶界面和很多應用程序類型中,時常需要精確度更高的像素級別的碰撞檢測,檢測的精確度越高,則實現(xiàn)起來就越復雜。
Flash沒有提供像素級別的檢測方法,這就需要我們自定義函數(shù)來實現(xiàn)像素級別的碰撞檢測方法。
像素級碰撞檢測基本思路:
將要檢測的顯示對象DisplayObject轉(zhuǎn)化為BitmapData,
然后用其內(nèi)置的hitTest方法檢測是否發(fā)生碰撞。
如下就是一個自定義的第三方像素級碰撞檢測方法hitTestPixel(shape1:DisplayObject,shape2:DisplayObject),
該方法用于檢測兩個顯示對象是否發(fā)生像素級碰撞,如果發(fā)生碰撞則返回true,否則返回false。
函數(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實例制作-形狀認知游戲
舞臺下方放置的物體形狀與灰色的物體形狀之間一一對應,如果用鼠標拖動下方的物體形狀與對應的灰色物體形狀發(fā)生了碰撞,則吸附在一起,且大小一致。否則拖動的物體形狀返回原處。制作思路:
利用鼠標拖曳對象功能和碰撞檢測實現(xiàn)形狀認知游戲,當鼠標按下的時候,讓影片剪輯可以被拖曳,當鼠標被放開的時候,讓影片剪輯停止被拖曳,如果此時拖曳的影片剪輯對象與特定拖目標進行了像素級碰撞,則自動將拖曳的影片剪輯吸附重疊在一起。否則被拖曳的對象自動返回原處。案例效果for(vari:uint=1;i<=8;i++){ varpicture_mc:MovieClip=this.getChildByName("t"+i+"_mc")asMovieClip; //監(jiān)聽鼠標按下事件
picture_mc.addEventListener(MouseEvent.MOUSE_DOWN,downHandle); //監(jiān)聽鼠標放開事件
picture_mc.addEventListener(MouseEvent.MOUSE_UP,upHandle);
}functiondownHandle(e:MouseEvent):void{ //記錄下原始位置以便匹配不成功時可以返回去
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)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 瓣葉對合修復手術(shù)的術(shù)后疼痛控制策略
- 游戲策劃崗位專業(yè)能力測試題庫及答案解析
- 廚師職業(yè)資格證考試烹飪技巧與菜品創(chuàng)新含答案
- 獨居糖尿病患者的智能監(jiān)護系統(tǒng)應用
- 外貿(mào)公司外貿(mào)業(yè)務(wù)員面試題與經(jīng)驗
- 深度解析(2026)GBT 19067.1-2003產(chǎn)品幾何量技術(shù)規(guī)范(GPS) 表面結(jié)構(gòu) 輪廓法 測量標準 第1部分實物測量標準
- 環(huán)境監(jiān)測技術(shù)人員面試題及操作指南
- 深度解析(2026)《GBT 18927-2002包裝容器 金屬輔件》
- 深度解析(2026)《GBT 18863-2002免燙紡織品》
- 特殊人群罕見病用藥的劑量調(diào)整策略
- 2025-2026學年八年級數(shù)學上冊人教版(2024)第17章 因式分解 單元測試·基礎(chǔ)卷
- 血透室護理組長競選
- 風水顧問聘請合同范本
- 2025年量子計算驅(qū)動的電力系統(tǒng)彈性提升-探索與展望報告-
- 廣東5年(2021-2025)高考生物真題分類匯編:專題05 遺傳的分子基礎(chǔ)及生物的變異與進化(原卷版)
- 盒馬鮮生促銷方案
- 2025年政府采購評審專家考試題庫含答案
- 云南中考英語5年(21-25)真題分類匯編-中考語篇題型 閱讀理解句子還原7選5
- 2025年廣西度三類人員(持b證人員)繼續(xù)教育網(wǎng)絡(luò)學習考試題目及答案
- 食品法律法規(guī)教學課件
- 掘進機維護保養(yǎng)課件
評論
0/150
提交評論