处理碰撞实体

3
我正在使用Java 1.6和LWJGL开发2D顶视角RPG游戏。目前为止,我的渲染和输入方法都有效,并且刚开始编写游戏逻辑。我的World类包含一个实体列表的ArrayList。我想在游戏中实现简单的碰撞检测(使用相交正方形),这应该不成问题。我唯一遇到的问题是如何访问List中的单个单元格,而不必迭代整个列表。我只能想到在每个实体内执行并迭代整个World中所有实体的碰撞检测方法。这样做速度很慢,但我真的不知道该怎么做才能更快地完成。
我的游戏基于瓦片,但移动不是基于瓦片的,可以移动较小的部分,这使我无法使用二维数组...
是否有标准的方法来处理实体及其碰撞?(或者是否有处理位于ArrayList中的实体之间碰撞的方法?)

我无法确定有多少个实体,但通常会有500个实体同时移动。是的,它们全部在平面上。它们的位置存储为每个对象内部的双精度浮点数。它被重新缩放以适应瓦片网格。 - Thiago
好的,另一个问题:你说“我现在唯一的问题是如何访问我的列表中的单个单元格,而不必遍历整个列表。”那么你怎么知道需要移动的那一部分呢? - Vitaliy
如果输入处理程序假定某个状态,则玩家会移动,我的计划是在“打勾”时随机移动其他实体。我的游戏每秒钟进行60次打勾,这几乎更新了所有相对于玩家处于某一范围内的实体。我应该使用列表的列表将它们变成二维的吗?然后实体会在列表内移动,一旦它们的x和y位置改变其整数部分。通过这样做,我将直接访问这些单元格,其中有一些实体,并与它们一起处理碰撞。 - Thiago
抱歉,我是指那些与玩家在特定范围内的物体。我正在用手机打字... - Thiago
你的问题最好在游戏开发SE上提问。这里是为什么 - WarrenT
显示剩余2条评论
1个回答

1
处理碰撞实体的标准方法是使用空间划分。您的世界是由离散点构成的二维平面。每个物件可以位于其中一个点上。这些点的数量决定了平面的分辨率,点越多,视觉效果越好,需要执行的计算量也就越大。这是一种权衡。
您可以维护一个地图,将实体的位置和实体本身映射起来,其中位置由覆盖 equals 和 getHashCode 的对象表示。位置对象包含两个成员- X 和 Y 坐标。
注意- 您必须以适当且高效的方式进行覆盖。
因此,如果您知道其坐标,可以非常快速地访问每个实体,重新排序仅需删除实体并添加具有新坐标的实体(可以优化为局部性),而碰撞检测则很简单- 只需检查某个实体是否占用相同的位置。
我还要参考 SO 上的 this question

谢谢。那就是正确的方法了 =) - Thiago

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接