2012-08-30 108 views
3

我正在使用LWJGL和Java 1.6一起编写一个2d自上而下的RPG游戏。到目前为止,我的渲染和输入方法工作正常,并开始编程游戏的逻辑。处理碰撞实体

所以我有一个名为World的类,它包含一个实体ArrayList。我想在游戏中实现简单的碰撞(使用相交正方形),这应该不成问题。我现在唯一的问题是如何访问我的列表中的单个单元格,而无需遍历它。我只能想出在每个实体中执行的碰撞​​方法,并遍历我的世界中的所有实体。这并不快,但我真的不知道该怎么做才能让它更快。

我的游戏是基于瓦,但运动不是瓷砖到瓷砖,一个能走小部分,避免了我只需使用二维数组...

有没有一个标准的方法处理实体及其碰撞? (或者可能是一种处理ArrayList内部实体之间碰撞的方法?)

+0

您的所有实体是否都位于2D平面上? 你如何跟踪他们的位置?有多少实体在同时移动?事实上,究竟有多少实体? – Vitaliy

+0

我无法确切知道有多少实体,但我认为通常会有500个实体同时移动。是的,所有的,都在飞机上。它们的位置在每个对象内都以双重形式存储。它被重新调整以适应瓷砖网格。 – Thiago

+0

好的,另一个问题是:你说“我现在唯一的问题是如何访问我的List中的单个单元,而不必遍历它。”您如何知道首先需要移动的部分? – Vitaliy

回答

1

处理碰撞实体的标准方法是空间分割。你的世界是由离散点组成的二维平面。 每件可以位于其中一个点上。点的数量决定了飞机的分辨率 - 点数越多,视觉效果越好,您需要执行的计算越多。这是权衡。

您可以维护实体的位置与实体本身之间的映射,其中位置由覆盖equals和getHashCode的对象表示。位置对象包含两个成员 - X和Y坐标。

注意 - 您必须以适当和有效的方式覆盖。

所以,如果你知道它的坐标,你可以非常快速地访问每个实体,重新洗牌只是删除一个实体并添加新的坐标(这可以针对本地进行优化)并且碰撞检测是微不足道的 - 只需检查相同位置被某个实体占用。

我也会在SO上提及你this question

+0

谢谢。那就是要走的路了=) – Thiago