增加render()中的变量并删除Rectangle和Image

时间:2016-01-11 15:40:54

标签: java libgdx render collision

我想在任何重叠期间筹集可变硬币。 问题是硬币是一个图像,不能只增加一次,使我硬币增加至少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对象是一秒,所以我将变量增加到每个渲染都正确,你可能想解决?我缺乏逻辑

1 个答案:

答案 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