什么';测试玩家是否点击了Java游戏中多个对象中的一个是一种有效的方法?

什么';测试玩家是否点击了Java游戏中多个对象中的一个是一种有效的方法?,java,Java,这是一个基本的问题,但由于我已经很久没有编写Java代码了,我想从有更多经验的人那里得到一个意见。假设我有一个Java游戏,其中屏幕上有许多对象(大约30个)。玩家可以点击一个对象,每个对象处理鼠标点击的方式不同 我的问题是:如果玩家点击游戏窗口,有什么好方法来测试他是否点击了其中一个对象,如果是,触发该对象的鼠标点击事件处理程序 到目前为止,我想到的是:我的小程序有一个鼠标侦听器,它还可以有一个当前存在的所有游戏对象的列表。小程序的事件处理程序可以遍历对象列表,并通过类似于gameObject

这是一个基本的问题,但由于我已经很久没有编写Java代码了,我想从有更多经验的人那里得到一个意见。假设我有一个Java游戏,其中屏幕上有许多对象(大约30个)。玩家可以点击一个对象,每个对象处理鼠标点击的方式不同

我的问题是:如果玩家点击游戏窗口,有什么好方法来测试他是否点击了其中一个对象,如果是,触发该对象的鼠标点击事件处理程序

到目前为止,我想到的是:我的小程序有一个鼠标侦听器,它还可以有一个当前存在的所有游戏对象的列表。小程序的事件处理程序可以遍历对象列表,并通过类似于
gameObject.isInsideBBox(int-mouseX,int-mouseY)
的方式查看单击的坐标是否在该对象的边界框内

这将是简单的设置,但我觉得这将是低效的。如果对象的数量很大,那么每次用户单击时程序都必须遍历列表。这难道不能成为性能问题吗

另一种方法是让每个对象都有自己的MouseListener,并将所有对象添加到某种全局容器中。这种方法在性能方面是否比上述方法更有效?另一个问题是,这些组件和容器对象似乎是在Java的Swing库中定义的,但我不会将Swing用于任何其他目的。我觉得这是对图书馆的滥用

有什么反馈/意见吗


(我很想知道这些方法是否可以移植到Android上。我知道这是另一个话题,但如果您对此有任何见解,如果您能让我知道,我将不胜感激。)

屏幕上的30个对象足够少,不应该太重要。一个简单的线性搜索应该仍然足够快。唯一的真正原因是要考虑优化,如果“30”可能是关闭的,你真的处理(说)1000 +对象。 在这种情况下,一种简单的可能性是按一个维度对对象进行排序,这样就可以在该维度上进行二进制搜索。这应该只剩下几个对象在其中搜索,以在另一个方向上找到正确的值

每个对象处理鼠标单击的方式不同

每个对象都有自己的鼠标侦听器


考虑到需求,这听起来是一个很好的解决方案。

正如@Jerry Coffin所说,对于少量对象,线性搜索应该很好

对于大量对象,线性搜索的缩放效果很差

  • 如果对象是静止的,您可以将屏幕划分为区域层次;e、 并将每个对象放置到叶区域中。这样可以减少需要检查的对象数量

  • 如果物体移动很快,我认为四叉树不起作用。每次移动对象时,都需要重新计算其在四叉树中的位置,这是非常昂贵的

  • 对于缓慢移动的对象,四叉树可能会起作用,前提是每个对象都知道它当前所在的四叉树区域。(检查对象是否仍在区域中,即
    O(1)


如果游戏对象派生自实现接口的类,则使用
conatains()
方法之一就足够了。这可以使用线性搜索处理数千个对象。

+1用于层次空间分解技术(四叉树和类似技术)。我想补充的是,这些对很多其他事情都很有用(例如渲染、碰撞检测)。