使用相同的对象列表检查对象列表

时间:2012-07-30 21:37:17

标签: java android collision-detection libgdx

我在使用相同对象检查列表中的对象时遇到问题。我有一个具有不同类型对象的对象列表,如子弹,敌人和随机背景对象。 现在我想检查一些物体是否相互碰撞,比如带有敌人的子弹。 问题是当我在for循环中使用相同的对象放置相同的for循环时,我没有得到我期望的行为......任何人都知道更好的方法来处理这个问题吗?

左图显示子弹不再移动,右边显示我在循环中移除循环的情况。

https://www.dropbox.com/s/92tnxizxdneqgz3/ss1.png

编辑:从脚本中读取不同的字符串,我的目标是最大的灵活性。这也是我不想要每种类型对象的不同集合的原因。当我这样做时,碰撞正在发挥作用。

for (Object o : objects) {

    if (o.behavior.equals("aggressive")) {
        o.aggressive(ship.x, ship.y, ship.z);
    }

    if (o.behavior.equals("missile")) {
        o.missile();

        if (o.type.equals("bullet_player")) {
            for (Object n : objects) {
                             //doesn't matter what i put here
            }
        }
    }
}

解决方案:

我得到了它的工作,问题似乎在于将arraylist的for循环嵌套在另一个中。我最后做的是:我克隆了arraylist,用原始对象列表检查克隆列表,检查对象是否相同,如果不是,我会进行碰撞检查。

2 个答案:

答案 0 :(得分:3)

标准方法是这样,它将比较每个配对一次:

for(int i=0; i<objects.size(); i++)
    for(int j=i+1; j<objects.size(); j++)
        //.... compare objects[i] and objects[j] for collision etc

随着您的游戏世界变得更加复杂,请考虑将对象放在spatial index中。

答案 1 :(得分:0)

嵌套循环应该不是问题。下面的示例,我在同一个集合上运行一些迭代器,按预期工作:

public static void main(String a[]) {
    List<String> strings = Arrays.asList("a", "b", "c");
    for (String s: strings) {
        for (String t:strings) {
            System.out.println(s + "/" + t);
        }
    }
}

在我看来问题就在你的碰撞检测中。您可能有误报(在未发生碰撞的情况下检测到碰撞)