Java:迭代寻找未使用过的坐标点?
Java: Iteration to find a coordinate point that hasn't been used?
我正在使用以下方法尝试找到以前未使用过且不在以前使用过的项目和坐标范围内的点(坐标)。
它的工作方式是我正在渲染 "bases"(RTS 自上而下游戏),我正在为 x 和 y 创建两个随机变量位置。我将这些与基础纹理一起传递到以下方法中。该方法循环遍历一个矩形列表,这些矩形是每个先前渲染的基础的矩形。如果该点位于任何矩形内,则使用另一组坐标再次调用该方法。它会一直这样做,直到找到一个不在矩形内的集合。然后它会在这些坐标处向列表中添加一个新的矩形,然后 returns 它们使游戏可以渲染一个新的基地。
但是,碱基仍然重叠。
方法如下:
private Point getCoords(int x, int y, Texture t){
for (int i=bases.size()-1; i> -1; i--) {
if (bases.get(i).contains(new Point(x,y))){
x = new Random().nextInt(map.getWidth() * map.getTileWidth());
y = new Random().nextInt(map.getHeight() * map.getTileHeight());
getCoords(x, y, t);
}
}
bases.add(new Rectangle(x,y,t.getImage().getWidth(), t.getImage().getHeight()));
return new Point(x, y);
}
这里是它被调用的地方:
switch(ran){
default:
int x = new Random().nextInt(map.getWidth() * map.getTileWidth());
int y = new Random().nextInt(map.getHeight() * map.getTileHeight());
Point p = getCoords(x, y, temp);
map.generateBase("air", p.x, p.y);
break;
}
知道这里出了什么问题吗?
谢谢
int x = new Random().nextInt(map.getWidth() * map.getTileHeight());
可能是一个错误的复制粘贴。可能是:
int x = new Random().nextInt(map.getWidth() * map.getTileWidth());
在两个代码中:-D
有几个问题:
您的算法可能会用错误的坐标覆盖好的坐标(自由坐标),如果您找到合适的位置,则没有任何条件可以退出 loop/recursion
你正在检查矩形是否包含点,但后来你添加了一个矩形,所以它可能不包含点,但后来创建的矩形可能会碰撞
试试这个
private Point getCoords(int x, int y, Texture t){
boolean found = false;
final int width = map.getTileWidth();
final int height = map.getTileHeight();
while(!found) {
x = new Random().nextInt(map.getWidth() * width);
y = new Random().nextInt(map.getHeight() * height);
for (int i=bases.size()-1; i> -1; i--) {
if (!bases.get(i).intersects(new Rectanble(x,y, width, height))){
found = true;
} else found = false;
}
}
bases.add(new Rectangle(x,y,t.getImage().getWidth(), t.getImage().getHeight()));
return new Point(x, y);
}
*** 编辑:我不确定我是否必须为 width
和 height
使用 TileWidth 和 TileHeight 或图像宽度和图像高度 :D
好的,经过一番尝试后,我发现问题是保存的矩形保存在固定位置,这意味着随着地图移动,矩形不会。解决方法是循环遍历每个基地并获取基地的地图位置,而不是屏幕位置,然后进行检查。另外,我发现我正在检查矩形中的一个点,它可能在矩形之外,但我的底边仍然重叠。所以我现在改为检查矩形-矩形碰撞
我正在使用以下方法尝试找到以前未使用过且不在以前使用过的项目和坐标范围内的点(坐标)。
它的工作方式是我正在渲染 "bases"(RTS 自上而下游戏),我正在为 x 和 y 创建两个随机变量位置。我将这些与基础纹理一起传递到以下方法中。该方法循环遍历一个矩形列表,这些矩形是每个先前渲染的基础的矩形。如果该点位于任何矩形内,则使用另一组坐标再次调用该方法。它会一直这样做,直到找到一个不在矩形内的集合。然后它会在这些坐标处向列表中添加一个新的矩形,然后 returns 它们使游戏可以渲染一个新的基地。
但是,碱基仍然重叠。
方法如下:
private Point getCoords(int x, int y, Texture t){
for (int i=bases.size()-1; i> -1; i--) {
if (bases.get(i).contains(new Point(x,y))){
x = new Random().nextInt(map.getWidth() * map.getTileWidth());
y = new Random().nextInt(map.getHeight() * map.getTileHeight());
getCoords(x, y, t);
}
}
bases.add(new Rectangle(x,y,t.getImage().getWidth(), t.getImage().getHeight()));
return new Point(x, y);
}
这里是它被调用的地方:
switch(ran){
default:
int x = new Random().nextInt(map.getWidth() * map.getTileWidth());
int y = new Random().nextInt(map.getHeight() * map.getTileHeight());
Point p = getCoords(x, y, temp);
map.generateBase("air", p.x, p.y);
break;
}
知道这里出了什么问题吗?
谢谢
int x = new Random().nextInt(map.getWidth() * map.getTileHeight());
可能是一个错误的复制粘贴。可能是:
int x = new Random().nextInt(map.getWidth() * map.getTileWidth());
在两个代码中:-D
有几个问题:
您的算法可能会用错误的坐标覆盖好的坐标(自由坐标),如果您找到合适的位置,则没有任何条件可以退出 loop/recursion
你正在检查矩形是否包含点,但后来你添加了一个矩形,所以它可能不包含点,但后来创建的矩形可能会碰撞
试试这个
private Point getCoords(int x, int y, Texture t){
boolean found = false;
final int width = map.getTileWidth();
final int height = map.getTileHeight();
while(!found) {
x = new Random().nextInt(map.getWidth() * width);
y = new Random().nextInt(map.getHeight() * height);
for (int i=bases.size()-1; i> -1; i--) {
if (!bases.get(i).intersects(new Rectanble(x,y, width, height))){
found = true;
} else found = false;
}
}
bases.add(new Rectangle(x,y,t.getImage().getWidth(), t.getImage().getHeight()));
return new Point(x, y);
}
*** 编辑:我不确定我是否必须为 width
和 height
使用 TileWidth 和 TileHeight 或图像宽度和图像高度 :D
好的,经过一番尝试后,我发现问题是保存的矩形保存在固定位置,这意味着随着地图移动,矩形不会。解决方法是循环遍历每个基地并获取基地的地图位置,而不是屏幕位置,然后进行检查。另外,我发现我正在检查矩形中的一个点,它可能在矩形之外,但我的底边仍然重叠。所以我现在改为检查矩形-矩形碰撞