JavaFX两个形状相交-碰撞方法不起作用

JavaFX两个形状相交-碰撞方法不起作用,javafx,collision,shapes,Javafx,Collision,Shapes,我试图在JavaFX中检测两个形状之间的冲突,但这种方法不起作用。我正在检索两个形状的节点,然后使用相交方法比较它们的位置。我可以在这里换什么?谢谢大家! public void collisionDetection() { if (_circle.getNode().intersects(_square.getRect().getX(), _square.getRect().getY(), 100.0, 30.0)) { System.out.println("

我试图在JavaFX中检测两个形状之间的冲突,但这种方法不起作用。我正在检索两个形状的节点,然后使用相交方法比较它们的位置。我可以在这里换什么?谢谢大家!

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

评论()中提到的另一个问题的答案不准确。Node#intersects(Bounds)方法不将另一个节点的局部边界作为输入,而是将调用节点的局部坐标系内另一个节点的边界作为输入。因此,您需要变换边界以便能够检测碰撞,如下所示:

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

我已经创建了一个碰撞检测应用程序,您可以使用它来更好地理解碰撞检测

主要内容:

FXML:


控制器:

import java.net.URL;
导入java.util.ResourceBundle;
导入javafx.beans.property.ObjectProperty;
导入javafx.beans.property.SimpleObject属性;
导入javafx.fxml.fxml;
导入javafx.fxml.Initializable;
导入javafx.geometry.Point2D;
导入javafx.scene.control.Label;
导入javafx.scene.input.MouseEvent;
导入javafx.scene.shape.Polygon;
导入javafx.scene.shape.shape;
/**
*
*@作者sedj601
*/
公共类FXMLDocumentController实现可初始化{
@FXML自有品牌lblMain;
@FXML private Polygon polyOne,polyTwo;
final ObjectProperty mousePosition=new SimpleObjectProperty();
@凌驾
公共void初始化(URL、ResourceBundle rb){
//待办事项
polyOne.setOnMousePressed((MouseEvent事件)->{
set(新的Point2D(event.getSceneX(),event.getSceneY());
});
polyOne.SetonMouseDrawed((MouseEvent事件)->{
double deltaX=event.getSceneX()-mousePosition.get().getX();
double deltaY=event.getSceneY()-mousePosition.get().getY();
polyOne.setLayoutX(polyOne.getLayoutX()+deltaX);
polyOne.setLayoutY(polyOne.getLayoutY()+deltaY);
set(新的Point2D(event.getSceneX(),event.getSceneY());
形状相交=形状相交(polyOne,polyTwo);
if(intersect.getBoundsInLocal().getWidth()!=-1)
{
System.out.println(“此对象可以与其他对象重叠!”);
lblMain.setText(“检测到碰撞!”);
}
其他的
{
intersect.getBoundsInLocal().getWidth();
lblMain.setText(“未检测到碰撞!”);
}            
});
polyTwo.setOnMousePressed((MouseEvent事件)->{
set(新的Point2D(event.getSceneX(),event.getSceneY());
});
polyTwo.SetonMouseDrawed((MouseEvent事件)->{
double deltaX=event.getSceneX()-mousePosition.get().getX();
double deltaY=event.getSceneY()-mousePosition.get().getY();
polyTwo.setLayoutX(polyTwo.getLayoutX()+deltaX);
polytower.setLayoutY(polytower.getLayoutY()+deltaY);
set(新的Point2D(event.getSceneX(),event.getSceneY());
形状相交=形状相交(polyOne,polyTwo);
{
if(intersect.getBoundsInLocal().getWidth()!=-1)
{      
System.out.println(“此对象不能与其他对象重叠!”);
setLayoutX(polytower.getLayoutX()-deltaX);
setLayoutY(polytower.getLayoutY()-deltaY);
lblMain.setText(“检测到碰撞!”);
}
其他的
{
lblMain.setText(“未检测到碰撞!”);
}
}
});   
}
}

您能检查一下这个链接吗:当拖动到另一个节点时,左侧节点将检测到碰撞,并与另一个节点重叠。拖动时,右侧节点将检测到碰撞,但不会与其他节点重叠。
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);
    }

}
<?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!");
                }
            }
        });   
    }
}