2016-12-07 13 views
0

Я делаю приложение JavaFX, и у меня есть доска с несколькими фигурами (круги и прямоугольники), добавленные в панель. Я не хочу, чтобы круг перемещался по прямоугольнику.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"); 
    } 
} 

Что мне нужно сделать, так это сделать мой прямоугольник невозможным перетащить, перетаскивая круги. Я не хочу отправить форму обратно в свое первоначальное местоположение. Есть ли способ сделать это, используя intersect или я чего-то не хватает?

+0

@jewelsea, котор вы соединяете ведет к никуда. – Sedrick

+0

@Sedrick, спасибо, создал новый комментарий с правильной ссылкой. Возможно, изучите образец [Oracle Paper doll] (https://docs.oracle.com/javase/8/javafx/events-tutorial/paper-doll.htm). Хотя я предполагаю, что это точно не подходит вам. Я думаю, что ваш вопрос слишком широк, чтобы отвечать, как написано. Например, что происходит, когда вы перетаскиваете круг над Rectangle, он падает на край прямоугольника? он возвращается в исходное положение и т. д.? – jewelsea

+0

@jewelsea Спасибо за помощь, я проведу учебу. Я не хочу, чтобы моя фигура Круга вводила форму прямоугольника, поэтому теоретически я не должен позволять моему приложению перетаскивать круг по прямоугольнику (это не должно быть возможным). Я не хочу возвращаться в исходное положение или уходить по краю, я просто хочу, чтобы он блокировался и позволил мне перетащить еще и обойти прямоугольник, если захочу. –

ответ

0

Ответ не так-то просто. Вы можете иметь класс, например GameObject. Этот класс содержит вашу форму. В этом классе GameObject у вас есть перетаскивание логики &. Тогда u будет иметь класс 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.