我想在任何重叠期间筹集可变硬币。 问题是硬币是一个图像,不能只增加一次,使我硬币增加至少10/11次。 我的目标是删除图片,然后删除矩形,就像我在下面的代码中所做的那样。问题是,如果我删除矩形,我甚至不会识别硬币上的重叠。我该如何解决?
render()
....
if(!monetaRectangles.isEmpty() && !monetaImages.isEmpty()) {
for (int i = 0; i < monetaRectangles.size(); i++) {
monetaRectangles.get(i).setX(monetaImages.get(i).getX());
monetaRectangles.get(i).setY(monetaImages.get(i).getY());
if (surferRectangle.overlaps(monetaRectangles.get(i))) {
contatoreMonete++;
monetaRectangles.remove(i);
monetaImages.get(i).remove();
moneteLabel.setText("Monete: " + contatoreMonete);
}
}
}
...
end render()
持续时间dell'overlaps对象是一秒,所以我将变量增加到每个渲染都正确,你可能想解决?我缺乏逻辑
答案 0 :(得分:0)
您正在迭代它时对集合进行修改。 (使用libGDX集合以便不会每次都创建新的Iterator)
for (int i = 0; i < monetaRectangles.size(); i++) { //
monetaRectangles.get(i).setX(monetaImages.get(i).getX());// if you removed 'i' in the previous loop this will effectively get i+2 of the original
monetaRectangles.get(i).setY(monetaImages.get(i).getY());
if (surferRectangle.overlaps(monetaRectangles.get(i))) {
contatoreMonete++;
monetaRectangles.remove(i); //The semantics of 'i' is now changed.
monetaImages.get(i).remove();//also here
moneteLabel.setText("Monete: " + contatoreMonete);
}
}
在一组对象上使用迭代器,以保留图像和矩形之间的关系。然后你可以做Iterator.remove(),并继续正确迭代。
一些一般建议 - 您似乎试图让物理/游戏世界的“位置”与图像的“位置”保持同步,反之亦然。
我建议将游戏对象重新构建为“渲染数据”,“物理/世界数据”和“游戏逻辑数据/流程”的组合。然后,将公共属性集中在两者都可访问的组件中。位置是此类数据的常见候选者。现在,当您更新位置时,使用该位置的所有内容也会更新。
Ashley是一个帮助解决这个问题的LibGDX项目,它指出了这篇文章来解释它:entity systems