我遇到了使用ArrayList的问题。这是包含精灵的对象列表,这些精灵的颜色和位置彼此不同。列表成功返回,我可以使用foreach循环将它们全部绘制到屏幕上。之后,我正在检查是否有人点击了他们的位置,我想要返回该对象包含的颜色。问题是我总是把颜色变回绿色。可能是因为我引用了所有对象而不是单个对象。我搜索了这个网站,发现了类似的问题和教程。但我似乎无法找到修复代码所需的信息,以便我可以在使用foreach循环检查所有代码时引用列表中的单个实例。
在阅读答案并使用break和忘记的secondColor = true后,我仍然遇到同样的问题。即使将点击的对象发送到另一个功能,我的问题也无法解决。因此,我不是只显示用于读取列表的代码,而是显示列表填充时的代码。如何修复我在阅读列表时始终只引用绿色对象但是当使用for循环绘制时我得到的每种颜色????
for(KleurWissel i : gameManager.getColorsList())
{
i.colorRectangle.draw(batch);
}
//Welke kleuren kies je?
if(Gdx.input.isButtonPressed(Input.Buttons.LEFT)){
Iterator<KleurWissel> iterator = gameManager.getColorsList().iterator();
while(iterator.hasNext())
{
KleurWissel item = (KleurWissel) iterator.next();
if(item.getRectangle().contains(input.x, input.y))
{
if(firstColor == true && secondColor == false && item.selected == false)
{
colorArraySecond = item.colorArray;
colorArrayUsed = colorArrayFirst;
colorSelected = true;
item.selected = true;
secondColor = true;
break;
}
if(firstColor == false && item.selected == false){
colorArrayFirst = item.colorArray;
firstColor = true;
item.selected = true;
break;
}
}
}
}
这里是填写清单的代码。
private int[] colorsRGB = {0, 50, 150, 150, 200, 255};
float[] colorArrayUsed = new float[4];
private ArrayList<KleurWissel> colorsList = new ArrayList<KleurWissel>();
public void setColorsList()
{
Vector2 tempV;
KleurWissel temp;
for(int i = 0; i < 6; i++)
{
if(i<3)
{
colorArrayUsed[0] = colorsRGB[5-i];
colorArrayUsed[1] = colorsRGB[0+i];
colorArrayUsed[2] = 0;
colorArrayUsed[3] = 1;
tempV = new Vector2(Gdx.graphics.getWidth()/2 - 150 + i * 150, Gdx.graphics.getHeight()/2 + 130);
}
else{
if(i == 3)
{
colorArrayUsed[0] = 0;
colorArrayUsed[1] = 0;
colorArrayUsed[2] = colorsRGB[5];
colorArrayUsed[3] = 1;
tempV = new Vector2(Gdx.graphics.getWidth()/2 - 150, Gdx.graphics.getHeight()/2);
}
else{
colorArrayUsed[0] = 0;
colorArrayUsed[1] = colorsRGB[0+i];
colorArrayUsed[2] = colorsRGB[5-i];
colorArrayUsed[3] = 1;
tempV = new Vector2(Gdx.graphics.getWidth()/2 - 600 + i * 150, Gdx.graphics.getHeight()/2);
}
}
temp = new KleurWissel(colorArrayUsed, tempV);
colorsList.add(temp);
}
}
public ArrayList<KleurWissel> getColorsList()
{
return colorsList;
}
KleurWissel是色彩对象,对于荷兰语&gt;。抱怨。&gt;。
答案 0 :(得分:0)
根据评论编辑:
libGDX Rectangle
类有一个contains
方法,看起来这就是你手动检查的方法。您还可以打印一些信息,告诉您有关对象是否被击中的更多信息。
似乎预期的过程如下:
colorArrayFirst
colorArraySecond
,colorSelected
标记应设为true
以下代码显示了如何完成此操作。但问题仍然是这个信息将被“重置”。也就是说,何时将两个阵列重置为null
,何时将colorSelected
标志重置为false
?
private boolean colorSelected = false;
private int colorArrayFirst[] = null;
private int colorArraySecond[] = null;
void someGameLoopMethod()
{
if(Gdx.input.isButtonPressed(Input.Buttons.LEFT))
{
Iterator<ColorObject> iterator = gameManager.getColorsList().iterator();
while(iterator.hasNext())
{
ColorObject item = (ColorObject) iterator.next();
float x = Gdx.input.getX();
float y = Gdx.input.getY();
Rectangle r = item.colorRectangle;
System.out.println("Check if "+x+" "+y+" is in "+r+": "+r.contains(x,y));
if (r.contains(x,y))
{
clickedItem(item);
}
}
}
}
private void clickedItem(ColorObject item)
{
if (colorArrayFirst == null)
{
colorArrayFirst = item.colorArray;
}
else if (colorArraySecond == null)
{
colorArraySecond = item.colorArray;
colorSelected = true;
}
}
// TODO Think about when this method should be called
private void resetClickingInformation()
{
colorSelected = false;
colorArrayFirst = null;
colorArraySecond = null;
}
答案 1 :(得分:0)
原始问题中的逻辑很好,除了您需要添加
secondColor = true;
break;
在if(firstColor == true && secondColor == false)
区块内。
如果你不这样做,那么在设置第二种颜色之后,你将继续遍历ColorObject
个对象,寻找更多包含点击点的对象,直到最终,你得到到最后一个 - 大概跨越整个画布并且颜色为绿色。
break;
并非绝对必要,但它可以避免冗余迭代。