java - 侧向卷轴上使用什么瓷砖存储结构?

标签 java dictionary tile side-scroller

我正在 slick2d 中开发一个 2d 侧滚动器,我希望它是基于图 block 的,但我真的不知道如何存储图 block 。我的游戏有无限动态生成的地形并且是可交互的(有点像《我的世界》和《泰拉瑞亚》的混合体)。我目前正在使用

Map < Integer, Map < Integer, Tile > >

对象,但它似乎不正确,因为我需要动态世界加载和生成。我正在使用 JBox2d 进行物理研究。

有没有更好的方法来以更有效的方式存储数据,因为世界大小可能变得无限大,所以只需要加载世界的一部分

最佳答案

你应该看看 cunk-approach(像《我的世界》这样的游戏有 block 是有充分理由的)。选择 block 大小(例如 8x8)并创建 block 数据结构(类)。在 block 内部,如果可能(更快),您可以将静态图 block 存储在普通 Array[][] 中,或者如果需要,可以存储在 ArrayList 中。

public class Chunk
{
   private int xPosition;
   private int yPosition;

   private Tile[][] staticTiles;
   private ArrayList<Tile> dynamicTiles;

   ...

   public boolean isInRenderRange()
   {
       ... 
   }

   public boolean isInUpdateRange()
   {
       ...
   }

   ...
}

然后您可以继续创建关卡数据结构。我会推荐类似基本 ArrayList 的东西,您可以在其中添加和删除元素。您可以迭代更新和渲染方法中的所有元素( block )并检查 isInRenderRange() 和 isInUpdateRange()。

这将为您带来不必处理非常复杂的数据结构(如多链接列表)的好处。当向后、向前、向上或向下移动时,您只需更改每个 block 的 x 和 y 位置即可。 block 内的每个图 block 都应该有对其所在 block 的引用,以便获得它们的绝对位置。

如果您有大量的 block ,您可以偶尔对 ArrayList 进行排序,以便在广泛的渲染和更新调用中使用分支预测。

关于java - 侧向卷轴上使用什么瓷砖存储结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25039798/

相关文章:

java - JTable 排序在单元格中没有好的值(value)

java - 如何居中 TChart 标题?

java - hibernate session ID

python - 在 Python 中使用字典代替动态变量名

c# - 字典更新线程安全

python - 在python中将所有列表值连接到一个数组

google-maps-api-3 - Google Maps API V3 - 自定义图 block

java - 在 Java/Spring 中使用 Exchange() 将 Json 转换为对象

c++ - SFML 平铺 vector 下标超出范围

带 Tiles 的 ListView 在 Flutter 中不起作用