JavaFX'te geçiş sıfırlama konumunu çevir

Aug 17 2020

Bir daireyi (100,200) 'den (400,200)' e taşımaya çalışıyorum ve bir döngüden sonra daire (100,100) 'den (200,100)' e hareket etmeye başlamalı ve bu hareketi tekrarlamaya devam etmelidir. İlk döngüden sonra circle.setCenterX (100) ve circle.setCenterY (100) seçeneklerini kullanarak dairenin konumunu sıfırladım. Ancak bu animasyona yansımaz. Daire (400,100) 'e sıfırlanır ve hareketi tekrarlamak yerine X yönünde ilerlemeye devam eder. JavaFX'te yeniyim. Herhangi bir yardım memnuniyetle karşılanacaktır.

import javafx.animation.*;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.stage.Stage;
import javafx.util.Duration;

public class Test extends Application
{
  public static void main(String[] args)
  {
    launch(args);
  }

  final double lambda = 0.1; // pixel per millisecond
  double posX = 100;
  double posY = 200;
  double time = 0;
  double velocityX = 1*lambda;
  double velocityY = 0*lambda;
  Circle circle = new Circle(posX, posY, 20, Color.AQUA);
  Circle ref1 = new Circle(100, 200, 5, Color.CADETBLUE);
  Circle ref2 = new Circle(400, 200, 5, Color.CADETBLUE);
  Circle ref3 = new Circle(100, 100, 5, Color.CADETBLUE);

  @Override
  public void start(Stage stage) throws Exception
  {
    Pane pane = new Pane();
    pane.getChildren().addAll(circle, ref1, ref2, ref3);

    BorderPane root = new BorderPane();
    root.setCenter(pane);
    root.setStyle("-fx-background-color: #29353B");
    double WIDTH = 800;
    double HEIGHT = 600;
    Scene scene = new Scene(root, WIDTH, HEIGHT);
    stage.setScene(scene);
    stage.show();

    move(3000);
  }

  public void move(double dt) // dt in milliseconds
  {
    System.out.println(circle.getCenterX()+", "+circle.getCenterY());
    TranslateTransition translateTransition = new TranslateTransition(Duration.millis(dt), circle);
    //translateTransition.setInterpolator(Interpolator.LINEAR);
    translateTransition.setByX(this.velocityX*dt);
    translateTransition.setByY(this.velocityY*dt);
    translateTransition.setCycleCount(1);
    translateTransition.play();
    translateTransition.setOnFinished(actionEvent -> { updatePos(dt); move(2000); });
  }


  public void updatePos(double dt)
  {
    //this.posX += this.velocityX*dt;
    //this.posY += this.velocityY*dt;
    this.posX = 100;
    this.posY = 100;
    circle.setCenterX(this.posX);
    circle.setCenterY(this.posY);
  }
}

Yanıtlar

3 James_D Aug 17 2020 at 19:22

TranslateTransitionDeğiştirir translateXve translateYözellikleri, değil centerXve centerYözellikleri. Animasyon tamamlandığında centerXve centerYözelliklerini değiştirirseniz, dairenin bu koordinatlarda görünmesi için de sıfırlamanız translateXve translateY0'a getirmeniz gerekir :

  public void updatePos(double dt) {
    //this.posX += this.velocityX*dt;
    //this.posY += this.velocityY*dt;
    this.posX = 100;
    this.posY = 100;
    circle.setCenterX(this.posX);
    circle.setCenterY(this.posY);
    circle.setTranslateX(0);
    circle.setTranslateY(0);
  }

Alternatif olarak, animasyondaki ve özelliklerini doğrudan işlemek için a Timelineyerine a TranslateTransitionkullanabilirsiniz :centerXcenterY

public void move(double dt) /* dt in milliseconds */ {
    System.out.println(circle.getCenterX() + ", " + circle.getCenterY());
    double targetX = circle.getCenterX() + this.velocityX * dt;
    double targetY = circle.getCenterY() + this.velocityY * dt;
    Timeline timeline = new Timeline(new KeyFrame(Duration.millis(dt),
            new KeyValue(circle.centerXProperty(), targetX),
            new KeyValue(circle.centerYProperty(), targetY)));

    timeline.setOnFinished(actionEvent -> {
        updatePos(dt);
        move(2000);
    });
    timeline.play();
}

public void updatePos(double dt) {
    this.posX = 100;
    this.posY = 100;
    circle.setCenterX(this.posX);
    circle.setCenterY(this.posY);
}