-1

我正在使用以下方法来尝试找到以前没有使用过的点(坐标),并且不在以前使用过的项目和坐标的范围内。

它的工作方式是我正在渲染“基础”(RTS 自上而下的游戏),并且我正在为 x 和 y 创建两个随机变量位置。我将这些与基础纹理一起传递到以下方法中。该方法循环通过一个矩形列表,这些矩形是每个先前渲染的基础的矩形。如果该点在任何矩形内,则使用一组不同的坐标再次调用该方法。它会这样做,直到找到不在矩形内的集合。然后它在这些坐标处添加一个新的矩形到列表中,并返回它们以便游戏可以渲染一个新的基础。

但是,基础仍然重叠。

这是方法:

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;
        }

任何想法这里有什么问题?

谢谢

4

3 回答 3

1
            int x = new Random().nextInt(map.getWidth() * map.getTileHeight());

也许是一个糟糕的复制粘贴。它可能是:

            int x = new Random().nextInt(map.getWidth() * map.getTileWidth());

在这两个代码中:-D

于 2016-02-19T14:13:12.460 回答
1

有几个问题:

  • 你的算法可能会用错误的坐标覆盖好的坐标(自由坐标),如果你找到一个好地方,你没有任何条件退出循环/递归

  • 您正在检查矩形是否包含该点,但稍后您要添加一个矩形,因此它可能不包含该点,但稍后创建的矩形可能会发生碰撞

尝试这个

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

*** 编辑:我不确定我是否必须使用 TileWidth 和 TileHeight 或图像宽度和图像高度widthheight:D

于 2016-02-19T14:39:54.950 回答
0

好的,所以在玩了一些之后,我发现问题是保存的矩形保存在一个固定的位置,这意味着随着地图的移动,矩形不会。解决方法是遍历每个基地并获取基地的地图位置,而不是屏幕位置,并检查这一点。另外,我发现我正在检查矩形中的一个点,该点可能在矩形之外,但我的底部仍然重叠。所以我现在改为检查矩形 - 矩形碰撞

于 2016-02-19T15:15:53.913 回答