我正在使用快板库创建一个 2D 游戏,我需要在地图上创建多边形区域,玩家可以点击该区域来移动他的单位。
我是否被迫在多边形检测算法中使用某种点,或者是否有使用我已经绘制的多边形的更简单的解决方案?
到目前为止,我设法绘制了一个多边形,例如:
ALLEGRO_VERTEX v[] =
{
{ .x = 0, .y = 0, .z = 0, .color = al_map_rgb_f(1, 0, 0) },
{ .x = 0, .y = 48, .z = 0, .color = al_map_rgb_f(1, 0, 0) },
{ .x = 32, .y = 64, .z = 0, .color = al_map_rgb_f(1, 0, 0) },
{ .x = 80, .y = 32, .z = 0, .color = al_map_rgb_f(1, 0, 0) },
{ .x = 112, .y = 0, .z = 0, .color = al_map_rgb_f(1, 0, 0) }
};
al_draw_prim(v, NULL, NULL, 0, 5, ALLEGRO_PRIM_TRIANGLE_FAN);
编辑:好的,我想我可以使用此算法检测鼠标是否在多边形中,但我仍然觉得这不是正确的方法。我仍然需要为每个不同的多边形调用该函数,这听起来不对。
您找到了一种算法,可以对所有多边形进行点入多边形,并告诉您用户单击了哪个多边形。干得好,你可以使用它。你想要一个内置的 API 调用来完成它,但没有得到它。由于没有其他人发布了相反的答案,我认为您不会。你应该使用你所拥有的。
我现在将说明为什么这应该感觉正确而不是感觉不正确。
如果库本身已经实现了它适合你,它仍然会通过底层操作系统原语,后者又通过问题的算法复杂性,这限制约束是点在多边形每个多边形。因此,您可以投影应用程序中的所有多边形,对整个屏幕使用一个鼠标点击框,然后依次测试它们。如果有一个 API,这就是 API 必须要做的事情。
我预测你编码它的机会很大,但发现它太慢了。一个几乎总是有效的简单解决方案是首先进行面向轴的边界框测试,这很快。
BugSquasher 提出了一个替代解决方案。渲染两次,第二次渲染到每个多边形一种颜色的屏幕外缓冲区,然后对颜色进行点测试。这也有效,如果命中测试比多边形移动更常见,那么这是一个很好的加速。不过它确实会消耗内存。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句