2

解释:

EDIT3:大规模清理,因为没有明确解释。

我正在尝试用图块和实体构建 2D 级别。例如,实体是可以切割的树木。我需要为每个实体存储数据(例如,剩下多少个印章)。我希望它们具有更动态的位置(双打)和更动态的精灵宽度和高度。我的瓷砖是 32x32 像素,而我的树不会是一个瓷砖,而是一个高度大于宽度的精灵。

我希望在其他对象之前绘制更接近关卡顶部的对象。在这种情况下,树后面的角色将无法在树中或树前渲染。这种情况也适用于其他同类对象(如树)。我认为遍历实体并计算每个实体的位置可能效率太低,因为关卡中可能有很多实体。

当我做了一些研究时,我发现某些库允许存储对象及其在 MAP 中的位置(谷歌 Guava 中的 BiMap)。

问题:

  • 这是一种低效的方式吗.. 但是是否可以
    应用一些更改来提高渲染效率(如果是,可以优化什么)?
  • 或者这是呈现实体的低效方式,是否有更好的方式(如果有,Java 中还有哪些其他方法)?
  • 或者还有什么我没有列出的?

EDIT2:我查看了我在下面的编辑中发布的链接。似乎 Google 的 Guava(我认为这是正确的)有 BiMaps。在常规 Java 中是否有与此等价的功能?否则谷歌的图书馆可能会为我解决这个问题。但我宁愿不为这个界面安装如此庞大的库。

终于:

在 StackOverflow 或互联网上的其他地方,答案很可能就在我眼前。我已经尽力寻找,但一无所获。如果您对搜索查询或任何可能对我有用的相关链接有任何建议,如果您将它们发布在评论中,我会很高兴。

感谢您花时间阅读/帮助我;)

编辑:

我看过;Java中游戏实体位置的有效映射。我认为它与这个问题密切相关。但我认为这不是我想要的。我将非常仔细地查看第二个答案,因为这可能会为我解决这个问题..但我不确定。

解决方案

解决方案是使用数组、数组列表或其他方式来跟踪您的实体。每次滴答/更新,您将获取所有对象的 Y 坐标并将它们存储在另一个数组/arraylist/map/other 中,其大小与存储实体的位置相同。在实体的每个等效位置上,您将存储它是 Y . 然后你会用另一个循环或使用http://www.leepoint.net/notes-java/data/arrays/70sorting.html来订购它。

然后在渲染时:

for(int i = 0; i < entityArray.length; i++)
entityArray[i].render();

当然,您可以通过仅渲染屏幕上或屏幕附近的内容来更有效地渲染它。但这基本上就是在 2D 顶视图/前视图中执行此操作的方式。

4

1 回答 1

1

在我自己的 2d 游戏尝试中,我提出了以下解决方案:

  • 使用枚举来指定游戏中不同类型的对象并赋予它们优先级(示例顺序:草、河流、树木、小动物、角色、云、鸟、GUI)
  • 使所有可视对象实现允许获取此 DrawPriority 枚举的接口
  • 使用基于枚举的带有比较器的列表的排序实现
  • 使用列表绘制所有元素

这样,订单计算不是很昂贵,因为它只在插入可视对象时完成(在我的情况下,这是在加载关卡时完成的)。

.. 由于您已经使用了比较器,因此请在枚举优先级值相同时进行 ax/y 比较。这应该可以解决您的 y 顺序绘制问题。

于 2013-01-21T08:58:28.060 回答