अनुवाद परिवर्तन रीसेट स्थिति javaFX में

Aug 17 2020

मैं एक चक्र (१००,२००) से (४००,२००) तक जाने की कोशिश कर रहा हूं और एक चक्र के बाद चक्र को (१००,१००) से (२००,१००) चलना शुरू करना चाहिए और उस गति को दोहराना जारी रखना चाहिए। पहले चक्र के बाद मैंने सर्कल की स्थिति को सर्कलसेटसेटसेट (100) और सर्कलसेटसेट (100) का उपयोग करके रीसेट कर दिया। हालाँकि, यह एनीमेशन में परिलक्षित नहीं होता है। सर्कल (400,100) पर रीसेट होता है और गति को दोहराने के बजाय एक्स दिशा में आगे बढ़ता रहता है। मैं javaFX के लिए नया हूं। किसी भी सहायता की सराहना की जाएगी।

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

जवाब

3 James_D Aug 17 2020 at 19:22

TranslateTransitionसंशोधित translateXऔर translateYगुण, नहीं centerXऔर centerYगुण। यदि आप एनीमेशन के पूरा होने पर गुणों centerXऔर centerYगुणों को संशोधित करते हैं , तो आपको उन निर्देशांक में प्रदर्शित होने के लिए सर्कल के लिए रीसेट translateXऔर translateY0 भी करना चाहिए :

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

वैकल्पिक रूप से, आप एनीमेशन में गुणों और गुणों को सीधे हेरफेर करने के Timelineबजाय उपयोग कर सकते हैं :TranslateTransitioncenterXcenterY

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