作者cjcat2266 (CJ Cat)
看板Flash
標題Re: [問題] 想知道MC碰到哪個MC但不用LOOP?
時間Sun Dec 4 06:43:09 2011
: 推 cjcat2266:你的目的是要讓code乾淨點還是要增進效能? 12/03 02:01
: → hirabbitt:CODE乾淨點@@ 12/03 02:28
: → hirabbitt:應該是想讓我的腦袋乾淨點QQ 12/03 02:29
: for (var allMC in MovieClip(root)){
: //hit test
: }
: 裡面通通都是undefind耶
: 難道不能這樣用?
基本上,碰撞偵測絕對無法避免使用迴圈的,要先認清這個事實
因為要偵測碰撞,一定要某些程度上"檢查所有可能碰撞的物件"
如果純粹是要"視覺上"讓code乾淨點
目前大部分的編輯器都可以把大括弧內的code"折疊"起來
不然就是把迴圈的部分refactor成另外一個function
如果是要增進效能,可以搜尋關鍵字broad phase
基本上就是用比較有效率的方法,篩選掉"不可能碰撞"的物件
最簡單的就是使用Axis-Aligned Bounding Box (AABB)
如果兩個物件的AABB沒有碰撞,那他們就不可能碰撞
另外一個常見的簡易broad phase是sweep and prune
在X軸和Y軸上面維持每個物件的min和max座標清單排序
然後從小而大逐一檢視物件
for (i = 0 to length(sortedObjectsX))
{
for (j = i + 1 to length(sortedObjectsX))
{
if (sortedObjects[i].maxX < sortedObjects[j].minX) break;
else hitTest(sortedObjects[i], sortedObjects[j]);
}
}
//repeat for Y axis (and Z in 3D)
還有,for...in statement不是這樣用的
for...in可用在以下狀況
1. 逐一索取dynamic object的dynamic variable名稱字串
for (var s:String in myObject) trace(myObject[s]);
2. 逐一索取Dictionary物件的key
for (var key:* in dictionary) trace(dictionary[key]);
絕非你想像的那麼方便,可以索取所有MovieClip這樣
解決方法就是把你要索取的MC全部存到一個Array、list或Dictionary裡面
--
Blog
http://blog.cjcat.net
Gallery
http://cjcat2266.deviantart.com
ptt2 Board CJWorkshop
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 67.168.100.223
推 p52189:是包個外框給它撞的意思? 12/04 07:33
推 p52189:如果這個剛好卡住物件形狀的外框沒有碰到 就不用檢查 是 12/04 07:41
→ p52189:這樣嗎@@? 12/04 07:41
→ cjcat2266:是的 12/04 07:54
→ hirabbitt:感謝 因為我之前有用過MovieClip(root)["物件名"].屬性 12/04 21:59
→ hirabbitt:就以為有名字的物件都可以用陣列型式表示... 12/04 22:00
→ cjcat2266:這個syntax叫做associative array,可以Google一下詳情 12/05 06:43