Java:对于无限的游戏世界来说,存储坐标图的良好数据结构是什么?

2022-09-01 00:12:37

我习惯于用PHP编码,但我并不真正精通Java,这已经是一段时间的问题了。我希望这是一个相当简单的解决方案,但是我无法通过任何搜索方式找到任何好的示例代码,所以这里是:

我正在编写一个游戏,该游戏发生在基于图块的地图上的2d随机生成的无限世界中(挑剔:我知道它不会是真正的无限。我只是期望世界会很大)。map[x][y]多维数组的常用方法最初是一个基本思想,但由于Java没有像PHP那样为非整数(即负)数组键恶作剧提供一种方法,因此我无法正确使用带有数组键的(-x,+x,-y,+y)坐标系。

我需要能够在特定x,y坐标处找到瓷砖上的对象,以及找到某个瓷砖的“相邻瓷砖”。(如果我能得到ObjectAt(x,y),我可以得到(x+1,y)等等,那就太微不足道了)

我读过关于四棵树和R树之类的东西。这个概念令人兴奋,但是我还没有在Java中看到任何好的,简单的示例实现。此外,我真的不确定这是否是我真正需要的。

欢迎任何建议

谢谢


答案 1

1) 您可以使用 or 代替数组,这当然允许负索引Map<Integer, Map<Integer, Tile>>Map<Point, Tile>

2)如果你从一开始就知道你世界的维度,你可以修改你的getter,让API接受负数,并[线性地]将它们转换为正数。例如,如果你的世界是100x1000个图块,而你想要(-5,-100),你会有哪个会翻译成哪个是(45,400)WorldMap.getTile(-5,-100)return tileArray[x+mapWidth/2][y+mapHeight/2];


答案 2

我带着同样的问题来到这个线程,但我的解决方案是使用Map / HashMaps,但这些都是一维的。

为了克服这个问题,我没有在映射中使用映射(这会很混乱且效率非常低下),而是使用了一个泛型的 Pair 类(不是你在股票java库中找到的东西),尽管你可以用一个 Position 类替换它(几乎相同的代码,但不是泛型的,而是整数或浮点数)。

因此,在定义映射时:Map<Pair, Tile> tiles = new HashMap<Pair, Tile>;

用于将切片对象放置在我使用的地图上以及检索对象。tiles.put(new Pair(x, y), new GrassTile());tiles.get(new Pair(x, y));

[x/y 将是您希望放置的任何坐标(这允许负坐标而不会造成任何混乱!),“new GrassTile()”只是在地图创建期间放置特定类型图块的一个例子。显然 - 如前所述 - Pair类是可替换的。

你可能会问为什么不是ArrayLists?因为数组列表比映射更线性,而且在我看来,添加和检索磁贴更加困难,尤其是在 2 维上。

更新:

对于任何想知道为什么Java中没有Pair()类的人,这里有一个解释


推荐