0

例子

我正在开发一个使用 tile 引擎(自制)的项目,我的下一个任务是创建一个 AI(除了其他已完成的 AI),这个很棘手,因为 AI 应该只在玩家是在AI的视线中。在计算范围(以瓷砖为单位)[1 瓷砖 = 32*32] 之后,尝试使用循环。
然后我想到了创建一个直线方程。我在这里,对数学感到困惑。

知道我如何计算它是否与这些“隐藏”图块之一重叠?
请注意,我只想使用数学!

TileInfo.tileData[la[floor(y / 32)][floor(x / 32)]];
//la -> array of tile positions, if it's >0 then there is a tile.
4

1 回答 1

1

假设观察者在位置(x1,y1),目标在(x2,y2)。现在,我假设n沿着xm沿着有一组连续的瓷砖y。第一个图块的左下角位于位置(x0,y0)。瓷砖的大小是d沿着xt沿着y。现在数学:

连接查看器和目标的线是

y = y1 + (y2 - y1) * (x - x1) / (x2 - x1)

瓷砖角在点p1 = (x0,y0)p2 = (x0 + n * d, y0); p3 = (x0 + n * d, y0 + m * t); p4 = (x0, y0 + m * t). 现在的工作是确定该线是否穿过连接两个连续角的 4 个线段中的任何一个。让我们采用由 定义的 p1 和 p2 之间的线段(水平线)y = y0。如果将其设置为直线方程,您可以找到x我命名的可能截取xi

y0 = (y2 - y1) * (xi - x1) / (x2 - x1) + y1

您可以反转这个等式并找到 possibx:

xi = x1 + (y0 - y1) * (x2 - x1) / (y2 - y1)

现在,如果xi > x0xi < x0 + n * d有这个段的拦截。否则你有一个自由的视线。

对直线由p2 -> p3: x = x0 + n * d;定义的其他三个线段执行相同的操作 p3 -> p4: y = y0 + m * d; 和p4 -> p1: x = x0

请注意,当线段是水平的(y = const)时,您必须将其放在y视线直线上,计算x并将其x与截距进行比较。如果线段是垂直的(x = const),那么您必须放入x直线方程,计算y并检查它是否落在区间内。

最后一点是,您必须特别注意x1 = x2或的情况y1 = y2。这是垂直和水平视线,可能会导致在上述等式中除以零。解决办法:分别处理这些情况。

于 2012-08-25T20:59:40.627 回答