我想我一直在盯着这段代码而且我没有看到它。我正在写一个小游戏,其中一部分生成了许多对象(目前是形状)。在创建形状时,它们将作为类定义的对象添加到ArrayList中。我注意到随着形状数量的增加,形状重叠的可能性增加,我想修复。我试图通过检查Array坐标中每个现有对象的Y坐标的Y坐标来实现。但对于我的生活,我不记得继续迭代检查功能的方法,直到我生成唯一的Y值。
我的初始解决方案是do ... while循环,但由于某种原因它会一直返回true。
我简化了我的代码,只是保留了我的问题所必需的部分。我错过了什么?提前感谢您的帮助。
编辑:还要记住,随着游戏的进行,对象会不断添加到ArrayList中或从ArrayList中删除。每次在游戏过程中移除一个物体(形状)时,它都会被重新生成。这意味着对于游戏中创建的每个对象,都需要根据现有对象进行检查。
int x, y;
int numShapes = 10;
ArrayList<ShapeObject> soArray = new ArrayList<ShapeObject>();
private boolean checkY(int yy) {
for(int i = 0; i < soArray.size(); i++) {
if(soArray.get(i).oY == yy) {
return true;
}
}
return false;
}
public void makeShapes() {
for(int i = 0; i < numShapes; i++) {
if(soArray.size() < numShapes) {
x = rand.nextInt(width - 45) + 45;
do {
y = rand.nextInt(height - 4) + 2;
} while(checkY(y));
soArray.add(new ShapeObject());
}
}
}
class ShapeObject {
int oX = x;
int oY = y;
}
答案 0 :(得分:1)
尝试将班级结构更改为
class ShapeObject {
int oY = 0;
int oX = 0;
public ShapeObject(int x, int y)
{
oX = x;
oY = y;
}
}
然后你有
soArray.add(new ShapeObject(x, y));
如果我能指出一些有用的东西,我仍在查看你的代码。
也可以尝试
if(soArray.get(i).oY == yy) {
println(soArray.get(i).oY +' = '+ yy); //to debug
return true;
}
答案 1 :(得分:0)
由于我基本上自己解决了这个问题,所以我将其作为答案发布。
事实证明,我忘了我被画布的界限限制了。我的单元格大小为12px,网格为600px。我注意到它会在我的ArrayList中的46个对象之后失败。所以基本上所有可用的Y坐标都被采用了。我正在测试100个对象,所以它一直在运行。
我还将checkY()修改为checkXY(),这样我就可以完全控制对象可用的行数和列数(x和y坐标)。