2017-01-23 23 views
0

我想要檢測JavaFX中兩種形狀之間的碰撞,並且此方法不起作用。我正在檢索兩個形狀的節點,然後使用intersects方法比較它們的位置。我可以在這裏改變什麼?謝謝!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