Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有不同父对象的对象之间的JavaFX冲突检测_Java_Javafx - Fatal编程技术网

具有不同父对象的对象之间的JavaFX冲突检测

具有不同父对象的对象之间的JavaFX冲突检测,java,javafx,Java,Javafx,我有两个窗格:paneA和paneB,paneA包含objectA,paneB包含objectB。然而,paneA也含有paneB。当ObjectA和ObjectB具有不同的父对象时,如何检测它们之间的冲突 我尝试了以下方法,但无效: Pane paneA = new Pane(); Pane paneB = new Pane(); Rectangle objectA = new Rectangle(50,30); Rectangle objectB = new Rectangle(80,40

我有两个窗格:paneA和paneB,paneA包含objectA,paneB包含objectB。然而,paneA也含有paneB。当ObjectA和ObjectB具有不同的父对象时,如何检测它们之间的冲突

我尝试了以下方法,但无效:

Pane paneA = new Pane();
Pane paneB = new Pane();

Rectangle objectA = new Rectangle(50,30);
Rectangle objectB = new Rectangle(80,40);

paneB.getChildren().add(objectB);
paneA.getChildren().addAll(objectA, paneB);

if(objectA.getBoundsInParent().intersects(objectB.getBoundsInParent()) {
    collision = true;
}
问题 您要检查形状(或形状的子类型)的交点

解决方案 类Shape中已有一个名为intersect的静态方法

例子 下面的示例将显示两个相交的矩形。使用setX和setY的值,可以移动它们,直到它们不相交。边界将显示为矩形。仅当对象相交时,方法
intersect(shape1,shape2)
将返回边界宽度大于0的形状

import javafx.application.Application;
import javafx.geometry.Bounds;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.BorderPane;
import javafx.scene.paint.Color;
import javafx.scene.paint.Paint;
import javafx.scene.shape.Rectangle;
import javafx.scene.shape.Shape;
import javafx.scene.shape.StrokeType;
import javafx.stage.Stage;

public class CollisionDetection extends Application {

    @Override
    public void start(Stage primaryStage) {

        Label label = new Label();
        Group groupA = new Group();
        Group groupB = new Group();

        Rectangle objectA = new Rectangle(50, 30);
        objectA.setFill(Paint.valueOf("red"));
        objectA.setX(100);
        objectA.setY(100);
        objectA.setRotate(10);
        objectA.setSmooth(true);

        Rectangle objectB = new Rectangle(80, 40);
        objectB.setFill(Paint.valueOf("blue"));
        objectB.setRotate(-10);
        objectB.setX(115);
        objectB.setY(50);        

        groupB.getChildren().add(objectB);
        groupA.getChildren().addAll(objectA,groupB);

        groupA.getChildren().add(createBoundsRectangle(objectA.getBoundsInParent()));
        groupA.getChildren().add(createBoundsRectangle(objectB.getBoundsInParent()));

        Shape intersect = Shape.intersect(objectA, objectB);

        if (intersect.getBoundsInParent().getWidth() > 0) {
            label.setText("ObjectA intersects ObjectB");
        } else {
            label.setText("ObjectA does not intersect ObjectB");
        }

        BorderPane root = new BorderPane(groupA);
        root.setBottom(label);
        Scene scene = new Scene(root, 300, 250);        

        primaryStage.setTitle("Collision Detection");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    private Rectangle createBoundsRectangle(Bounds bounds) {
        Rectangle rect = new Rectangle();       

        rect.setFill(Color.TRANSPARENT);
        rect.setStroke(Color.LIGHTGRAY.deriveColor(1, 1, 1, 0.5));
        rect.setStrokeType(StrokeType.INSIDE);
        rect.setStrokeWidth(3);

        rect.setX(bounds.getMinX());
        rect.setY(bounds.getMinY());
        rect.setWidth(bounds.getWidth());
        rect.setHeight(bounds.getHeight());
        return rect;
      }


    public static void main(String[] args) {
        launch(args);
    }  
}
不相交的工作应用程序(即使边界相交)

交叉口的工作应用

类中有一些方法能够将局部坐标转换为场景坐标。像
localToScene(Bounds-localBounds)
。这是一个很好的解决方案!由于旋转,这不是有点不准确吗?边界不能完全覆盖对象。@NwDev请参阅一个示例,说明如何在旋转矩形中不精确地使用边界@是的,我在javafx.runtime.version:9.0.1上+11@NwDev根据文件,这不是预期的行为吗?boundsInParent不遵循变换,而boundsInParents在这里等效于将局部边界转换为场景中的边界。