我目前正在开发一个关卡编辑器,而且我已经收集了一些我想用来创建多边形对撞机的顶点列表。
我通过将某些瓷砖标记为"碰撞器"来获得这些顶点。并通过算法运行它们以获取连接的切片列表。然后,我从连接的切片列表中创建了一个顶点列表,并删除了所有重复项。
下面是一张有助于解释的图片。所有的点都是目前在我的列表中的顶点,但我想使用红色的点来创建一个多边形。
答案 0 :(得分:0)
这就是我最终解决问题的方法。每个顶点都是四个不同图块的一部分(排除地图边缘的情况),所以我只是遍历每个顶点并计算了相同类型的#34;#34;。如果结果为4则表示顶点位于多边形中间的某个位置。如果结果为3则表示顶点位于内角。 2意味着它处于优势地位。 1意味着它是一个外角。
private List<Vector2> GetPerimeterOfVerticeList(List<Vector2> vertices, TileType type)
{
int neighborCount = 0;
List<Vector2> perimeter = new List<Vector2>();
//Check the four tiles touching this vertex
foreach (Vector2 v in vertices)
{
//upper left tile
if (v.x - 1 >= 0 && v.y <= gridHeight - 1 && grid[(int)v.x - 1, (int)v.y].type == type)
{
neighborCount++;
}
//upper right
if (v.x <= gridWidth - 1 && v.y <= gridHeight - 1 && grid[(int)v.x, (int)v.y].type == type)
{
neighborCount++;
}
//bottom right
if (v.y - 1 >= 0 && v.x <= gridWidth - 1 && grid[(int)v.x, (int)v.y - 1].type == type)
{
neighborCount++;
}
//bottom left
if (v.y - 1 >= 0 && v.x - 1 >= 0 && grid[(int)v.x - 1, (int)v.y - 1].type == type)
{
neighborCount++;
}
//If we have less than 4 neighbors, it means we are on the edge. 3 is an inner corner, 2 is a side piece, 1 is an outer corner
if (neighborCount < 4)
{
perimeter.Add(v);
}
//Reset the neighbor count back to 0 for the next vertex check.
neighborCount = 0;
}
return perimeter;
}