2016-06-08 2 views
1

J'écris un petit jeu. Et je veux un menu de pause sur le menu du jeu estompé à afficher lorsque l'esc est pressé dans le milieu de la partie. Ce que je fais est que je fais une nouvelle scène qui a un stackPane enveloppant la racine passée et la racine du menu de pause, puis j'ai mis l'opacité de la racine passée 0.4.comment avoir une scène sur une autre dans javafx

Ensuite, lorsque le bouton de reprise dans le menu de pause est cliqué je change l'opacité de retour à 1 et planter le décor passé sur scène mais son freezed. Quelqu'un sait-il pourquoi? quelqu'un peut-il m'aider à atteindre cet objectif?

Voici la partie que je fais de la nouvelle scène, puis je mets cela sur scène:

 StackPane wrapper = new StackPane(); 
     previousScene = main.getPrimaryStage().getScene(); 
     previousScene.getRoot().setOpacity(.4); 
     vBox.setId("pausedWrapper"); 
     wrapper.getChildren().add(previousScene.getRoot()); 
     wrapper.getChildren().add(vBox); 
     scene = new Scene(wrapper, 1200, 700); 
     return scene; 

Voici la partie que je le change à l'endroit où il était:

 resumeGame.setOnAction(event -> { 
      System.out.println("game resumed!"); 
      previousScene.getRoot().setOpacity(1); 
      main.getPrimaryStage().setScene(previousScene); 
     }); 

Mais ça ne marche pas et l'opacité ne change pas à la normale et la chose étrange c'est quand je vérifie le son sur la boite la musique est jouée mais la boite ne se vérifie pas comme si tout fonctionnait mais la vue est figée.

Répondre

4

Un noeud ne peut pas faire partie de deux graphiques de scène différents. Cela se produit dans votre code à la racine de previousScene, car il fait partie des deux previousScene et la nouvelle scène que vous créez dans votre premier bloc de code. Très probablement ce qui se passe est qu'il est retiré de la première scène lorsque vous l'ajoutez à la seconde (bien qu'il soit difficile de dire à partir du code que vous avez posté).

Pensez au lieu d'utiliser un Popup pour afficher la pauseMenu au-dessus de la fenêtre existante, ou tout simplement utiliser un Stage modal avec undecorated StageStyle, comme dans le SSCCE suivant:

import javafx.animation.Animation; 
import javafx.animation.TranslateTransition; 
import javafx.application.Application; 
import javafx.geometry.Insets; 
import javafx.geometry.Pos; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.control.Label; 
import javafx.scene.effect.GaussianBlur; 
import javafx.scene.layout.BorderPane; 
import javafx.scene.layout.Pane; 
import javafx.scene.layout.VBox; 
import javafx.scene.paint.Color; 
import javafx.scene.shape.Rectangle; 
import javafx.stage.Modality; 
import javafx.stage.Popup; 
import javafx.stage.Stage; 
import javafx.stage.StageStyle; 
import javafx.util.Duration; 

public class PauseExample extends Application { 

    @Override 
    public void start(Stage primaryStage) { 

     Rectangle rect = new Rectangle(50, 50, 50, 50); 
     rect.setFill(Color.CORAL); 

     TranslateTransition animation = createAnimation(rect); 

     Button pauseButton = new Button("Pause"); 

     Pane pane = new Pane(rect); 
     pane.setMinSize(600, 150); 

     BorderPane root = new BorderPane(pane, null, null, pauseButton, new Label("This is\nthe main\nscene")); 

     pauseButton.setOnAction(e -> { 
      animation.pause(); 
      root.setEffect(new GaussianBlur()); 

      VBox pauseRoot = new VBox(5); 
      pauseRoot.getChildren().add(new Label("Paused")); 
      pauseRoot.setStyle("-fx-background-color: rgba(255, 255, 255, 0.8);"); 
      pauseRoot.setAlignment(Pos.CENTER); 
      pauseRoot.setPadding(new Insets(20)); 

      Button resume = new Button("Resume"); 
      pauseRoot.getChildren().add(resume); 

      Stage popupStage = new Stage(StageStyle.TRANSPARENT); 
      popupStage.initOwner(primaryStage); 
      popupStage.initModality(Modality.APPLICATION_MODAL); 
      popupStage.setScene(new Scene(pauseRoot, Color.TRANSPARENT)); 


      resume.setOnAction(event -> { 
       root.setEffect(null); 
       animation.play(); 
       popupStage.hide(); 
      }); 

      popupStage.show(); 
     }); 

     BorderPane.setAlignment(pauseButton, Pos.CENTER); 
     BorderPane.setMargin(pauseButton, new Insets(5)); 
     Scene scene = new Scene(root); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

    private TranslateTransition createAnimation(Rectangle rect) { 
     TranslateTransition animation = new TranslateTransition(Duration.seconds(1), rect); 
     animation.setByX(400); 
     animation.setCycleCount(Animation.INDEFINITE); 
     animation.setAutoReverse(true); 
     animation.play(); 
     return animation; 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 
+0

wow il était grand merci :) mais cela ne fonctionne pas pour moi parce que quand le jeu est en pause, le bouton de jeu de pause fonctionne toujours. et est cliquable. –

+0

Dans ce cas, utilisez une étape modale. Voir la version mise à jour. –

+0

oh! est-il possible de se débarrasser de ce bruit? quand le jeu est cliqué? aussi je ne veux pas que ces minimisent et maximisent et ferment des boutons sur le dessus pour être inactifs. (je suis désolé si je suis un peu techy) –