我正在尝试制作滚动背景;希望是将它连接到尾部,以便它旋转相同的“色带”,并将其置于游戏的后面。
我一直在寻找正确的方法来实现这一目标。我可以根据我的示例或TimeLine使用AnimationTimer。但是,我希望将动画速度移动得慢得多,并且延迟对计时器的更新会导致抖动。我确实添加了一个int变量,如果小于“x”毫秒,则返回,但它看起来不太好。
完成此任务的更好方法是什么?
import javafx.animation.AnimationTimer;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.image.Image;
import javafx.scene.layout.*;
import java.io.File;
import java.nio.file.Path;
import java.nio.file.Paths;
class ImageContainer extends VBox {
int w, h;
int sectionScrollWidth = 1;
int sections;
int sectionCounter = 0;
Image image;
Canvas canvas;
public ImageContainer() {
setVisible(true);
load();
w = (int) image.getWidth();
h = (int) image.getHeight();
canvas = new Canvas(w, h);
getChildren().add(canvas);
sections = w / sectionScrollWidth;
GraphicsContext gc = canvas.getGraphicsContext2D();
canvas.setVisible(true);
gc.drawImage(image, 0, 0, w, h);
setPrefSize(w, h);
final long startNanoTime = System.nanoTime();
new AnimationTimer() {
public void handle(long currentNanoTime) {
sectionCounter = sectionCounter - sectionScrollWidth;
canvas.setTranslateX(sectionCounter);
}
}.start();
// KeyValue kv1 = new KeyValue(canvas.translateXProperty(), 0);
// KeyValue kv2 = new KeyValue(canvas.translateXProperty(), 2000);
// KeyFrame kf1 = new KeyFrame(Duration.millis(3000), kv1, kv2);
// Timeline translate = new Timeline();
// translate.getKeyFrames().add(kf1);
// translate.play();
}
public void load() {
Path imagePath = Paths.get("./src/main/resources/ribbonImages/clouds.png");
File f = imagePath.toFile();
assert f.exists();
image = new Image(f.toURI().toString());
}
}
答案 0 :(得分:0)
if (((System.nanoTime()-startNanoTime)/1000000000.0)<0.05) {
return;
}
else {
startNanoTime = System.nanoTime();
}
如果已经过了少于0.05秒,则添加到handle()方法将强制它返回。相当明显的答案,但我不想删除自己的问题,以防其他人帮助。