我正在使用Allegro库创建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);
编辑:好的,我想我可以使用this algorithm来检测鼠标是否在多边形中,但我仍然觉得这不是正确的方法。我仍然需要为每个不同的多边形调用该函数,听起来不太正确。
答案 0 :(得分:1)
您找到了一种算法,该算法可对所有多边形进行多边形输入,并告诉您用户单击了哪个多边形。做得好,您可以使用它。您想要一个内置的API调用来实现它,但没有得到它。由于没有人发布相反的答案,所以我想您不会。您应该使用自己拥有的东西。
我现在将说明为什么这应该让人们感到正确而不是不正确。
如果库本身为您实现了该库,它仍然会受到底层OS原语的约束,而这些原语又会受到问题的算法复杂度的限制,而这些原本的问题是 每个多边形的多边形。因此,您可以在应用程序中投影所有多边形,在整个屏幕上使用一个鼠标点击框,然后依次测试它们。如果有对此的API,这就是API所要做的。
我认为您编码的可能性很大,发现它太慢了。一个几乎总是可行的简单解决方案是先进行一个面向轴的包围盒测试,这很快。
BugSquasher建议使用其他解决方案。渲染两次,第二个渲染到屏幕外的缓冲区,每个多边形一种颜色,然后对该颜色进行点测试。如果命中测试比多边形移动更常见,这也是可行的,并且是一个很好的加速方法。不过,它确实会占用内存。