Actionscript 3 检测形状内的坐标

Actionscript 3 检测形状内的坐标,actionscript-3,flash,actionscript,air,animate-cc,Actionscript 3,Flash,Actionscript,Air,Animate Cc,我的问题有两个部分,它们是相关的。我的界面上有一个奇怪的形状,如下图所示,我试图在其边界内随机生成MovieClips,但我在找到一个好方法时遇到了一些困难 问题1:我可以运行If条件来检查bitMapData.hitTest,查看MovieClip是否在此形状内随机生成,如果它不只是使用一组新的随机坐标重试的话。然而,有没有更好的办法?是否只考虑形状内的坐标?将会有大量的MC一次生成,所以我希望减少负载,或者至少找到一种有效的方法来进行计算 问题2:在该形状中生成的电影嘴唇最终将具有碰撞检测机

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

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

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


如果它是一个正方形,我们可以通过快速检查所有4条边来很容易地控制住它们,但这种形状不行。目前,我正在考虑再次使用bitMapData.hitTest来检测被排斥后的越界,但我如何知道哪个点()是要将MC返回到的该形状最近的“边”?

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

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

谷歌的第一个链接:

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


对于问题2:正如Organi提到的,我会使用Box2D这样的库来完成这项工作。如果您试图单独实现此功能,很可能会花费大量时间(您可能不想这样做)。

最大的问题是代码使用了多少cpu或gpu。您试图避免使用任何碰撞检测。碰撞检测是通过代码执行计算来确定对象的边缘。这应该是最后的选择

大多数情况下,你知道没有必要进行碰撞检测。你知道所有的东西在哪里,有多大。任何东西都有一个中心点,比较简单的数字坐标是检查是否需要进一步检查的轻量级方法

当物体彼此接近时,只需在物体周围的紧邻区域进行碰撞检测。看看你的形状如何适合一个容易检查碰撞的盒子?在框内实际的锯齿形状出现之前,该框应该进行碰撞检查


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

我不是一个真正处理这类问题的游戏开发人员,但我认为您提出的检查位图数据命中率的解决方案可能是必须的(尽管我想看看是否有人能为您提供更高性能的解决方案)。至于快照,这更有趣,我很好奇你会得到什么样的答案。一个选项(这不是超精确的)是在设置目标位置之前检查目标位置,如果它将其移出边界,则将其保留在当前位置。你打算实现一个物理引擎来完成繁重的工作吗?我建议使用一个现成的解决方案,比如Box2D(有AS3库)来设置碰撞和其他东西。碰撞物理学是一门高级学科,你不可能花费大量的时间和精力在你自己的解决方案上,而永远不会接近现有解决方案所提供的。嗯,除非你对它有很好的理解,或者你的最终目标是你自己的2D物理引擎。谢谢大家的回复,我不知道Box2D,所以这肯定是我下一步的qns2。Box2D能够对那个奇怪的形状进行边界检测吗?我担心的是,必须将电影嘴唇控制在这个形状内。有一件事我没有在这个主题上详细说明,对象本身不需要有彼此之间的碰撞机制,只需要排斥我将从接口接收的输入值。例如,如果输入是点(30,30),我需要将MovieClips与30,30相隔一定距离。将会有多个输入。嗨,谢谢你的回答,我检查了你为qns1提供的链接,这是一个非常聪明的解决方案。它可能比bitMapData.hitTest慢,但我可以将其用于qns2边界检测。然而,由于我还没有尝试Box2D,我不确定是否有一个内置的功能来检测像这样的形状的边界。你能解释一下吗?我的直觉告诉我,它应该比任何基于像素的方法都快,但我可能错了(线交点测试可以用数学来完成)。一种确定的方法是实施这两种方法并衡量结果。您可能会发现更容易实现的方法(不管是什么方法)速度慢,但对于您的用例来说是可以接受的。自从我接触Box2D以来,已经有相当长的一段时间了,我不能确定凸形不应该是一个问题。您可能需要调整形状生成代码以适应Box2D的工作方法。查看Box2D的文档。