JavaFX:防止形状拖过另一个形状

时间:2016-12-07 19:22:48

标签: java javafx collision-detection shape collision

我正在做一个JavaFX应用程序,我有一个多个形状(圆形和矩形)的板添加到窗格。我不希望圆圈在矩形上移动。

允许使用鼠标事件(OnMousePressed,Dragged,Released)拖动圆圈,而不允许移动矩形。

我正在使用此代码来检测我的圆圈何时与矩形碰撞。

private void checkIntersection(Shape block) {
    boolean collisionDetected = false;
    for (Shape static_bloc : nodes) {
      if (static_bloc != block) {
        Shape intersect = Shape.intersect(block, static_bloc);

        if (intersect.getBoundsInLocal().getWidth() != -1) {
          collisionDetected = true;
        }
      }
    }

    if (collisionDetected) {
      System.out.println("Collision detected");
    } else {
        System.out.println("Collision non deteted");
    }
}

我需要做的是在拖动圆圈时无法拖动矩形。我不想将形状发回到他的初始位置。 有没有办法用相交来做这件事还是我错过了什么?

2 个答案:

答案 0 :(得分:1)

回答并不容易。你可以有一个类GameObject。这个类包含你的Shape。在这个GameObject类中,你有拖放逻辑。然后你将有一个类GameObjectManager,它包含所有GameObjects的列表。 GameObject的每个实例都会引用这个GameObjectManager,因此也知道所有GameObjects。因此,在移动逻辑中,您可以检查特定GameObject类型之间是否存在某些冲突,以及是否可以停止移动。

对于碰撞评估类,GameObject包含如下方法:

protected boolean isInCollision() {
    for (GameObject gameObject : gameObjectManager.getAllGameObjects()) {
        if (!gameObject.equals(this)) {
            if (getView().getBoundsInParent().intersects(gameObject.getView().getBoundsInParent())) {
                return true;
            }
        }
    }
    return false;
}

在您的情况下,您需要在此isInCollision方法中循环某些类型的对象。

答案 1 :(得分:0)

只想分享我的解决方案。

我想在移动完成之前检查节点 。因此,我修改了先前的解决方案,以创建以下解决方案。

节点类:我正在使用扩展Node的自定义Label类。这里使用的方法是从Label继承的方法。

   private boolean hasNoCollision(Node dragged, double x, double y) {
        // For each node
        for (Node n : nodes) {
            // If it is not the same, and future position overlaps
            if (!n.equals(dragged) &&
                    n.getBoundsInParent().intersects(x, y, dragged.getWidth(), dragged.getHeight())) {
                // Then prevent collission
                return false;
            }
        }
        // Otherwise all is good!
        return true;
   }