我正在开发一个使用磁贴引擎(自制)的项目,我的下一个任务是创建一个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.
答案 0 :(得分:1)
假设查看者位于(x1,y1)
位置,目标位于(x2,y2)
。现在,我假设在n
沿x
和m
沿y
有一组(x0,y0)
个连续的拼贴。第一个瓷砖的左下角位于d
位置。切片的大小为x
t
和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)
; y = y0
。现在的工作是找出该线是否穿过连接两个连续角落的4个线段中的任何一个。让我们取x
定义的p1和p2(水平线)之间的片段。如果将其设置为线方程式,您可以找到我命名为xi
的可能拦截y0 = (y2 - y1) * (xi - x1) / (x2 - x1) + y1
:
xi = x1 + (y0 - y1) * (x2 - x1) / (y2 - y1)
您可以反转此等式并找到possibx:
xi > x0
现在,如果xi < 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
或{{1}}的情况。这是垂直和水平的视线,并且可能导致在上述等式中除以零。解决方案:分别处理这些案例。