【问题标题】:How to calculate what entity is drawn first (2D java rendering using Slick2D)如何计算先绘制什么实体(使用 Slick2D 进行 2D java 渲染)
【发布时间】:2013-01-21 08:32:52
【问题描述】:

说明:

EDIT3:MASSIVE CLEAN UP,因为没有明确解释。

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

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

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

问题:

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

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

最后:

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

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

编辑:

我看过; Efficient mapping of game entity positions in 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 顶视图/前视图中执行此操作的方式。

【问题讨论】:

  • 哦,是的;对于以后阅读本文时遇到相同问题的每个人:查看主要帖子。解决方案应该在那里!

标签: java


【解决方案1】:

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

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

这样顺序计算不是很昂贵,因为它只在插入可视对象时完成(在我的例子中是在加载关卡时完成的)。

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

【讨论】:

  • 谢谢,但这并不是我要寻找的。虽然它非常有用,但我会记住它以备后用(谢谢!;D)。假设我有 2 朵云。 (它们具有相同的 ENUM 值。)在这种情况下,我希望首先绘制更接近 (0.0, 0.0) (即坐标)的云,最后绘制靠近杠杆右下角的云。在这种情况下,例如一个人可以站在树前或树后。但是如果人比树更接近关卡的顶部,它将首先被绘制而不是被绘制在树中。
  • @JoannisO 添加了一条关于扩展比较器以考虑 y 坐标的说明
  • 除了 ENUM(我真的很感激,谢谢!)这对我来说是低效的方法。由于我现在已经将原始帖子编辑了 3 次,因此我认为现在可能更清楚了。我还添加了更多关于我已经搜索到的密切相关的信息。我对此还有一个问题:以“常规”方式存储实体并循环遍历它们以始终比较 Y 轴是否更有效(请记住,我可以存储其中的地图首先绘制实体)。还是将坐标存储在对象旁边更有效?
  • 你真的试过了吗?您是否分析了您的应用程序?如果没有,那么现在不要担心。如果是这样:您的对象是否经常改变它们的位置?如果没有,那么我的方法应该是有效的。一个近似有序列表的排序应该是接近 O(n) 的复杂度。我怀疑这对你来说是个问题。
  • 我想我明白了。我今天早些时候在某处使用谷歌找到了 2 页。我将在原始帖子中发布解决方案。感谢您对我的帮助,因为这是我在 StackOverflow 上的第一个问题。所以我真的不知道如何正确管理这样的问题。将您的方法与一两个本机 Java API 方法结合使用,我可以非常有效地做到这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-23
  • 2010-11-05
  • 1970-01-01
  • 1970-01-01
  • 2011-06-24
  • 2021-08-23
  • 2014-11-29
相关资源
最近更新 更多