在我的一个俯视视角、逃离可怕外星人的游戏中,使用C# XNA编程,我设置了一些外星人和墙壁(以及其他元素)。我现在遇到的一个难题是如何让外星人绕过墙壁行驶。目前他们像傻瓜一样撞到墙上,沿着墙滑动,可能会在另一边探出时到达目标。
这是我对问题的专业插图:问题 http://imageshack.com/a/img829/6545/wsf4.jpg
所以,我的直接问题是:
- 如何检查外星人和目标之间是否有墙?
- 如何引导它们沿着最短路径绕行?
欢迎提供算法/解释,C# 代码将是额外的奖励!:)
为了简化计算,这里有一些相同的假设:- 外星人和墙壁都有AABB – 墙壁总是垂直或水平的
如果需要,我很乐意提供任何额外的信息:)
回答:
在研究开发wp7/wp8游戏时,我通过A*路径查找算法解决了这种问题。(www.policyalmanac.org/games/aStarTutorial.htm)。
你也可以使用Dijkstra算法进行路径查找。https://i.sstatic.net/VMkdl.gif
这是我的第一种方法。后来我了解到另一种方法。这种方法建立在A*路径查找的基础上,并利用了AI引导力/行为。你甚至可能只用引导力就能解决这个问题。
简单来说,引导力根据目标和环境迫使实体移动。你将移动(速度)力叠加到实体上,这些力的总和以期望的方式移动实体。
因此,一个实体可能有移动欲望靠近怪物,避开墙壁,以及避开地图边界。这些速度乘以百分比值(你希望它们对全局力施加多少)全部加在一起,就得到了最终的力。
这些方法各自都有问题和限制。我认为A*和引导力的组合可能是你最好的选择。
示例:https://i.sstatic.net/u7ECs.jpg
编辑:如果想要手动放置节点,Dijkstra算法更基于节点。如果放置节点不是一个选项,我认为引导力是你最好的选择。