有没有人遇到使用getObjectsUnderPoint的副作用(包括性能问题)?

时间:2012-02-23 11:13:55

标签: actionscript-3 actionscript

在我对正在进行的游戏项目进行重大更改之前,我只是想听听其他人是否有人发现DisplayObject的getObjectsUnderPoint()函数存在任何问题?

更新 不仅仅是性能问题,还有使用它的任何其他限制(就像它没有检测到某些类型的UI元素一样(仅作为示例))

我的应用程序中有三层(等距游戏)

  • 背景 - 这只是一个停留在底部的背景,与游戏
  • 无关
  • 中间层 - 这是可玩区域,这里所有的游戏元素都将放置在这一层
  • 顶层 - 这是一个虚拟透明层,覆盖整个可播放区域,可中断所有鼠标事件。这是我想要使用getObjectsUnderPoint()
  • 的地方

因此,玩家想要点击元素,顶层将中断mouseevent,然后检查是否有放置的东西或只是简单的背景并采取适当的操作,如通知下面的对象。

这真的不需要这样做,因为我可以简单地为地图上直接放置的所有项目添加moues事件,但因为我会使用getObjectsUnderPoint()来检查项目下面是否有任何内容。

如果有人能解释这个功能是如何运作的,那么我就很容易做出决定。

2 个答案:

答案 0 :(得分:2)

但是有一个恼人的问题。我不知道他们是否修好了。至少它在10.1次。

如果你有一个容器并且你缩放它container.getObjectsUnderPoint会返回错误的结果。每时每刻。因此,在我需要的任何地方getObjectsUnderPoint,我必须从stage调用它才能获得正确的结果。

答案 1 :(得分:1)

这是一个不完整的功能。它返回鼠标下的图形对象,而不是所有潜在的鼠标目标,用于事件或交互目的。它实际上需要复杂的逻辑来检查getObjectsUnderPoint返回的数组以确定鼠标目标,因为相应的目标(如果您实际点击该点,Flash会选择一个)可能不在列表中。

首先,您必须反向检查对象数组,因为这些项目是按顺序排序的。您必须检查每个对象的整个父链,查找使用mouseChildren = false的父级,这将导致它拦截事件并成为目标。无论是否找到这样的对象,您到达的最终对象必须将其mouseEnabled属性设置为true,否则您必须跳过它并继续移动到数组中的下一个对象,例如,下一个sprite或在你最初检查的那个后面形成。在浏览列表时,您必须注意父项何时更改,此时您需要假设该公共父项的所有子项都将其mouseEnabled属性设置为false,在这种情况下,父项将成为下一个候选项。这实际上非常复杂,因为你是在自下而上的方法中倒退,使用从上到下生成的一组不完整的对象。

为了获得实际的潜在鼠标事件目标,与默认的调度逻辑一致...实际上更容易以自上而下的方式从舞台开始,并在深度优先搜索中向后遍历显示层次结构,检查mouseChildren确定是否需要进入子进程,并检查mouseEnabled是否为目标,否则进入容器的子进程并再次从后向前重复进程。这更准确,更完整,更直观。唯一的问题是你必须自己编写代码。