作者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
1F:推 p52189:是包个外框给它撞的意思? 12/04 07:33
2F:推 p52189:如果这个刚好卡住物件形状的外框没有碰到 就不用检查 是 12/04 07:41
3F:→ p52189:这样吗@@? 12/04 07:41
4F:→ cjcat2266:是的 12/04 07:54
5F:→ hirabbitt:感谢 因为我之前有用过MovieClip(root)["物件名"].属性 12/04 21:59
6F:→ hirabbitt:就以为有名字的物件都可以用阵列型式表示... 12/04 22:00
7F:→ cjcat2266:这个syntax叫做associative array,可以Google一下详情 12/05 06:43