2017-01-23 2 views
0

JavaFXで2つの図形の衝突を検出しようとしていますが、この方法は機能しません。私は2つの図形のノードを取得してから、交差法を使ってその位置を比較しています。私はここで何を変えることができますか?ありがとうございました!JavaFXの2つの図形が交差しています - 衝突方法が機能しない

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

関連する問題