2017-08-15 81 views
0

我目前正在嘗試構建一個遊戲,並且我有一個介紹序列的圖像和遊戲背景故事的伴隨文本。一開始,我褪去了伴隨文字的圖像,然後淡出。然後,一旦前一個淡入淡出完成,我開始下一個圖像 - 文本配對,並且直到背景故事完成,然後我才這樣做,但是當我這樣做時,圖像和文本在淡入淡出之前每隔一秒閃爍一次圖像和文字。我試過很多東西,但似乎無法擺脫閃爍,任何人都可以幫忙嗎?在FadeTransition中瞬間圖像閃爍 - Javafx

這是我在介紹使用這部分功能:

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

這些都是所謂的內它的職能:

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

謝謝!

回答

1

這是我的第一個迴應,所以如果我沒有做出適當的迴應,我很抱歉。

我在場景之間切換時遇到了同樣的問題。我的解決方案是在將節點添加到容器之前將節點不透明度設置爲0

對於你的情況,它看起來好像所有的標籤和圖片在createLabel和的createImage方法創建,並將得到的值是什麼都正在褪色。

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

我希望這有助於。