【问题标题】:Detect coordinates within a shape检测形状内的坐标
【发布时间】:2019-05-11 16:02:18
【问题描述】:

我的问题有两个部分,它们是相关的。我的界面上有一个奇怪的形状,如下图所示,我正在尝试在其边界内随机生成 MovieClip,但我很难找到一个好的方法。

问题 1:我可以运行 If 条件来检查 bitMapData.hitTest 以查看 MovieClip 是否在此形状内随机生成,如果它不是简单地使用一组新的随机数重试坐标。然而,有没有更好的方法?像只考虑形状内坐标的方法吗?一次会产生大量的 MC,所以我希望减轻负载,或者至少找到一种有效的方法来进行此计算。

问题 2:在此形状中生成的 MovieClip 最终将具有碰撞检测机制,当与之交互时会排斥自身。 有没有办法通过某种边界检测将它们包含在这个形状中?

如果它是一个正方形,我们可以很容易地通过快速检查所有 4 个边缘来包含它们,但对于这个形状则不行。目前我正在考虑再次使用 bitMapData.hitTest 来检测被击退后的越界,但是我怎么知道哪个 Point() 是这个形状最近的“边缘”以将 MC 返回到?

【问题讨论】:

  • 我不是真正处理这些东西的游戏开发人员,但我认为您提出的检查位图数据命中的解决方案可能必须成为可行的方法(尽管我很感兴趣看看是否有人为您提供了更高效的解决方案)。
  • 至于抓拍,那就更有趣了,我很好奇你会得到什么样的答案。一种选择(不会非常准确)是在设置目标位置之前检查它,如果它移动到边界之外,请将其保留在当前位置。你打算实现一个物理引擎来完成繁重的工作吗?
  • 我建议使用像 Box2D(有 AS3 库)这样的现成解决方案来设置碰撞和其他东西。碰撞物理学是一门高级学科,您不太可能花费 A LOT 的时间和精力在自己的解决方案上,并且永远无法接近现有解决方案所提供的功能。好吧,除非你对它有很好的理解,或者你的最终目标你自己的 2D 物理引擎。
  • 感谢大家的回复,我不知道 Box2D,所以这肯定是我对 qns2 的下一步。 Box2D 能够对那个奇怪的形状进行边界检测吗?我担心必须在该形状中包含影片剪辑。我没有在该主题上指定的一件事是对象本身不需要相互之间具有碰撞机制,而只是排斥我将从我的界面收到的输入值。例如。如果输入是 Point(30,30),我需要将 MovieClips 从 30,30 推开一定距离。也会有多个输入。

标签: actionscript-3 flash actionscript air animate-cc


【解决方案1】:

最大的问题是代码使用了多少 cpu 或 gpu。您试图避免使用任何碰撞检测。碰撞检测是让代码进行计算以确定对象的边缘。它应该是最后一个选项。

大多数时候您都知道不需要碰撞检测。你知道一切都在哪里以及它有多大。一切都有一个中心点,比较简单的数字坐标是检查是否需要进一步检查的轻量级方法。

当物体彼此靠近时,您只需对物体周围的直接区域进行碰撞检测。看看您的形状如何适合易于检查碰撞的盒子?该框应该在其内部的实际锯齿形状之前进行碰撞检查。

是的,必须绘制或映射碰撞检测框,但它是在定义对象时完成的,而不是在玩游戏时完成的。如果您使用精灵表,请在形状周围保留一个框或圆圈的 xml。

【讨论】:

    【解决方案2】:

    对于问题 1:我将假设您有一些关于形状的几何数据。

    您可以用来检查一个点是否在一个形状内的一种方法是获取该点,然后在一个方向上从该点画一条线到无穷远(屏幕边缘)。然后计算该线与形状边缘相交的次数。如果是奇数,则该点在形状内(或在边缘上),如果是偶数,则该点在形状外。

    谷歌第一个链接:https://www.geeksforgeeks.org/how-to-check-if-a-given-point-lies-inside-a-polygon/

    或者也可以尝试一种更简单的方法(以做更多工作为代价):如果上面的形状是由所有正方形和矩形生成的,并且你知道所有这些的点和大小:可以做一个检查点与构成形状的所有正方形和矩形。

    对于问题 2:正如 Organis 所提到的,我会使用 Box2D 之类的库来执行此操作。如果您尝试单独实施,您很可能会花费大量时间(您可能不想这样做)。

    【讨论】:

    • 您好,感谢您的回答,我检查了您为 qns1 提供的链接,这是一个非常聪明的解决方案。它可能比 bitMapData.hitTest 慢,但我可以将它用于 qns2 边界检测。但是,由于我还没有尝试过 Box2D,我不确定是否有内置功能来检测这样的形状边界。你能解释一下吗?否则我会在我尝试过 Box2D 时再次更新。
    • 我的直觉告诉我它应该比任何基于像素的方法更快,但我可能是错的(线交叉测试可以只用数学来完成)。肯定知道的一种方法是同时实施并衡量结果。您可能会发现更容易实现的方法(无论哪种方法)都很慢,但对于您的用例来说是可以接受的。自从我接触 Box2D 以来已经有一段时间了,虽然凸形不应该成为问题,但我不能肯定地说。您可能必须调整您的形状生成代码以适应 Box2D 的工作方法。勾选 Box2D 的文档。
    猜你喜欢
    • 1970-01-01
    • 2019-03-04
    • 2014-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多