2012-05-09 79 views
0

我很難過,需要另一雙眼睛來看看這個。此代碼正在工作,並突然停止工作。基本上我將一個對象添加到數組列表中。當我構建列表時,我會觀察它,並且似乎每次迭代都會添加一個獨特的對象。基本上會出現在屏幕上的精靈和它的x,y座標,顏色和速度。早些時候這個工作,並且精靈將出現在屏幕上,現在它似乎複製了添加到列表中的最後一個對象,X運行循環的次數我最終得到了相同的對象。這沒有任何意義...引用一個java列表總是返回最後一個元素

第一個println語句打印什麼傳遞給構造函數。所以它打印出來如此。

球:1×123 Y:344顏色:藍色 球:2×:3 Y 233顏色:綠色 球3×:24歲:3顏色:藍

一切看起來大爲止。然後,我居然打印列表來安慰我得到

球:1 X:24 Y:3顏色:藍色 球:1 X:24 Y:3顏色:藍色 球:1 X:24 Y:3顏色:藍色

哪就在於此,我想弄清楚這是爲什麼發生的問題...

//When I create the List Eclipse refused to accept it until I initialized it like so... 

    java.util.List <Sprite> sprite = new java.util.ArrayList<Sprite>();  
    //yes I did import java.util.*; Eclipse still was digging it. This was working correctly despite the way i added it. I also changed this to a Vector which Eclispe was more content with with no effect. 

    private void GenerateSprites(){ 
     //Random to keep it random 
     Random r = new Random(System.currentTimeMillis()); 
     //variables for selecting and setting color 
     Color color = null; 
    int colorValue; 
    //variables for their x,y coordinates 
    float bX = 0; 
    float bY = 0; 
    //Create each ball set the color and generate the x,y coordinates 
    for (int x = 0; x < NUM_BALLS; x++){ 
     colorValue = r.nextInt(4); 
     if (colorValue == 0) color = Color.BLUE; 
     if (colorValue == 1) color = Color.RED; 
     if (colorValue == 2) color = Color.YELLOW; 
     if (colorValue == 3) color = Color.GREEN; 

     bX = r.nextInt((int)(gameField.getWidth() - gameField.getWidth()/4)+SCRN_MARGIN); 
     bY = r.nextInt((int)(gameField.getHeight() - gameField.getHeight()/4)+SCRN_MARGIN); 

     //place the new ball in the gameField 
    //print the values being passed to the sprite constrcutor for debug purposes. The out put of this line indicates that all is well at this point.    
System.out.println("Ball: " + x + " X: " + bX+ " Y: " + (bY+SCRN_MARGIN) + " Color: " + color.toString()); 
     gSprite.add(new Sprite((float)bX, (float)bY+SCRN_MARGIN, BALL_SIZE, color)); 

    } 
    //Now that the sprites are added to this list print out the list. When this line executes it shows a list of NUM_BALLS all of which have the exact sdame vlaues as the last sprite added earlier. 
    for (int x = 0; x < gSprite.size(); x++){ 
     Sprite spr = gSprite.get(x); 

    System.out.println("Ball: " + x + " X: " + spr.getX()+ " Y: " + spr.getY() + " vX: " + spr.getvX() + " vY: " + spr.getvY() + " Color: " + spr.getColor().toString()); 
    } 

} 
+4

「此代碼正在工作,並突然停止工作」...你有什麼改變?代碼永遠不會停止*神奇地工作。 – talnicolas

+0

如果有異常,請添加堆棧跟蹤... – Crazenezz

+0

每當您運行此代碼時,什麼打印到控制檯? –

回答

0
bX = r.nextInt((int)(gameField.getWidth() - gameField.getWidth()/4)+SCRN_MARGIN); 

你要轉讓的整數浮動。請檢查這一點,可能是因爲數字四捨五入造成的問題

+0

我走過去並檢查了這段代碼,現在鑄件都是正確的。仍然沒有' – ACantrell

0

您需要檢查hashcodeequals實施您的Sprite類。他們需要考慮Sprite的相關字段,因此兩個不同的哈希碼不會返回相同的哈希碼,或者返回true來表示等於。我認爲它適用於你使用默認實現(例如不覆蓋它),但實現一個確定。在日食中,您可以選擇SourceGenerate hashCode() and equals()。這應該不重要,但如果你真的使用ArrayList(我沒有看到你的代碼)。

我同意@Sanket,它可能是一個浮點數轉換爲整數的問題。也許它看起來像你每次都得到相同的一個?

此外,您應該使用Java 5,第二個循環的enhanced for-loop可以改寫這樣的(如預期那麼甚至可能工作... ...):

int x = 0; 
for (Sprite spr : gSprite){ 
    System.out.println("Ball: " + x + " X: " + spr.getX()+ " Y: " + spr.getY() + " vX: " + spr.getvX() + " vY: " + spr.getvY() + " Color: " + spr.getColor().toString()); 
    x++; 
} 

而且,最後但並非最不重要的,你應該真的使用switch/case而不是四個ifs。這實際上不會幫助你的問題,但它只是不好的風格。請看:

switch (colorValue) { 
     case 0: 
      color = Color.BLUE; 
      break; 
     case 1: 
      color = Color.RED; 
      break; 
     case 2: 
      color = Color.YELLOW; 
      break; 
     case 3: 
      color = Color.GREEN; 
      break; 
     default: 
      throw new RuntimeException("Unexpected color!"); 
} 

BTW:還有其他的方法,如使用Enum或這種模式的Map。我只是認爲使用switch/case有一個邏輯比特的優點超過2個ifs。當然,默認情況下處理不好,需要改進。

哦,還有一件事:你應該真的寫方法名小寫/駱駝大小寫。基本上每個Java程序員都是這樣的。

+0

感謝您的建議我通常遵循這些標準這是相當粗糙的代碼,我一直在轉換到更多的最終決定。問題基本上是這個方法添加到列表精靈的項目。它將五個精靈添加到這個列表中,並且它們似乎都是唯一的,但是當我稍後訪問列表時,它們都將最後一個精靈的值添加到列表中......我寫這篇文章是因爲它在之前和之後工作知道我在路上做了一些事情,但我無法弄清楚我做了什麼。在我開始搞亂之前,我可能應該複製一份。 – ACantrell

相關問題