Поскольку вы перебираете одну и ту же коллекцию дважды, я почти уверен, что вы должны решить ее, создав список удаляемых элементов, а затем удаляя их после обнаружения всех коллизий.
Вроде так:
private boolean checkCollisions()
{
ArrayList<Sprite> toRemove = new ArrayList<Sprite>();
for (Sprite r1 : z_sorted_sprites)
{
for (Sprite r2 : z_sorted_sprites)
{
// ...
if (me.intersects(other))
{
// ...
toRemove.add(r1);
toRemove.add(r2);
}
else
{
// ...
}
}
}
z_sorted_sprites.removeAll(toRemove);
return collision;
}
Обратите внимание, что при столкновении двух спрайтов каждый из них добавляется в список toRemove
дважды. Вы можете предотвратить это и сделать свой цикл более эффективным, изменив свои циклы for следующим образом (при условии, что z_sorted_sprites
является List
):
for (int i = 0; i < z_sorted_sprites.size(); i++)
{
Sprite r1 = z_sorted_sprites.get(i);
for (int j = i + 1; j < z_sorted_sprites.size(); j++)
{
Sprite r2 = z_sorted_sprites.get(j);
// ...
}
}
Кроме того, вы уверены, что возвращаемое значение возвращает то, что вы думаете? В настоящее время он вернет false, если последние два спрайта в списке не столкнутся. Если вы хотите, чтобы он возвращал true, если есть какие-либо коллизии, избавьтесь от строки collision = false;
Возможно, было бы более полезно вернуть счетчик количества коллизий, но я оставлю это вам ...