JavaFX:防止形状拖动到另一个形状上

标签 java javafx collision-detection shapes collision

我正在做一个JavaFX应用程序,并且我有一个面板,其中添加了多个形状(圆形和矩形)到 Pane 中。我不希望圆移动到矩形上。

允许使用鼠标事件(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");
    }
}

我需要做的是让我的矩形在拖动圆圈时无法拖动。我不想将形状发送回其初始位置。 有没有办法使用相交来做到这一点,或者我错过了什么?

最佳答案

这个问题并不容易回答。您可以拥有一个类,例如 GameObject。此类包含您的形状。在这个 GameObject 类中,您有拖放逻辑。然后你将有一个 GameObjectManager 类,其中包含所有游戏对象的列表。 GameObject 的每个实例都会有一个对此 GameObjectManager 的引用,因此也了解所有 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 方法中循环某些类型的对象。

关于JavaFX:防止形状拖动到另一个形状上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41025666/

相关文章:

java - 无法绑定(bind) ConnectionPoolDataSource 实例

java - 声明和直接归因之间的区别

java - 使用 JavaFx 从标签获取值?

创建按钮时 JavaFX 场景失去颜色

c++ - 视觉 C++ RECT 碰撞

java - 是否可以在一个类中同时实现 scala.collection.Seq[T] 和 java.util.List[T]

尝试创建 Button 时抛出 JavaFX InitationTargetException

java游戏-slick-碰撞处理

java - 如何修复碰撞响应中的圆圈重叠?

java - SQLException : ResultSet closed