寻路2d java游戏的进一步问题

时间:2009-07-02 10:27:48

标签: java 2d path-finding a-star

前段时间我在java 2d寻路上问了一个问题...... Pathfinding 2D Java game?

我正在开发的游戏是基于主题医院的理念。 从我的问题中选择的答案,A *寻路,链接很棒,非常有帮助。 我最终将这个实现到我的游戏中,但是我还有一些关于它的问题/问题。

在我的游戏中,地图会发生变化。本教程假定地图是静态的(我认为)。我一直在查看代码,据我所知,我只需要创建一个方法来调用以在路径查找代码中更新游戏地图。

其次,我看到了GameMap类。我有自己的名为Board的课程,里面有所有的瓷砖。我相信我可以将GameMap上的方法集成到我的Board类中。正确?

第三,我一直在研究任何房间都被视为封锁的原因。我的意思是,房间覆盖的任何方格都被视为封锁。我正在考虑人们进入房间的地方。然后他们将不得不在这些房间移动到各个地方。我原以为我只会为每个方块反转Blocked布尔值,但这不会有两个原因。 1,房间可能有连接的墙壁,并可能破坏寻路。 2,如果被阻挡的状态被简单地倒置,那么当倒置时,房间内的任何固体物品都会被看作不牢固,这可能会在他们碰到墙壁时引起问题。

考虑一下,如果你可以让方块的边被阻挡而不是实际的整个方块会更好。这一定是可能的,但我只是使用上一个问题中的教程,并且不确定我是否应该尝试更改A *来执行此操作,或者处理房间项目问题的解决方法。

对这些问题有任何想法或建议吗? 我今天正在实施简单的路径查找,但只是先考虑自己。

3 个答案:

答案 0 :(得分:1)

从快速看,看起来isValidLocation(mover,sx,sy,xp,yp)方法定义了从点(sx,sy)到点(xp,yp)的移动是否是有效的移动。

如果此方法考虑了移动的方向,则可以阻止特定方向进出块,而不会使块完全不可穿透。这样,你可以有两个可访问的块彼此相邻,它们之间有一个坚实的边界。

这种方法有一些有趣的副作用,例如创建单向边界的能力(块A可以访问块B,但反之亦然。)可能是一个有用的游戏机制,让A *采取单向门(火灾逃生?)考虑在内。

有一种名为Adaptive A *的算法可以重新计算路径的一部分,如果有人站在你面前。我会首先专注于香草A *,你可以随时计算出一条新的路径,如果你发现以前有效的路径被阻止了一半。

这看起来很有趣:Real-Time Adaptive A* [PDF]

答案 1 :(得分:0)

如果游戏地图发生变化,您需要重新计算路径,但是您不一定需要根据更改的内容重新计算所有路径。

您应该将GameMap的方法集成到Board类中(修改GameMap类)。

要阻挡正方形的边,您可以将每个图块视为九个独立的图块(3X3)。 例如,对于水平墙堵塞的瓷砖, 您可以将瓷砖(对于您的*算法)表示为:

,而不是单个方格
[X| |X]
[X| |X]
[X| |X]

已阻止垂直和水平拼贴的拼贴:

[ | |X]
[ | |X]
[X|X|X]

您必须在游戏地图中存储额外的边缘信息。 希望这会有所帮助。

答案 2 :(得分:0)

路径问题:

一个简单的解决方案是重新计算路径当且仅当当前路径中的下一步移动被视为无效时(地图上放置了新元素,添加了新房间,移动了一扇门)。 ..)。当然,你从当前位置重新计算。 如果阻挡元素是另一个移动元素,则问题更复杂。在这种情况下,两个对象中的一个必须等​​待几个周期,另一个必须重新路径,具体取决于优先级。然而,这可能导致多路径碰撞的问题(门的每一侧有两个高优先级对象,门中有一个低优先级对象:它不能移动,高优先级会等待很长时间)

对于房间问题:

将房间定义为一组瓷砖而不是一个瓷砖是很常见的。因此,您可以定义一个房间,子房子是可通行的,而那些不是。如果你的模型允许它,你甚至可以描述出现在不同瓷砖上的物品并将它们设置为无法通行:等候室(6个瓷砖x 4个瓷砖房间)如果完全可以通过,但包含一套椅子和一个小的喷泉使一些子类无法通行。

希望这有帮助

纪尧姆