【问题标题】:Pathfinding 2d java game further issues寻路2d java游戏进一步问题
【发布时间】:2009-07-02 10:27:48
【问题描述】:

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

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

在我的游戏中,地图会改变。本教程假设地图是静态的(我认为)。一直在看代码,据我所知,只需要在寻路代码中创建一个调用更新游戏地图的方法即可。

其次,我看到了 GameMap 类。我有自己的班级,叫做 Board,里面有所有的瓷砖。我相信我可以将 GameMap 上的方法集成到我的 Board 类中。对吧?

第三,我一直在研究任何房间都会被视为阻塞的推理。我的意思是,房间覆盖的任何方格都被算作阻塞。我在想人们会从哪里进入房间。然后,他们将不得不在这些房间周围移动才能到达不同的地方。我在想我只会为每个正方形反转 Blocked 布尔值,但这有两个原因不起作用。 1,房间可能有相邻的墙壁,并且可能会破坏寻路。 2、如果阻塞状态只是简单的倒置,那么房间内的任何实心物品倒置后都会被视为不实心的,这可能会在接触墙壁时出现问题。

想一想,如果您可以将正方形的边制作成块状而不是实际的整个正方形会更好。这一定是可能的,但我只是通过使用上一个问题中的教程获得,并且不确定我是否应该尝试更改 A* 来执行此操作,或者解决房间物品问题的解决方法。

对这些问题有什么想法或建议吗? 我今天正在实施简单的路径查找,但只是提前考虑。

【问题讨论】:

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


    【解决方案1】:

    快速浏览一下,isValidLocation(mover,sx,sy,xp,yp) 方法似乎定义了从点 (sx,sy) 移动到点 (xp,yp) 是否是有效移动。

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

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

    有一种称为自适应 A* 的算法可以重新计算路径的一部分,例如,如果有人站在你面前。我会首先专注于香草 A*,如果您发现之前有效的路径被阻塞了一半,您总是可以从该点开始计算一条新路径。

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

    【讨论】:

    • 这可能很有趣。可能是我的首选解决方案。是的,自适应 A* pdf 看起来太复杂了,我现在无法理解。我只是了解 A* 是如何工作的 :) 当一个房间建成时,我可以自动将所有进入边缘方块的行程设置为不允许,然后在放置门时允许它。或者,我在考虑不允许通过任何寻路方式进出,让人们走到门口,然后朝正确的方向移动一个方格即可进出房间。
    【解决方案2】:

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

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

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

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

    一个被垂直和水平瓷砖阻挡的瓷砖:

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

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

    【讨论】:

    • 这似乎是一个有趣的想法,但可能超出了我目前的实现能力。我目前只是在与已经构建的寻路类进行交互,例如使用 api。
    【解决方案3】:

    关于路径问题:

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

    关于房间问题:

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

    希望对你有帮助

    纪尧姆

    【讨论】:

    • re 第 1 部分,我想我现在更好地理解了这一点。这就是我的想法。我计划保持移动物体(人)可以相互穿过的想法,就像在原始游戏中一样。关于第 2 部分,我确实将房间定义为一组瓷砖,正如你所描述的。有没有不同的遭遇?可以在瓷砖网格上绘制一个房间,覆盖多个瓷砖。
    猜你喜欢
    • 2010-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-21
    相关资源
    最近更新 更多