Обнаружение столкновений Javafx inTimeLine - PullRequest
0 голосов
/ 02 мая 2018

Я использую временную шкалу для анимации линий, но не могу обнаружить столкновения. Вот краткий пример того, что я пытаюсь сделать в основном.

    Line line = new Line(100, 200, 200, 200);
    Line line1= new Line(350,50,350,300);

    Timeline animation = new Timeline(
            new KeyFrame(Duration.seconds(1.5), new KeyValue(line.endXProperty(), 400))
    );
    animation.setCycleCount(1);
    animation.play();

    if(line.getBoundsInParent().intersects(line1.getBoundsInParent())){
        System.out.println("Collision!");
    }

    Pane root = new Pane(line);
    root.getChildren().add(line1);
    Scene scene = new Scene(root, 400, 400);
    primaryStage.setScene(scene);
    primaryStage.show();

Я использовал некоторые другие коды, методы, идеи, которые я нашел в stackoverflow. Как следующий:

    Bounds bounds = line.getLayoutBounds();
    Shape intersect = Shape.intersect(line, line1);

    boolean intersects = intersect.getBoundsInLocal().getWidth() != -1;

    System.out.println("Intersects: " + intersects);

    if(intersect.getBoundsInLocal().getWidth() != -1)
    {
        System.out.println("This object can overlap other the other object!");
        System.out.print("Collision detected!");
    }
    else
    {
        intersect.getBoundsInLocal().getWidth();
        System.out.print("Collision not detected!");
    }

И некоторые варианты этого кода.

Любая идея поможет

1 Ответ

0 голосов
/ 03 мая 2018

В этом случае «столкновение» (первый раз, когда линии пересекаются) происходит, когда line.endX достигает 350.

Так что вы можете просто сделать:

    BooleanBinding intersecting = line.endXProperty().greaterThanOrEqualTo(350);
    intersecting.addListener((obs, wasIntersecting, isNowIntersecting) -> {
        System.out.println("Collision!");
    });

т.е:.

import javafx.animation.KeyFrame;
import javafx.animation.KeyValue;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.beans.binding.BooleanBinding;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.scene.shape.Line;
import javafx.stage.Stage;
import javafx.util.Duration;

public class AnimatedLine extends Application {

    @Override
    public void start(Stage primaryStage) {
        Line line = new Line(100, 200, 200, 200);
        Line line1= new Line(350,50,350,300);

        BooleanBinding intersecting = line.endXProperty().greaterThanOrEqualTo(350);
        intersecting.addListener((obs, wasIntersecting, isNowIntersecting) -> {
            System.out.println("Collision!");
        });

        Timeline animation = new Timeline(
                new KeyFrame(Duration.seconds(1.5), new KeyValue(line.endXProperty(), 400))
        );
        animation.setCycleCount(1);
        animation.play();


        Pane root = new Pane(line);
        root.getChildren().add(line1);
        Scene scene = new Scene(root, 400, 400);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

В общем, определить, пересекаются ли два отрезка, может быть немного сложнее, чем в случае, когда один горизонтальный, а другой вертикальный, но вы всегда можете довольно легко решить уравнения и сделать что-то похожее на это.

...