【发布时间】:2022-09-07 18:11:23
【问题描述】:
我有一组形状,我试图检查彼此之间的碰撞,但到目前为止,我所做的只是检测彼此最接近的三个节点之间的碰撞。
addToRectCollection 方法将堆栈窗格添加到集合中,onDragged 男性每个形状都可拖动。
我应该更改/添加什么来检测集合中所有元素之间的冲突?
下面是我的代码:
public class CollisionDection extends Application {
final ObjectProperty<Point2D> mousePosition = new SimpleObjectProperty<>();
Group gp = new Group();
*I try to detect collisions between elements of this list*
ArrayList<StackPane> stackPanes = new ArrayList<>();
@Override
public void start(Stage stage) throws Exception {
Scene sc = new Scene(gp, 700, 300);
Button btn = new Button();
btn.setText(\"CREATE REct\");
btn.setOnAction(event -> {
Rectangle r = createRect(0);
r.setFill(Color.RED);
Text text = new Text(\".\");
StackPane stack = new StackPane();
StackPane.setMargin(r, new Insets(8, 8, 8, 8));
stack.getChildren().addAll(r, text);
ChoiceBox<String> dropdown = new ChoiceBox<>();
stack.getChildren().add(dropdown);
makeDraggable(stack);
addToRectCollection(stack);
gp.getChildren().add(stack);
});
gp.getChildren().add(btn);
stage.setScene(sc);
stage.show();
}
private void addToRectCollection(StackPane r) {
stackPanes.add(r);
stackPanes.forEach(rect -> {
stackPanes.forEach(rect2 -> {
if (!rect.equals(rect2)) {
setOnDragegd(rect2, rect);
setOnDragegd(rect, rect2);
}
});
});
}
private void setOnDragegd(StackPane pane, StackPane paneToSetDragged) {
paneToSetDragged.setOnMouseDragged((MouseEvent event) -> {
double deltaX = event.getSceneX() - mousePosition.get().getX();
double deltaY = event.getSceneY() - mousePosition.get().getY();
paneToSetDragged.setLayoutX(paneToSetDragged.getLayoutX() + deltaX);
paneToSetDragged.setLayoutY(paneToSetDragged.getLayoutY() + deltaY);
mousePosition.set(new Point2D(event.getSceneX(), event.getSceneY()));
var intersect = paneToSetDragged.getBoundsInParent().intersects(pane.getBoundsInParent());
if (intersect) {
pane.setStyle(\"-fx-background-color: #6a5246\");
paneToSetDragged.setStyle(\"-fx-background-color: #6a5246\");
Group g = new Group();
g.getChildren().add(paneToSetDragged);
g.getChildren().add(pane);
gp.getChildren().add(g);
paneToSetDragged.setLayoutX(paneToSetDragged.getLayoutX() - deltaX);
paneToSetDragged.setLayoutY(paneToSetDragged.getLayoutY() - deltaY);
} else {
pane.setStyle(\"-fx-background-color: #ffffff\");
paneToSetDragged.setStyle(\"-fx-background-color: #ffffff\");
}
});
}
private void makeDraggable(StackPane ractangleToSetDragged) {
ractangleToSetDragged.setOnMousePressed((MouseEvent event) -> mousePosition.set(new Point2D(event.getSceneX(), event.getSceneY())));
ractangleToSetDragged.setOnMouseDragged((MouseEvent event) -> {
double deltaX = event.getSceneX() - mousePosition.get().getX();
double deltaY = event.getSceneY() - mousePosition.get().getY();
ractangleToSetDragged.setLayoutX(ractangleToSetDragged.getLayoutX() + deltaX);
ractangleToSetDragged.setLayoutY(ractangleToSetDragged.getLayoutY() + deltaY);
mousePosition.set(new Point2D(event.getSceneX(), event.getSceneY()));
});
}
public Rectangle createRect(int x) {
Rectangle r = new Rectangle();
r.setX(x);
r.setY(60);
r.setWidth(300);
r.setHeight(150);
return r;
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
launch(args);
}
}