1

我正在制作一个游戏,我遇到了一个很难实现到代码中的部分。我的游戏是一个基于瓷砖的平台游戏,有很多敌人在追你。基本上,理论上,我希望我的敌人能够在每一帧/秒/2 秒内找到通往我的玩家的真实最短路径。我原本以为A-star是一种解决方案,但它把敌人引向了对抗重力的路径,这并不好。此外,每秒会有多个敌人使用它来获取最新路径,然后走它的前几格。因此,他们将每秒丢弃路径的其余部分,并仅跟随路径的前几个图块。我知道这似乎很多,每秒计算一条新路径,同时,如果他们的敌人不止一个,但我不知道任何其他方式来实现我想要的。这是我想要的图片:图片 说明:绿色为玩家,红色为敌人。灰色的瓷砖是规则的,敞开的,没有瓷砖,棕色的瓷砖是可以站立的。最后突出显示的黄色瓷砖代表我希望我的敌人能够找到的路径,以便真实地到达玩家。所以,问题是:我可以用什么现实的寻路算法来获得这个?同时保持快速?

编辑*我更新了图片以表示他们可能是最复杂的地图。这张地图代表了我的游戏玩家实际看到的内容,他们只是使用 WASD 并且可以四处移动,他们看到自己在这个 2d 平台视图中移动。他们将是不同类型的敌人,都有不同的速度和跳跃高度。但所有人都将有足够的跳跃高度和速度来完成这张地图中的跳跃,并通过它进行机动。只需读取包含关卡数据的 XML 文件即可生成地图。然后根据 XML 的说明解析数据,并将不同类型的图块放置在图块保存精灵中。EX( XML 节点: (type="reg" 图形="grass2" x="5" y="7" ) 等 x 和 y 乘以常数 gridSize (如 30 或其他),并相应地放置它们。敌人从附在他们身上的 AI 类获得逐帧指令。这个类负责产生这条路径并将第一个方向返回给敌人,这应该每隔一秒左右发生一次,这样敌人就不会走上一条古老的错误路径。如果您理解我的概念,请告诉我,并且您有一些想法/想法,甚至可能是我正在寻找的答案。另外:这个游戏中的物理与寻路是分开的,它们工作得很好,使用 AABB 与 AABB 的概念(玩家和敌人也是 AABB)。这个类负责产生这条路径并将第一个方向返回给敌人,这应该每隔一秒左右发生一次,这样敌人就不会走上一条古老的错误路径。如果您理解我的概念,请告诉我,并且您有一些想法/想法,甚至可能是我正在寻找的答案。另外:这个游戏中的物理与寻路是分开的,它们工作得很好,使用 AABB 与 AABB 的概念(玩家和敌人也是 AABB)。这个类负责产生这条路径并将第一个方向返回给敌人,这应该每隔一秒左右发生一次,这样敌人就不会走上一条古老的错误路径。如果您理解我的概念,请告诉我,并且您有一些想法/想法,甚至可能是我正在寻找的答案。另外:这个游戏中的物理与寻路是分开的,它们工作得很好,使用 AABB 与 AABB 的概念(玩家和敌人也是 AABB)。

4

2 回答 2

1

在这里使用 A* 的诀窍是如何将图块链接在一起以形成可用路径。以红色玩家需要跨越的第一个缺口为例。到下一个平台(又名左侧的棕色瓷砖)的“链接”实际上是一个跳跃动作,而不是移动动作。此外,由您决定节点如何连接在一起;当从棕色瓷砖上的灰色瓷砖移动到下面没有任何东西的灰色瓷砖时,我会增加重罚(不阻止打开快捷方式的跳跃)。

我个人看到了两条路线:快速预测玩家可以跳多远以及他们会跳到哪里,并调整算法如何确定节点邻接或接受路径并确定路径的某些部分何时“悬”在空中(下面没有棕色瓷砖)并动画敌人“跳跃”到路径的下一部分。诀窍是在敌人可能穿过棕色瓷砖时处理事情,即使路径不是抛物线。

我不精通这两种解决方案;只是我想过的事情。

于 2013-09-26T23:38:51.910 回答
0

您需要向我们提供最复杂的地图、玩家和敌人行为(包括跳跃和跨越速度)案例,您将自动创建或手动创建这些案例,以便我们提供相关建议。给定的地图非常简单,将地图放入二维数组中,然后将初始玩家位置作为该地图的元素,然后首先测试同一行的较低数字列是否被棕色占据,如果没有将玩家放在那里,重复直到错误,然后在同一行更高的列,依此类推以移动敌人。

更新:根据我对舞台生成的阅读——它有时是你创造的——不是半随机的。

我的建议是敌人用相同的 AI 创建自己的克隆体,但不可见,每个克隆体开始朝不同的方向向上/向左/向右/向对角线向右/向左跳跃,每次成功时它都会创建一个新的克隆体——基本上是一种遗传算法. 从地图上看,敌人似乎永远不需要评估一条路径而不是另一条路径,只是一种方式无法接近玩家的初始位置,而其他方式则没有。

于 2013-09-27T01:31:17.463 回答