繁体   English   中英

寻路2D Java游戏的其他问题

[英]Pathfinding 2d java game further issues

我前段时间在java 2d pathfinding上问了一个问题

我正在开发的游戏基于主题医院的理念。 从我的问题中选择的答案是A *寻路,链接很棒,而且非常有帮助。 我最终要在游戏中实现这一点,但是我对此还有其他疑问/问题。

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

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

第三,我一直在进行推理,将所有房间都视为不通房间。 我的意思是,房间覆盖的任何正方形都算作遮挡。 我在想人们进入房间的方向。 然后,他们将不得不在这些房间中移动以到达各个地方。 我以为我只是将每个正方形的Blocked布尔值取反,但这有两个原因。 1,房间可能有相连的墙,并可能破坏寻路。 如图2所示,如果将阻塞状态简单地倒转,则房间中的所有固体物品在倒转时都将被视为不牢固,这可能会在它们碰到墙壁时引起问题。

考虑一下,如果您可以将正方形的边遮住而不是实际的整个正方形会更好。 这必须是可能的,但是我只是通过使用上一个问题中的教程来获得,并且不确定是否应该尝试更改A *来执行此操作,或者解决客房项目问题的解决方法。

对这些问题有任何想法或建议吗? 今天,我正在执行简单的路径查找,但是要先思考一下。

快速浏览一下,看起来isValidLocation(mover,sx,sy,xp,yp)方法定义了从point(sx,sy)移至point(xp,yp)是否有效。

如果此方法考虑了移动的方向,则可以将特定的方向从一个块中划入一个块,而不必使该块完全不可穿透。 这样,您可以将2个可访问块彼此相邻,并在它们之间建立一个牢固的边界。

这种方法具有一些有趣的副作用,例如能够创建单向边界(A块可以访问B块,反之亦然。)可能是使A *采取单向门(射击)的有用的游戏机制。转义?)。

如果有人站在您面前,则有一种称为Adaptive A *的算法可以重新计算路径的一部分。 我将首先关注原始A *,如果您发现之前有效的路径被阻塞了一半,那么您始终可以从该点开始计算一条新路径。

看起来很有趣: 实时自适应A * [PDF]

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

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

要遮盖正方形的边,您可以将每个图块视为9个单独的图块(3X3)。 例如,对于水平墙被遮挡的瓷砖,您可以将瓷砖(对于a *算法)表示为单个瓷砖,而不是单个正方形:

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

一块具有垂直和水平砖块的砖块:

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

您将必须在游戏地图中存储其他边缘信息。 希望这可以帮助。

对于路径问题:

一个简单的解决方案是,当且仅当当前路径中的下一个移动被视为无效时才重新计算路径(在地图上放置了新元素,添加了新房间,并移动了门...) 。 当然,您需要从当前位置重新计算。 如果阻塞元件是另一个移动的元件,则问题会更加复杂。 在这种情况下,根据优先级,两个对象之一必须等待几个周期,而另一个必须重新设置路径。 但是,这可能会导致多路径冲突的问题(两个高优先级对象分别位于门的一侧,而低优先级对象在门中:它不能移动,并且高优先级将等待很长时间)

对于房间问题:

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

希望这可以帮助

纪尧姆

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM