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

Ayk*_*kın 45 java map tile coordinate

我习惯用PHP编码,但我并不熟悉Java,这已经有一段时间了.我希望它是一个相当简单的解决方案,但是我无法通过任何方式找到任何好的示例代码,所以这里是:

我正在编写一个游戏,它发生在基于图块的地图上的2d随机生成的无限世界中(挑剔:我知道它不会真正无限.我只是期望世界变得非常大).地图的常用方法[X] [Y]多维数组开始了作为一个基本的想法,但由于Java不用于非整数提供了一种方法(即负)阵列关键有心计,如PHP做,我不能正确有( - x,+ x,-y,+ y)带数组键的坐标系.

我需要能够在特定的x,y坐标处找到瓷砖上的对象,以及找到某个瓷砖的"相邻瓷砖".(如果我可以getObjectAt(x,y),我可以获得(x + 1,y)等等)

我读过四棵树和R树等.这个概念很令人兴奋,但我还没有在Java中看到任何好的,简单的示例实现.此外,我不确定这是否是我所需要的.

欢迎任何建议

谢谢

dav*_*vin 6

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

2)如果你从一开始就知道你的世界的维度,你可以修改你的getter以允许API接受负数并[线性]将它们转换为正数.因此,例如,如果你的世界是100x1000个瓷砖而你想要(-5,-100),那么你可以将WorldMap.getTile(-5,-100)其转换return tileArray[x+mapWidth/2][y+mapHeight/2];为(45,400)


Lia*_*ray 5

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

为了克服这个问题,我没有在地图中使用地图(这将是凌乱和非常低效的),我使用了通用的Pair类(不是你在库存java库中找到的东西),尽管你可以用Position类替换它(几乎相同的代码,但不是通用的,而是整数或浮点数).

所以在定义地图时: Map<Pair, Tile> tiles = new HashMap<Pair, Tile>;

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

[x/y将是您想要放置的任何坐标(这允许负坐标,没有任何混乱!),"new GrassTile()"只是在地图创建期间放置某种类型的图块的示例.显然 - 如前所述 - Pair类是可替换的.

你为什么不问ArrayLists?因为数组列表比映射更加线性,并且在我看来更难以添加和检索切片,尤其是在2维上.

更新:

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