【问题标题】:2D Tiled Game Optimization in JavaJava中的2D平铺游戏优化
【发布时间】:2013-03-19 02:41:44
【问题描述】:

我正在用纯 Java 开发一个 2d 自上而下的游戏,直到现在我已经有了一个噪声映射系统,可以像 Minecraft 一样处理块块(和实体)。

我存储图块的方式是创建一个int[s * s] 数组,其中s 是块一侧的大小(以图块为单位)。然后,我有一个静态的 Tiles 数组,其中包含游戏中每个可能的 Tile,并用整数索引。这些是存储在每个块中int[s * s] 中的整数。现在,我希望能够覆盖图块,例如不可见的生成图块、墙壁、树木和过渡图块(例如当草变成沙子时:沙子上应该有草的边界,这将是一个新图块)。

问题是chunk的每个坐标只能存储一个整数。另一种方法是将瓦片的实际实例放在块内,并使覆盖的瓦片指向它们正下方的瓦片(如堆栈),但我认为这是一种不好的方法。我测试的另一种方法是制作一组瓷砖列表,这也很糟糕。

什么是完成此任务的好方法?

【问题讨论】:

    标签: java 2d storage tile


    【解决方案1】:

    通常,您会将磁贴和对象的存储分开。

    • 您可以为磁贴本身设置int [w*h] 或类似名称, 这将只允许每平方一个瓷砖。
    • 另外,你可以有一个ArrayList [w*h],它存储了一个列表 每个方格中的实体。此数组将包含 null 为空 方格,因此大多数方格的额外存储成本(即 其中没有实体)是最小的。

    当然还有其他方法,但这样做的优点是既简单又非常高效。

    唯一真正的缺点是您必须编写单独的代码来处理图块和实体 - 但由于您通常以不同方式处理图块和实体,因此这不太可能成为大问题。

    【讨论】:

    • 好吧,所以通过这样做,我必须将我的树、生成器等变成实体,这实际上是没有问题的。那很好。但是如果我想“混合”瓷砖怎么办?一个例子是从草到沙的过渡:我需要在沙瓦内有一种草的边界。我想做的是让这个边界成为一个新的瓷砖,然后把它画在沙子上,这需要在同一个地方有 2 个瓷砖(或者不需要?)。
    • 实现边框的几种方法:a) 只检测它们并在渲染时绘制它们 b) 将它们作为实体 c) 实现图块覆盖(每平方多个图块,如实体) d) 自动生成多个版本的带边框的瓷砖。我可能更喜欢 a) 通常,但 YMMV 取决于你的整体引擎设计和你想要的艺术灵活性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多