我需要约束艺术家给我的DisplayObject
内的一个点。
我让它工作但仅适用于光标仍在bounds
内的位置
有限的对象称为limited
。
function onSqMouseMove(event:MouseEvent) {
if(bounds.hitTestPoint(event.stageX, event.stageY, true)) {
limited.x = event.stageX;
limited.y = event.stageY;
} else {
/* Find closest point in the Sprite */
}
}
limited.addEventListener(MouseEvent.MOUSE_DOWN, function(event:MouseEvent) {
stage.addEventListener(MouseEvent.MOUSE_MOVE, onSqMouseMove);
});
limited.addEventListener(MouseEvent.MOUSE_UP, function(event:MouseEvent) {
stage.removeEventListener(MouseEvent.MOUSE_MOVE, onSqMouseMove);
});
如何实现该功能的另一半?我知道Sprite的startDrag
接受参数,其中第二个是约束矩形,但在我的情况下,bounds
是一个任意形状。
当对象被拖到边界外时,我想计算从光标到bounds
'多边形的最近点。
请注意bounds
可以有'漏洞'。
要清楚,我不想找到一个点是否在MovieClip内,我想要从MovieClip外的一个点得到最近点(注意hitTestPoint 失败 !)到它的边界。
答案 0 :(得分:1)
我看到这些家伙曾经回忆过一些关于“图像像素精确度”的问题,在那里他能够通过图像和热门测试真的很酷,但我不记得了:p。
如何开始这些:
鉴于您的DisplayObject是纯色,但是任意形状,Doug McCune的教程将非常容易。如果能让你更接近,请告诉我。
最佳, 兰斯
答案 1 :(得分:1)
嗯,这实际上取决于你所关注的准确性(以及背景图像的风格或复杂程度)。据我所知,除非你有一个特定的数学参考,否则没有直接测试距离的方法,因此除非你动态地绘制背景,否则你会遇到很多麻烦。
直接想到两种方法:
加载关卡时,将其计算为第n个精度数组(例如5x5像素),复制背景的一部分,然后测试它是否包含透明度(也许是getColorBoundsRect( 0xff000000, 0, false );
?)。注意哪些包含数组中的边,然后您可以针对鼠标位置测试此网格,以告知最可能最近边的位置(任意一个方格,然后是两个,然后是三个等)。如果您需要更高的准确度,那么一旦您知道哪些最有可能容纳最近的像素,您就可以尝试某种计算。这不准确,并且在开始时需要一些计算,但它应该快速运行。
如果你有一个圆形的hitdetect精灵,你附加到光标位置,那么你可以扩展/收缩它并找到命中点。从宽度开始:0,高度:0,当它与背景接触时,当它在边缘上移动时,每个循环将其展开一个合理的量(例如5px),直到它有一个hittest。然后你可以跟踪这一点(如发布的viatropos页面中所示的Grant Skinners页面所示),如果碰撞区域太大,那么你的光标移动到更接近碰撞点,并且可以减少一定量,直到碰撞大小再次合理为止。这对处理器来说有点密集,但它只有几个测试帧,就像有30个球弹跳一样,它不应该太难了。
希望这会给你一些想法!
答案 2 :(得分:1)
你可以从鼠标位置开始,然后开始螺旋式地对每个像素进行命中测试。这将导致长循环,但根据您的使用情况,它应该可以合理地执行。这只能通过测试看到。
答案 3 :(得分:0)
根据您的具体情况,有多种算法可以很好地运行:
Point.interpolate(closestRef, nextClosestRef, factor)
。这种方法的缺点是它不会100%准确,因为参考点之间的区域将减少为直线(这可能影响参考点的位置)。换句话说,如果你的边界艺术有很多复杂的边缘,这种方法并不好,如果另一方面它有很多直线,那就太好了。Point.polar(radius, angle).add(cursorPosition)
以获取形状边界上的实际点。仅供参考,首先深入挖掘API并查看是否已有一个可满足您需求的库。
答案 4 :(得分:0)
讨厌给出另一个理论答案并再次打开它,但我最近一直在思考这个问题。我认为光线跟踪方法可以工作。这个想法如下:
我能用这种方法想到的唯一问题是它可能容易受到局部最小/最大值问题的影响。它的计算成本也可能很高。
快速谷歌给了我以下资源,如果你要尝试上述(如果我找不到替代方案,我想我可能会这样做)
如果你在形状的内部有一个点并且在表面上找到最近的点(在大多数情况下导致那个点的法线),那么可以实现什么的一个例子,这是一个在boids上{{3 }}
你找到了解决方案吗?