簡體   English   中英

Java引用單個ArrayList實例

[英]Java referencing to single ArrayList instance

我正在使用的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是彩色對象,對於荷蘭語>。>有點抱歉。

根據評論進行編輯:

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;
}

您原始問題中的邏輯很好,只是您需要添加兩個

secondColor = true;
break;

在塊內部使用if(firstColor == true && secondColor == false)

如果您不這樣做,那么在設置第二種顏色之后,您將繼續遍歷ColorObject對象,尋找更多包含被單擊點的對象,直到最終找到最后一個-大概是最后一個橫跨整個畫布,顏色為綠色。

break; 並非絕對必要,但這可以避免重復迭代。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM