解释:
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 顶视图/前视图中执行此操作的方式。