我很难过,需要另外一双眼睛看这个。此代码正常工作,突然停止工作。基本上我正在向一个arraylist添加一个对象。当我正在构建列表时,我会观察它,并且似乎每次迭代都会添加一个唯一的对象。基本上是一个将出现在屏幕上的精灵及其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());
}
}
答案 0 :(得分:0)
bX = r.nextInt((int)(gameField.getWidth() - gameField.getWidth() / 4)+SCRN_MARGIN);
您正在尝试将整数分配给float。请检查一下,可能因为数字的四舍五入而产生问题
答案 1 :(得分:0)
您需要检查hashcode
课程的equals
和Sprite
实施情况。他们需要考虑Sprite
的相关字段,因此两个不同的字段不返回相同的哈希码或为equals返回true。我认为如果您使用默认实现(例如,不覆盖它),它会起作用,但实现一个肯定。在eclipse中,您可以选择Source
→Generate 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!");
}
顺便说一句:还有其他方法,比如使用Enum
或Map
这种模式。我只是认为使用switch/case
为一个逻辑位提供超过2个ifs。当然,默认情况处理不当,需要改进。
哦,还有一件事:你应该把方法名称写成小写/驼峰的情况。基本上每个Java程序员都以这种方式排除它。