1

我想我一直盯着这段代码太久了,我没有看到它。我正在编写一个小游戏,其中一部分会生成许多对象(当前为形状)。创建形状后,它们将作为类定义的对象添加到 ArrayList 中。我注意到随着形状数量的增加,重叠形状的机会增加,我想解决这个问题。我试图通过检查 ArrayList 中每个现有对象的 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;
}
4

2 回答 2

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;
}
于 2012-08-08T21:05:24.083 回答
0

由于我基本上是自己解决了这个问题,因此我将其发布为答案。

原来我忘记了我受到画布边界的限制。我的单元格大小是 600 像素网格上的 12 像素。我注意到它会在我的 ArrayList 中有 46 个对象后失败。所以基本上所有可用的 Y 坐标都被取走了。我正在测试 100 个对象,所以它一直在运行。

我还将 checkY() 修改为 checkXY() 以便我可以完全控制对象可用的行数和列数(x 和 y 坐标)。

于 2012-08-17T16:27:39.530 回答