首页 文章

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

提问于
浏览
1

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

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

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

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

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

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

对这些问题的任何想法或建议?我今天正在实施简单的路径查找,但只是提前思考 .

3 回答

  • 0

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

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

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

    有一种名为Adaptive A *的算法可以重新计算路径的一部分,如果有人站在你面前 . 我会首先专注于香草A *,如果你发现以前有效的路径被阻止,你可以总是计算出从那一点开始的新路径 .

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

  • 1

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

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

    要阻挡正方形的边,您可以将每个图块视为九个独立的图块(3X3) . 例如,对于具有阻挡水平墙的图块而不是单个正方形,您可以将图块(对于您的a *算法)表示为:

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

    封闭了垂直和水平拼贴的拼贴:

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

    您必须使用游戏 Map 存储其他边缘信息 . 希望这可以帮助 .

  • 0

    对于路径问题:

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

    对于房间问题:

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

    希望这可以帮助

    纪尧姆

相关问题