1

我在检查具有相同对象的列表中的对象时遇到问题。我有一个对象列表,其中包含不同类型的对象,例如子弹、敌人和随机背景对象。现在我想检查一些物体是否相互碰撞,比如子弹与敌人。问题是,当我将相同的 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
            }
        }
    }
}

解决方案:

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

4

2 回答 2

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

随着您的游戏世界变得越来越复杂,请考虑将对象放置在空间索引中。

于 2012-07-30T21:59:17.300 回答
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);
        }
    }
}

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

于 2012-07-30T22:02:13.887 回答