2017-04-01 4 views
0

Ich versuche, einen scrollenden Hintergrund zu machen; die Hoffnung ist es, das Ende mit dem Schwanz zu verbinden, so dass es das gleiche "Band" herum dreht, und ich platziere das auf der Rückseite meines Spiels.JavaFX animation langsames bewegendes Bild

Ich habe den richtigen Weg gesucht, dies zu animieren. Ich kann einen AnimationTimer nach meinem Beispiel oder eine TimeLine verwenden. Allerdings möchte ich die Animationsgeschwindigkeit viel langsamer bewegen, und das Verzögern von Aktualisierungen des Timers verursacht ein Ruckeln. Ich habe eine int-Variable hinzugefügt, die zurückkehrt, wenn weniger als "x" millis vergangen ist, aber es sah nicht gut aus.

Was ist ein besserer Weg, um diese Aufgabe zu erfüllen?

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

Antwort

0
if (((System.nanoTime()-startNanoTime)/1000000000.0)<0.05) { 
       return; 
      } 
      else { 
       startNanoTime = System.nanoTime(); 
      } 

mit dem Griff() -Methode hinzugefügt wird es zurück erzwingen, wenn weniger als 0,05 Sekunden vergangen sind. Ziemlich offensichtliche Antwort, aber ich wollte nicht nur meine eigene Frage löschen, falls dies jemand anderem hilft.