我在使用相同对象检查列表中的对象时遇到问题。我有一个具有不同类型对象的对象列表,如子弹,敌人和随机背景对象。 现在我想检查一些物体是否相互碰撞,比如带有敌人的子弹。 问题是当我在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,用原始对象列表检查克隆列表,检查对象是否相同,如果不是,我会进行碰撞检查。
答案 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);
}
}
}
在我看来问题就在你的碰撞检测中。您可能有误报(在未发生碰撞的情况下检测到碰撞)