作者QQ29 (我爱阿蓉)
看板GameDesign
标题[程式] 游戏中hit Test的方法
时间Thu May 13 15:34:40 2010
我现在HitTest 是针对每个 物体 自己去判断有没有被hit到
我会for的方式去呼叫 每个物体的Update函式
物体.Update()
{
HitTest();
}
但现在问题是
如果被遮挡 我两个都会侦测到
假如A 挡着 B 点到的话 都会反白
这时我点A 但是B也跟着 反白(反白这件事 是在hit test时 作的动作)
这是错的
变成说 我现在想改成 从近的Z 往远的开始做Update
所以先hit到的一定是近的 远的就不做hittest了
但这又有个问题
如果A 和 B 都会转动 有可能动态 B会跑到A上面...........我总不可能动态得知
哪个区域在前面(可能只有某部分overlap)
所以原本想说从 远判断到近 就不可行了............
有没有什麽关於这问题的演算法可以参考.....
实在是自己想不到什麽好方法
=========================================
我自己想到暴力的方法是...
UpdateAllObject()
{
global List(大小为多少个object)里面所有的distance先设为 负值
for (每个物体i)
{
物体.Update();
//在HitTest时 我会用一个global的List去记录 hit到的distance 记录在[i]
//这时先不去做反白的动作
}
当上面for做完 我就会记录下 所有物体i 所hit到的distance (没hit到维持负值)
for(扫描所有distance值)
{
找出最小distance 看是第几个i
}
上面for做完 我就得到真正hit到的是哪个物体........
再把反白的动作 抽到这里去做
}
但感觉超暴力 我每个frame都呼叫UpdateAllObject()
并且去清空list 并请作一些for的动作
上面方法也是可以改成 每次hittest到的distance都判断和前一个哪个近 近的再留下
这样for完 就直接得到最近的物体了
再去做反白的动作
以上是我想到的方法 不知道有没有更有效率的方式来做到呢
谢谢
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 219.87.64.222
1F:推 cowbaying:请使用轻薄的假象 05/13 17:09
2F:推 KanoLoa:是我没看懂还是? 为什麽不加个前後属性来判断谁压谁? 05/13 18:44
3F:推 leondemon:可以google "hit test iphone" 参考Apple作法... 05/13 22:51