2017-01-23 1 views
0

JavaFX에서 두 도형 간의 충돌을 감지하려고하는데이 방법이 작동하지 않습니다. 두 모양의 노드를 검색하고 교차 방법을 사용하여 위치를 비교합니다. 여기서 무엇을 바꿀 수 있습니까? 고맙습니다!JavaFX 두 도형 교차 - 충돌 방법이 작동하지 않습니다.

public void collisionDetection() { 
     if (_circle.getNode().intersects(_square.getRect().getX(), _square.getRect().getY(), 100.0, 30.0)) { 
     System.out.println("collision detected"); 
     } 
    } 
} 
+0

이 링크를 확인할 수 있습니까? http://stackoverflow.com/questions/20840587/how-to-use-intersect-method-of-node-class-in-javafx – GltknBtn

답변

0

의견 (How to use intersect() method of Node Class in JavaFX?)에서 언급 된 다른 질문에 대한 대답은 정확하지 않습니다. Node # intersects (Bounds) 메소드는 다른 노드의 로컬 경계를 입력으로 사용하지 않고 대신 호출 노드의 로컬 좌표계 내에서 다른 노드의 경계를 취합니다. 난 당신이 더 나은 충돌 감지를 이해하기 위해 놀 수있는 충돌 감지 응용 프로그램을 만들었습니다

if (_circle.intersects(
     _circle.sceneToLocal(_square.localToScene(
      _square.getBoundsInLocal()))) { 
    // ... 
} 
0

을 다음과 같이 따라서, 충돌을 감지 할 수하기 위해 경계를 변환해야합니다.

홈페이지 :

import javafx.application.Application; 
import javafx.fxml.FXMLLoader; 
import javafx.scene.Parent; 
import javafx.scene.Scene; 
import javafx.stage.Stage; 

/** 
* 
* @author blj0011 
*/ 
public class CollisionDection extends Application { 

    @Override 
    public void start(Stage stage) throws Exception { 
     Parent root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml")); 

     Scene scene = new Scene(root); 

     stage.setScene(scene); 
     stage.show(); 
    } 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     launch(args); 
    } 

} 

FXML :

<?xml version="1.0" encoding="UTF-8"?> 

<?import java.lang.Double?> 
<?import javafx.scene.control.Label?> 
<?import javafx.scene.layout.AnchorPane?> 
<?import javafx.scene.shape.Polygon?> 

<AnchorPane id="AnchorPane" fx:id="apMain" prefHeight="446.0" prefWidth="577.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8.0.111" fx:controller="collisiondection.FXMLDocumentController"> 
    <children> 
     <Label fx:id="lblMain" layoutX="254.0" layoutY="408.0" minHeight="16" minWidth="69" /> 
     <Polygon fx:id="polyOne" fill="DODGERBLUE" layoutX="122.0" layoutY="166.0" stroke="BLACK" strokeType="INSIDE"> 
     <points> 
      <Double fx:value="-50.0" /> 
      <Double fx:value="40.0" /> 
      <Double fx:value="50.0" /> 
      <Double fx:value="40.0" /> 
      <Double fx:value="0.0" /> 
      <Double fx:value="-60.0" /> 
     </points> 
     </Polygon> 
     <Polygon fx:id="polyTwo" fill="DODGERBLUE" layoutX="419.0" layoutY="166.0" stroke="BLACK" strokeType="INSIDE"> 
     <points> 
      <Double fx:value="-50.0" /> 
      <Double fx:value="40.0" /> 
      <Double fx:value="50.0" /> 
      <Double fx:value="40.0" /> 
      <Double fx:value="0.0" /> 
      <Double fx:value="-60.0" /> 
     </points> 
     </Polygon> 
    </children> 
</AnchorPane> 

컨트롤러 :

import java.net.URL; 
import java.util.ResourceBundle; 
import javafx.beans.property.ObjectProperty; 
import javafx.beans.property.SimpleObjectProperty; 
import javafx.fxml.FXML; 
import javafx.fxml.Initializable; 
import javafx.geometry.Point2D; 
import javafx.scene.control.Label; 
import javafx.scene.input.MouseEvent; 
import javafx.scene.shape.Polygon; 
import javafx.scene.shape.Shape; 

/** 
* 
* @author sedj601 
*/ 
public class FXMLDocumentController implements Initializable { 

    @FXML private Label lblMain; 
    @FXML private Polygon polyOne, polyTwo;  

    final ObjectProperty<Point2D> mousePosition = new SimpleObjectProperty<>(); 

    @Override 
    public void initialize(URL url, ResourceBundle rb) { 
     // TODO 
     polyOne.setOnMousePressed((MouseEvent event) -> { 
      mousePosition.set(new Point2D(event.getSceneX(), event.getSceneY())); 
     }); 

     polyOne.setOnMouseDragged((MouseEvent event) -> { 
      double deltaX = event.getSceneX() - mousePosition.get().getX(); 
      double deltaY = event.getSceneY() - mousePosition.get().getY(); 
      polyOne.setLayoutX(polyOne.getLayoutX()+deltaX); 
      polyOne.setLayoutY(polyOne.getLayoutY()+deltaY); 
      mousePosition.set(new Point2D(event.getSceneX(), event.getSceneY())); 

      Shape intersect = Shape.intersect(polyOne, polyTwo); 

      if(intersect.getBoundsInLocal().getWidth() != -1) 
      { 
       System.out.println("This object can overlap other the other object!"); 
       lblMain.setText("Collision detected!"); 
      } 
      else 
      { 
       intersect.getBoundsInLocal().getWidth(); 
       lblMain.setText("Collision not detected!"); 
      }    
     }); 

     polyTwo.setOnMousePressed((MouseEvent event) -> { 
      mousePosition.set(new Point2D(event.getSceneX(), event.getSceneY())); 
     }); 

     polyTwo.setOnMouseDragged((MouseEvent event) -> { 
      double deltaX = event.getSceneX() - mousePosition.get().getX(); 
      double deltaY = event.getSceneY() - mousePosition.get().getY(); 
      polyTwo.setLayoutX(polyTwo.getLayoutX() + deltaX); 
      polyTwo.setLayoutY(polyTwo.getLayoutY() + deltaY); 
      mousePosition.set(new Point2D(event.getSceneX(), event.getSceneY())); 

      Shape intersect = Shape.intersect(polyOne, polyTwo); 
      { 
       if(intersect.getBoundsInLocal().getWidth() != -1) 
       {  
        System.out.println("This object can not overlap other the other object!"); 
        polyTwo.setLayoutX(polyTwo.getLayoutX() - deltaX); 
        polyTwo.setLayoutY(polyTwo.getLayoutY() - deltaY); 
        lblMain.setText("Collision detected!"); 
       } 
       else 
       { 
        lblMain.setText("Collision not detected!"); 
       } 
      } 
     }); 
    } 
} 
+1

왼쪽 노드는 드래그 할 때 충돌을 감지합니다. 다른 노드로 겹치고 다른 노드와 중첩됩니다. 오른쪽 노드는 드래그 할 때 충돌을 감지하지만 다른 노드와 겹치지 않습니다. – Sedrick

관련 문제