0

我被难住了,需要另一双眼睛来看看这个。此代码正在工作,但突然停止工作。基本上我将一个对象添加到一个数组列表中。当我构建列表时,我会观察它,它似乎每次迭代都会添加一个唯一的对象。基本上是一个将出现在屏幕上的精灵及其 x、y 坐标、颜色和速度。早些时候,这很有效,精灵会分散在屏幕上,现在它似乎复制了添加到列表中的最后一个对象,我运行循环的 X 次最终得到相同的对象。这没有任何意义......

第一个 println 语句打印传递给构造函数的内容。所以它打印出来。

球:1 x:123 y:344 颜色:蓝色 球:2 x:3 y 233 颜色:绿色 球 3 x:24 y: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

2 回答 2

0

您需要检查 您的课程hashcodeequals实施情况Sprite。他们需要考虑相关字段,Sprite因此两个不同的字段不会返回相同的哈希码或为相等返回 true。我认为如果您使用默认实现(例如不覆盖它),它会起作用,但要确保实现一个。在 Eclipse 中,您可以选择SourceGenerate hashCode() and equals()。如果你真的在使用,这应该没关系ArrayList(我在你的代码中没有看到)。

我同意@Sanket 的观点,将浮点数转换为整数可能是个问题。也许它只是看起来你每次都得到相同的?

此外,您应该使用enhanced for-loopJava 5。第二个循环可以这样重写(甚至可以按预期工作......):

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而不是四个 if。这实际上不会帮助您解决问题,但这只是一种糟糕的风格。看一看:

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!");
}

顺便说一句:还有其他方法,例如使用EnumMap用于这种模式。我只是认为使用switch/case. 当然,默认情况处理得不好,需要改进。

哦,还有一件事:你真的应该把方法名写成小写/驼峰式。基本上每个 Java 程序员都以这种方式除外。

于 2012-05-09T07:11:54.503 回答
0
bX = r.nextInt((int)(gameField.getWidth() - gameField.getWidth() / 4)+SCRN_MARGIN);

您正在尝试将整数分配给浮点数。请检查这个,可能是因为数字四舍五入而造成问题

于 2012-05-09T03:15:33.863 回答