如果发生碰撞,使用带有碰撞检测的java中的循环绘制多个矩形并更改其x和y坐标(随机)。

时间:2015-12-30 20:02:51

标签: java collision graphics2d graphic

做了很多谷歌搜索,但无法解决这个问题。 我想生成n个数字矩形并在屏幕上绘制它们。 X,Y是随机生成的,宽度和高度基于字体大小。我的目标是在随机定位的屏幕上绘制n个单词而不重叠现有矩形。我正在使用Rectangle进行碰撞检测。

private List<Rectangle> rectList = new ArrayList<Rectangle>();

public boolean checkForCollision(Rectangle r) {
    boolean collision = false;
    if (rectList.size() == 0) {
        rectList.add(r);
        System.out.println("Adding First");
        return collision;
    } else {

        // loop through the list
        Rectangle currRectangle;
        for (int i = 0; i < rectList.size(); i++) {
            currRectangle = rectList.get(i);
            if (r.intersects(currRectangle)) {
                System.out.println(r.toString());
                System.out.println(currRectangle.toString());
                System.out.println("=========================");

                return collision;

            }
        }
        System.out.println("No collision");
        rectList.add(r);
        return !collision;
    }
}

这就是我在创建矩形并在其上绘制单词所做的工作。我在这里使用循环。

        int width = graphics.getFontMetrics().stringWidth(temp.getWord());
        int height = graphics.getFontMetrics().getHeight();

        Rectangle newRectangle = new Rectangle(rand.nextInt(1250)+1,     rand.nextInt(650)+1, width, height);
        int xCordinate = (int)newRectangle.getX();
        int yCordinate = (int) newRectangle.getY();

        while(collisonChecker.checkForCollision(newRectangle)){
            //newRectangle = new Rectangle(rand.nextInt(1250)+1, rand.nextInt(650)+1, width, height);
            newRectangle.setLocation(rand.nextInt(1250)+1,rand.nextInt(650)+1);
            collisonChecker.checkForCollision(newRectangle);

        }
        graphics.drawRect((int)newRectangle.getX(), (int)newRectangle.getY(), (int)newRectangle.getWidth(), (int)newRectangle.getHeight());
        newRectangle.setLocation(rand.nextInt(1250)+1,rand.nextInt(650)+1);
        graphics.drawString(temp.getWord().trim(), (int)newRectangle.getX(),(int)newRectangle.getY() );

2 个答案:

答案 0 :(得分:0)

您永远不会更改您的返回值。无论如何,如果发生碰撞,该方法返回false。将你的返回值设置为true idle,for-loop中存在一个碰撞,应该解决问题

我希望至少有一点帮助

答案 1 :(得分:0)

好的,所以这看起来很奇怪&#34;给我......

while(collisonChecker.checkForCollision(newRectangle)){
    //newRectangle = new Rectangle(rand.nextInt(1250)+1, rand.nextInt(650)+1, width, height);
    newRectangle.setLocation(rand.nextInt(1250)+1,rand.nextInt(650)+1);
    collisonChecker.checkForCollision(newRectangle);
}
graphics.drawRect((int)newRectangle.getX(), (int)newRectangle.getY(), (int)newRectangle.getWidth(), (int)newRectangle.getHeight());
newRectangle.setLocation(rand.nextInt(1250)+1,rand.nextInt(650)+1);
graphics.drawString(temp.getWord().trim(), (int)newRectangle.getX(),(int)newRectangle.getY() );

您创建了一个新的Rectangle,检查了碰撞并开始循环true,在循环中更改了Rectangle的位置和检查碰撞但忽略返回结果......?但那不是更糟糕的部分......

一旦循环结束,你随机生成Rectangle的新位置,完全忽略你在循环中所做的所有工作......?

也许你应该做更像......的事情。

while(collisonChecker.checkForCollision(newRectangle)){
    newRectangle.setLocation(rand.nextInt(1250)+1,rand.nextInt(650)+1);
}

graphics.drawRect((int)newRectangle.getX(), (int)newRectangle.getY(), (int)newRectangle.getWidth(), (int)newRectangle.getHeight());
graphics.drawString(temp.getWord().trim(), (int)newRectangle.getX(),(int)newRectangle.getY() );