अनुवाद परिवर्तन रीसेट स्थिति javaFX में
मैं एक चक्र (१००,२००) से (४००,२००) तक जाने की कोशिश कर रहा हूं और एक चक्र के बाद चक्र को (१००,१००) से (२००,१००) चलना शुरू करना चाहिए और उस गति को दोहराना जारी रखना चाहिए। पहले चक्र के बाद मैंने सर्कल की स्थिति को सर्कलसेटसेटसेट (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);
}
}
जवाब
TranslateTransition
संशोधित translateX
और translateY
गुण, नहीं centerX
और centerY
गुण। यदि आप एनीमेशन के पूरा होने पर गुणों centerX
और centerY
गुणों को संशोधित करते हैं , तो आपको उन निर्देशांक में प्रदर्शित होने के लिए सर्कल के लिए रीसेट translateX
और translateY
0 भी करना चाहिए :
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
बजाय उपयोग कर सकते हैं :TranslateTransition
centerX
centerY
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);
}