2017-08-15 4 views
0

Ich versuche gerade, ein Spiel zu bauen, und ich habe eine Intro-Sequenz von Bildern mit begleitenden Text für die Hintergrundgeschichte des Spiels. Zu Beginn fade ich ein Bild mit begleitendem Text ein und blende dann beide aus. Dann beginne ich die nächste Bild-Text-Paarung, sobald die vorherige Überblendung abgeschlossen ist, und ich mache das, bis die Hintergrundgeschichte abgeschlossen ist, aber wenn ich das mache, flackern Bild und Text für einen Bruchteil einer Sekunde, bevor die Einblendung für jeden beginnt Bild und Text. Ich habe einige Dinge ausprobiert, aber ich kann das Flimmern nicht loswerden. Kann mir jemand helfen?Bild flackert für Sekundenbruchteil während FadeTransition - Javafx

Dies ist die Funktion, die ich im Intro für diesen Teil verwenden:

private void backgroundStory (Stage stage, MediaPlayer mediaPlayer, String nameEntry, int width, int height, Color color) { 

      Group backstoryRoot = changeScene(stage, width, height, color); 
      GridPane backstoryPane = new GridPane(); 

      backstoryRoot.getChildren().add(backstoryPane); 

      Label storyLabel1 = createLabel("Sometimes, life can get monotonous..."); 

      backstoryPane.getColumnConstraints().add(new ColumnConstraints(width)); 
      RowConstraints initialConstraint = new RowConstraints ((height/2)+20); 
      backstoryPane.getRowConstraints().add(initialConstraint); 

      int fadeDuration = 4000; 
      FadeTransition storyTextTransition1 = storyTextFade(storyLabel1, fadeDuration); 
      backstoryPane.getChildren().add(storyLabel1); 
      GridPane.setValignment(storyLabel1, VPos.BOTTOM); 
      GridPane.setHalignment(storyLabel1, HPos.CENTER); 

      storyTextTransition1.setOnFinished(new EventHandler<ActionEvent>() { 

       @Override 
       public void handle(ActionEvent event) { 

        backstoryPane.getChildren().remove(storyLabel1); 
        backstoryPane.getRowConstraints().remove(initialConstraint); 
        backstoryPane.getRowConstraints().add(new RowConstraints(25)); 

        VBox vbox = new VBox (10); 
        backstoryPane.add(vbox, 0, 1); 
        vbox.setAlignment(Pos.TOP_CENTER); 

        ImageView dayAndNight = createImage ("Images/Day_And_Night.jpg"); 
        Label storyLabel2 = createLabel("I was living in the city, following the same routine day and night."); 
        vbox.getChildren().add(dayAndNight); 
        vbox.getChildren().add(storyLabel2); 
        storyImageFade(dayAndNight, fadeDuration); 
        FadeTransition storyTextTransition2 = storyTextFade(storyLabel2, fadeDuration); 

        String officeReception = "Images/Office_Reception.jpg"; 
        String receptionText = "Seeing the same faces every morning."; 

        FadeTransition storyTextTransition3 = nextPicture (storyTextTransition2, officeReception, receptionText, fadeDuration, vbox); 


        String office = "Images/Office.jpg"; 
        String officeText = "Doing the same work every day."; 
        FadeTransition storyTextTransition4 = nextPicture (storyTextTransition3, office, officeText, fadeDuration, vbox); 
       } 
      }); 


      //mediaPlayer.stop(); 
      //introExplanation (stage, nameEntry, width, height, color); 
     } 

Dies sind die Funktionen, die in ihm genannt werden:

private Label createLabel(String labelText) { 
      Label storyLabel = new Label(labelText); 
      Font storyFont = Font.font("Blackadder ITC", 25); 
      storyLabel.setTextFill(Color.INDIANRED); 
      storyLabel.setFont(storyFont); 
      return storyLabel; 
     } 

     private FadeTransition storyTextFade(Label label, int duration) { 
      FadeTransition storyTransition = new FadeTransition(Duration.millis(duration), label); 
      storyTransition.setFromValue(0); 
      storyTransition.setToValue(1); 
      storyTransition.setCycleCount(2); 
      storyTransition.setAutoReverse(true); 
      storyTransition.play(); 
      return storyTransition; 
     } 

     private void storyImageFade(ImageView image, int duration) { 
      FadeTransition imageTransition = new FadeTransition(Duration.millis(duration), image); 
      imageTransition.setFromValue(0); 
      imageTransition.setToValue(1); 
      imageTransition.setCycleCount(2); 
      imageTransition.setAutoReverse(true); 
      imageTransition.play(); 
     } 

     private ImageView createImage (String imageName) { 
      Image image = new Image(imageName); 
      ImageView imageview = new ImageView(image); 
      imageview.setFitWidth(500); 
      imageview.setFitHeight(500); 
      //imageview.setPreserveRatio(true); 
      imageview.setSmooth(true); 
      imageview.setCache(true); 
      return imageview; 
     } 

     private FadeTransition nextPicture (FadeTransition transition, String image, String imageLabel, int fadeDuration, VBox vbox) { 
      ArrayList<FadeTransition> transitionList = new ArrayList<FadeTransition>(); 
      transition.setOnFinished(new EventHandler<ActionEvent>() { 

       @Override 
       public void handle(ActionEvent event) { 

        vbox.getChildren().clear(); 
        ImageView imageview = createImage (image); 
        storyImageFade(imageview, fadeDuration); 

        Label storyLabel = createLabel(imageLabel); 
        FadeTransition storyTextTransition = storyTextFade(storyLabel, fadeDuration); 
        transitionList.add(storyTextTransition); 

        vbox.getChildren().add(imageview); 
        vbox.getChildren().add(storyLabel); 
       } 
      }); 
      return transitionList.get(0); 
     } 

Dank!

Antwort

1

Dies ist meine erste Antwort, also entschuldige ich mich, wenn ich nicht angemessen reagiere.

Ich hatte das gleiche Problem beim Übergang zwischen den Szenen. Meine Lösung bestand darin, die Knotenopazität auf 0 vor zu setzen, indem der Knoten zum Container hinzugefügt wurde.

Für Ihren Fall scheint es, als ob alle Ihre Etiketten und Bilder in den create und create Methoden erstellt werden, und die resultierenden Werte werden, was in verblichen sind.

private Label createLabel(String labelText) { 
    Label storyLabel = new Label(labelText); 
    Font storyFont = Font.font("Blackadder ITC", 25); 
    storyLabel.setTextFill(Color.INDIANRED); 
    storyLabel.setFont(storyFont); 

    // Set the opacity before returning the object 
    storyLabel.setOpacity(0); 

    return storyLabel; 
} 

private ImageView createImage (String imageName) { 
    Image image = new Image(imageName); 
    ImageView imageview = new ImageView(image); 
    imageview.setFitWidth(500); 
    imageview.setFitHeight(500); 
    //imageview.setPreserveRatio(true); 
    imageview.setSmooth(true); 
    imageview.setCache(true); 

    // Set the opacity before returning the object 
    imageview.setOpacity(0); 

    return imageview; 
} 

Ich hoffe, das hilft.

Verwandte Themen