2016-01-11 22 views
0

我想在任何重叠期间抬起一个可变硬币。 问题是,硬币是一个图像,不能只增加一次,使我的硬币增加至少10/11倍。 我的目标是删除图片,然后是矩形,就像我在下面的代码中所做的一样。问题是,如果我删除矩形,那么我甚至都不知道硬币上的重叠。我该如何解决?在render()中增加变量并删除矩形和图像

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

商店另一名单上删除矩形? – Sneh

+0

不,我不把矩形存储在另一个列表 –

+0

我向你推荐这种技术。 – Sneh

回答

0

您在迭代时正在修改集合。 (使用libGDX集合,使新的迭代器不创建每次)

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(),并进行正确的迭代。

一些一般性建议 - 看起来你试图保持你的物理/游戏世界的'位置'与图像'位置'同步,反之亦然。

我建议您重新构建您的游戏对象,以便成为“渲染数据”,“物理/世界数据”和“游戏逻辑数据/流程”的组合。然后,集中两个组件可以访问的组件中的公共属性。职位是这类数据的常见人选。现在,当你更新位置时,所有使用该位置的信息也会更新。

阿什利是一个LibGDX项目,有助于这一点,并在这篇文章指出了解释:entity systems