A*算法2D游戏路径规划问题

3
我决定重拾以前的2D游戏引擎并继续开发它,这是我第一次尝试为敌人实现基本的AI,但是遇到了一些问题。以下是我处理敌人AI的方法:
  • 如果玩家在敌人的范围内,敌人会朝着玩家移动,只需检查他是否在玩家的上下左右,并相应地调整坐标。

  • 如果敌人遇到阻碍它向玩家移动的障碍物,我会调用我的A*算法来检测到玩家的最短路径并绕过障碍物。

  • 我每帧都会检查敌人是否不再受阻,并且如果是,则再次调用A*算法以根据玩家的移动位置进行调整。

我的A*算法实现方式是基于敌人的尺寸检查相邻的方格。例如,如果我有一个60x60的敌人,我将在这些尺寸内检查相邻的网格。同时,敌人的大小可以不同。我遇到的问题如下:

enter image description here


假设敌人是黑色正方形。它检查相邻的方格,并可以向前移动到该方格,因为它没有与该方格中的任何对象发生碰撞。一旦它在上面的正方形,它可以通过右侧的正方形而不发生碰撞。现在看看这种情况:

enter image description here


假设当敌人处于黑色正方形位置时调用A*算法。由于没有足够的空间让敌人在顶部墙之间移动,所以会发生碰撞,并且根据我的算法,这将导致敌人忽略此块。


因此,我的问题是:解决这个问题的最常见方法是什么?我可能缺少了一些傻瓜式的东西,但我想问问。希望我已经足够清楚地解释了我遇到的问题,如果您需要任何澄清,请随时询问。提前致谢。


我个人并不理解问题出在哪里,但是我认为你使用算法的方式可能会导致奇怪的行为,因为你只有在遇到障碍物时才使用它。想象一下一个垂直的管道,敌人在管道顶部,他试图到达在管道下方的玩家,敌人会下降,因为他还没有撞到任何障碍物,当他到达管道底部时,这是一个障碍物,算法将计算路径,即向后走(上管道),但是一旦他上去了,就没有障碍物了,他又会下来。如果我错了,请告诉我。 - Othman Benchekroun
1个回答

0

我猜你是用敌人大小的块来填充A*算法

这是错误的,你需要逐个单元格/像素进行填充

所以在填充时只填充相邻的一行(而不是整个方框)

如果整行都不可用,则不要填充它。

A* with block filling

你需要将一些额外信息编码到A*地图中,例如:

  • 水平、垂直或两者皆可
  • 是否为拐角或盒子位置

以了解可以生长的方向。

[注]

A*填充应始终与您的移动能力相匹配。


谢谢您先生。这很有帮助,我能够通过在计算每个点后将敌人捕捉到最近可用的瓷砖来解决我的问题。 - David Sleep
@DavidSleep 很高兴能够提供帮助。 - Spektre

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接