2017-01-23 2 views
0

J'essaie de détecter la collision entre deux formes dans JavaFX, et cette méthode ne fonctionne pas. Je récupère les nœuds des deux formes, puis j'utilise la méthode des intersections pour comparer leurs emplacements. Que puis-je changer ici? Je vous remercie!JavaFX Two Shapes Intersecting - La méthode de collision ne fonctionne pas

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

Pouvez-vous examiner ce lien: http://stackoverflow.com/questions/20840587/how-to-use-intersect-method-of-node-class-in-javafx – GltknBtn

Répondre

0

La réponse à l'autre question mentionnée dans les commentaires (How to use intersect() method of Node Class in JavaFX?) est inexacte. La méthode Node # intersects (Bounds) ne prend pas les limites locales d'un autre noeud en entrée, mais les limites d'un autre noeud dans le système de coordonnées local du noeud appelant. , Vous devez donc transformer les limites afin de pouvoir détecter les collisions, comme suit:

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

J'ai créé une application de détection de collision que vous pouvez jouer avec pour mieux comprendre la détection de collision.

principal:

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> 

Controller:

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

Le noeud gauche détecte une collision lorsqu'ils sont traînés dans l'autre noeud, et chevauchera l'autre noeud. Le noeud droit détecte la collision lorsqu'il est déplacé mais ne chevauche pas l'autre noeud. – Sedrick