JavaFx:运行时检查PathTransition的当前位置

时间:2015-12-06 02:32:46

标签: java graphics javafx javafx-2 javafx-8

我想得到一个Circle(javafx.scene.shape.Circle)的当前位置(x,y)我正在通过PathTransition移动,而转换正在运行/发生。

所以我需要某种任务,每50毫秒检查一次圆圈的位置(例如)。

我也尝试过在Stack Overflow上建议的这个解决方案Current circle position of javafx transition,但我似乎并没有为我工作。

Circle projectile = new Circle(Playground.PROJECTILE_SIZE, Playground.PROJECTILE_COLOR);

root.getChildren().add(projectile);

double duration = distance / Playground.PROJECTILE_SPEED;

double xOff = (0.5-Math.random())*Playground.WEAPON_OFFSET;
double yOff = (0.5-Math.random())*Playground.WEAPON_OFFSET;

Line shotLine = new Line(player.getCurrentX(), player.getCurrentY(), aimLine.getEndX() + xOff, aimLine.getEndY() + yOff);

shotLine.setEndX(shotLine.getEndX() + (Math.random()*Playground.WEAPON_OFFSET));

PathTransition pt = new PathTransition(Duration.seconds(duration), shotLine, projectile);

// Linear movement for linear speed
pt.setInterpolator(Interpolator.LINEAR);

pt.setOnFinished(new EventHandler<ActionEvent>() {
    public void handle(ActionEvent event) {
    // Remove bullet after hit/expiration
    projectile.setVisible(false);
    root.getChildren().remove(projectile);
    }
});

projectile.translateXProperty().addListener(new ChangeListener<Number>() {

    @Override
    public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
    double x = collider.getTranslateX() - projectile.getTranslateX();
    double y = collider.getTranslateY() - projectile.getTranslateY();

    double distance = Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2));

    System.out.println("Distance: "+ distance);

    if (distance < 50) {
        System.out.println("hit");
    }
    }
});

pt.play();

1 个答案:

答案 0 :(得分:1)

PathTransition将通过操纵其translateXtranslateY属性来移动节点。 (TranslateTransition的工作方式相同。)

由于您的代码非常不完整,但很难回答您的问题,但如果projectilecollider在场景图中具有相同的父级,则转换{{1}的初始坐标}和projectile通过调用collider将给出父级中的坐标,包括翻译。因此,您可以观察localToParenttranslateX属性,并使用该转换来检查冲突。如果他们有不同的父母,你可以用translateY做同样的事情,然后将两者转换成相对于场景的坐标。

这是一个快速的SSCCE。使用左右箭头瞄准,射击空间:

localToScene