我在使用算法让我的游戏工作时遇到了一些问题,希望有人可以帮助我。谷歌似乎并不是一个很好的帮助,因为大多数解决方案只适用于完整的瓷砖。
在游戏中,单位可以占据拼贴内部的不同位置,即它们可以位于拼图的左上角,中心,右下角,...位置(2/3),即(2.2 / 3.1),( 2.5 / 3.5),(2.8 / 3.9)。
如果他们从位置(2.2 / 3.1)移动到(5.7 / 4.1),我需要检查路径中是否有障碍物。
我目前的算法是:
这个算法有效,但对我来说它看起来效率不高,因为障碍物只能是一个完整的瓦片,而不是瓦片的一部分(单元不会碰撞)。如果我增加步长,我开始错过仅略微交叉的瓷砖(即,您只穿过最左边的角)。即使步长为0.1,仍然可能会错过障碍物。
我试图找到一个液取子图(与角部的所有区块(地板(start.X)/地板(start.Y))和(小区(start.X)/小区(start.Y) ),移动每个瓷砖,并检查它是否越过。遗憾的是,我似乎缺乏这项检查所需的数学知识。
我的最后一个想法是将一个瓷砖的所有4个边框作为一条线并进行直线交叉,但这似乎比我原来的方法慢。
任何提示?
感谢。
答案 0 :(得分:5)
不是通过沿着线踩踏来追踪路径 - 而是想要直接跳到下一个可能的图块(边框)。这可以相当简单地计算。我将使用上面的示例数字。
这个过程只会导致每个瓷砖移动一次计算(无论您的精度或瓷砖有多大),都是精确的。请注意,计算的值可以存储和重复使用,而不是一遍又一遍地盲目计算两个交叉点。在上面我们知道(步骤4)我们在x = 5之前不会向上移动。因此,可以在不进行另一次计算的情况下推断出整个路径(2,3-> 3,3-> 4,3-> 5,3-> 5,4)。
也可以预先计算所有过渡而不是逐步进行过程,尽管只有在你总是需要整个路径时才会这样做(你不会因为想要在找到障碍物时停止处理)。
两个警告。注意标志以及生产线的走向 - 通过不密切关注负斜率会发生很多错误。另外,使用实数你几乎不会对角交叉(两个边框一次),但你应该知道它(在代码中处理它)以防万一。
这个方法有一个名字,但我不记得它在我的头顶。我相信它可能来自Game Programming Gems系列,但也许其他人可以提供更好的参考。