Java引用单个ArrayList实例

时间:2014-04-20 11:12:03

标签: java object collections arraylist foreach

我遇到了使用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;。

2 个答案:

答案 0 :(得分:0)

根据评论编辑:

libGDX Rectangle类有一个contains方法,看起来这就是你手动检查的方法。您还可以打印一些信息,告诉您有关对象是否被击中的更多信息。

似乎预期的过程如下:

  • 点击第一个项目时,其颜色应存储为colorArrayFirst
  • 点击第二项时,其颜色应存储为colorArraySecondcolorSelected标记应设为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;并非绝对必要,但它可以避免冗余迭代。