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

标签 java javafx

我有两个 Pane :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 的 Shape。

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);
    }  
}

没有交集的工作应用程序(即使边界相交)

No Intersection

具有交叉点的工作应用程序

Intersection

关于JavaFX 具有不同父对象的对象之间的冲突检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32804161/

相关文章:

java - 使用 crontab 中的 java 文件执行 bash 文件

Javafx Gluon 保存 XML 文件

Javafx TableView 未显示所有列中的数据

java - WeakHashMap的用法?

600M 句子的 Java 哈希字符串

position - JavaFX:如何设置正确的工具提示位置?

JavaFX Accordion 效果

java - JavaFX 中 GridPane 的居中对齐行

java - 在 Spring MVC 上使用 jackson 和相关实体解析 JSON

java - 我需要一个 tomcat 服务器来使 java jdbc swing 应用程序在 lan 上运行吗