[英]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.