我正在使用Java for Android编写2D平台游戏。
目前我拥有所有游戏实体(除了头像,存储在“实体”阵列数组中
Entity[][]
每当我需要检查某些东西时 - 例如我要在屏幕上绘制的内容或用于碰撞检测 - 我只是在头像周围抓取一小部分项目并使用继承和多态系统做任何事情。
问题是这意味着我只能将一个实体放在特定的网格坐标中。这在大多数情况下都是相当不错的 - 但是现在我有移动物品(例如敌人或移动块) - 当它们发生碰撞时,最终会相互删除,基本上它们会被覆盖。
那么我应该使用什么数据结构?我在考虑像
这样的东西ArrayList<Entity>[][]
但这会非常昂贵,浪费内存,因为重复的项目不是规则的例外。
我还在考虑将移动的项目分成他们自己的ArrayList
,然后循环遍历所有这些项目,但这是一个难看的解决方案。
那么关于我可以使用什么的任何想法?我想要的东西非常快,但内存不是很密集。
答案 0 :(得分:0)
用于存储实体的二维数组会浪费内存(大多数块不会被占用)并且不允许重叠实体,正如您所注意到的那样。只有很少的实体,一个简单的ArrayList(不涉及可见的数组)可能就足够了。
如果你有很多实体,你可以考虑四叉树数据结构或其他一些空间索引结构(检查http://en.wikipedia.org/wiki/Spatial_index)。
作为一种更简单,更“传统”的方法,如何保持实体的双层视图 - 所有活动(可见)视图的ArrayList,以及所有非活动的ArrayList(太远 - 远护理)?如果性能很重要,您可以对后者禁用碰撞检测,并对它们执行很少或不执行AI /维护。
答案 1 :(得分:0)
将实体保存为:
Entity[][]
假设您查找实体,例如:
Entity e = entities[i][j]
但是你要把敌人放在:
Map<String,List<Entity>> map
其中键是通过将i和j与随机中间字符连接而形成的字符串(例如,如果i == 1且j == 15,则为“1.15”)。现在你可以保持快速查找实体,并且在没有多余空间的情况下快速查找(尽管没有阵列一样快)敌人。