我正在 slick2d 中开发一个 2d 侧滚轮,我希望它是基于图块的,但我真的不知道如何存储图块。我的游戏有无限动态生成的地形并且是可交互的(有点像我的世界和泰拉瑞亚的混合体)。我目前正在使用
Map < Integer, Map < Integer, Tile > >
对象,但它似乎不正确,因为我需要动态世界加载和生成。我正在将 JBox2d 用于物理。
有没有更好的方法以更有效的方式存储数据,因为只有世界的一部分应该被加载,因为世界的大小可以变得无限大
我正在 slick2d 中开发一个 2d 侧滚轮,我希望它是基于图块的,但我真的不知道如何存储图块。我的游戏有无限动态生成的地形并且是可交互的(有点像我的世界和泰拉瑞亚的混合体)。我目前正在使用
Map < Integer, Map < Integer, Tile > >
对象,但它似乎不正确,因为我需要动态世界加载和生成。我正在将 JBox2d 用于物理。
有没有更好的方法以更有效的方式存储数据,因为只有世界的一部分应该被加载,因为世界的大小可以变得无限大
你应该看看 cunk-approach(像 Minecraft 这样的游戏有块是有充分理由的)。选择一个块大小(例如 8x8)并创建一个块数据结构(类)。在块内,如果可能(更快),您可以将静态图块存储在普通 Array[][] 中,或者,如果需要,存储在 ArrayList 中。
public class Chunk
{
private int xPosition;
private int yPosition;
private Tile[][] staticTiles;
private ArrayList<Tile> dynamicTiles;
...
public boolean isInRenderRange()
{
...
}
public boolean isInUpdateRange()
{
...
}
...
}
然后您可以继续创建 Level 数据结构。我会推荐一个基本的 ArrayList 之类的东西,您可以在其中添加和删除元素。您可以在更新和渲染方法中迭代所有元素(块)并检查 isInRenderRange() 和 isInUpdateRange()。
这将使您不必处理非常复杂的数据结构,如多链表。您可以在向后、向前、向上或向下移动时更改每个块的 x- 和 yPosition。块内的每个图块都应该引用它们所在的块,以便获得它们的绝对位置。
如果您有大量的块,您可以不时对 ArrayList 进行排序,以在广泛的渲染和更新调用中使用分支预测。
如果您只滚动一种方式(如马里奥 1),那么您需要一个表示从左到右转换的链表之类的东西。在链表中的每个节点处,您需要一个瓦片数组(或可能是一个结构),这些瓦片表示一个水平点的从上到下的瓦片。然后你持有一个指向当前节点的链接(即屏幕左侧的垂直结构),每次重绘你从链表中的当前点向前移动,在你移动时绘制垂直条。
如果您想向后移动(如马里奥 3),您需要一个双向链表类型的结构,以便您的起始指针可以向后移动。
向上和向下将需要更复杂的结构或更小的链表结构的垂直表示。