检测游戏中被触摸物体的有效方法?

时间:2011-07-28 22:45:15

标签: java algorithm

因此,想象一下类似于模拟人生的2D游戏,用于基于触摸的手机,可以与场景中的任何物体进行交互。

如何有效地检测播放器正在触摸哪个对象?

在我的短暂体验中,循环遍历场景中的所有可见对象并检查它们是否被触摸到目前为止完成了这项工作,但是当屏幕中可能有许多移动物体听起来效率低下时是吗?保持可见的移动对象列表本身会消耗时间,因为每个帧都可能需要遍历所有这些时间。

我认为的其他解决方案是:

  • 空间散列。将屏幕划分为网格,并将可见对象放在相应的存储桶中。对被点击对象的检测很快,但是每帧都将对象放在正确的桶中会产生额外的开销。

  • 维护四叉树。移动对象必须一直重新排列,之前的解决方案看起来更好。

在这种情况下通常会做什么?

很多。

3 个答案:

答案 0 :(得分:2)

我会推荐Java Box2D

等引擎

其中包含许多功能,包括碰撞检测。

答案 1 :(得分:2)

首先要考虑的是加速方法是否真的对您的情况有所帮助。例如,如果每帧只有一个查询,则当前方法需要检查每个对象一次。但是,如果所有对象都在移动,几乎所有加速结构都需要更新一次对象 - 所以,在这种情况下,为什么要这么麻烦呢?

如果您确定实际需要加速结构,那么您的解决方案似乎都是合理的:

  • 对于触控界面,您知道查询的大小。因此,如果您的所有对象都是触摸或更小的对象,则空间散列应该是一个很好的解决方案。
  • 如果您的对象可能很大,请注意空间散列可能需要将大对象添加到许多散列桶中。在这种情况下,四叉树可能是一个更好的主意。

另一种解决方案是维护一个包围框的树。有多种算法可以使用它;一个特别是R-tree

答案 2 :(得分:1)

如果您只具有单点触控功能(即一次只能触摸一个对象),则可以使用OnTouch事件通过触摸的对象更新全局参考。

如果有很多,我想你可以有一个列表,你可以在触摸进入/离开对象时添加/删除对象。