Étape 9: L’opération de Fade
À ce stade, nous avons une grande partie de ce qui est nécessaire pour obtenir le jeu s’est terminé : les tuyaux sont déplacent sur l’écran, les classes joueur et obstacle sont finis, la classe PlayGameScreen est presque terminée et nous sommes presque fini avec le TopClass.
Cette étape est une question d’améliorer le flux du jeu. Si nous n’utilisons cela, nous aurions un brusque saut d’un écran de démarrage vers un écran de jeu et il est très désagréable à jouer. La méthode fadeOperation dans TopClass se produira un « simple » fondu-au-noir et le fondu-de noir pour démarrer le jeu.
L’opération se fanent sera déclenchée à l’aide de la méthode actionPerformed. Lorsque la source de la ActionEvent est le bouton de startGame, nous changeons loopVar false pour indiquer la boucle de jeu pour arrêter l’exécution. Ensuite, nous appelons fadeOperation().
La première partie de l’écriture fadeOperation() démarre un nouveau thread pour gérer les changements à venir. Au sein de la nouvelle méthode du thread run(), nous tout d’abord supprimer le bouton du panneau contenu primaire (Top) et le panneau de graphiques, puis actualiser le Top. Nous créons ensuite un JPanel temporaire (appelé temp) que nous allons ajouter sur le dessus de Top ; C’est le groupe nous fade (n’oubliez pas le fond du Top est noir).
Nous créons une nouvelle variable pour tenir l’alpha, puis régler le fond de temp sur un JPanel transparent noir. Nous ajoutons temp au top et ajoutez l’instance de PaintGameScreen (pgs) retour en plus de cela, suivi d’un rafraîchissement.
À ce stade, nous avons besoin d’un certain temps boucle pour effectuer le réel fondu au noir. Comme dans la boucle de jeu, nous créons une variable devant contenir le temps de l’itération, mais cette fois, la boucle while fin condition est lorsque la valeur alpha de la Commission temporaire est 255 (entièrement transparent). Mis en place une instruction IF pour nous dire combien de fois d’affecter des modifications. J’ai ensuite utilisé une simple instruction If-Else de dicter comment le fondu se produit (principalement linéairement ici). Vous pouvez faire tout ce que vous voulez ici. Après cela, vous définissez background de temp et actualisez Top.
Une fois terminé, le fondu au noir nous retirer tout de Top, rajouter le panneau temporaire, créer une nouvelle instance de PlayGameScreen (de la substitution de pgs), supprimer le texte du titre et rajouter des pgs au Top. À s’estomper du noir, nous réalisons essentiellement la logique opposée de l’opération de décoloration-au-noir.
Une fois terminé, nous devons informer le jeu qu’il a permis de commencer. Pour ce faire, nous avons créé un objet global appelé buildComplete. À la fin de fadeOperation, nous déclencher manuellement un ActionEvent sur buildComplete.
Le dernier changement que nous faisons sur cette étape consiste à la méthode actionPerformed. Nous créons un nouveau conditionnel (combinaison else-if) pour buildComplete. Ici, nous créons un nouveau thread, et dans sa méthode run(), nous changeons le loopVar à true (permettre l’horloge de jeu s’exécute de nouveau) et appelez la méthode gameScreen, cette fois en passant false - nous verrons pourquoi sur l’étape suivante.
! = 0) {if((System.currentTimeMillis() - startTime) > UPDATE_DIFFERENCE/2) {if(alpha > 10) {alpha-= 10;} else {alpha = 0;} temp.setBackground (nouvelle couleur (0, 0, 0, alpha)); topPanel.revalidate() ; topPanel.repaint() ; startTime = System.currentTimeMillis();}} actionPerformed (ActionEvent nouveau (buildComplete, -1, "Build terminée")) ; } }; t.Start() ; } / ** * Méthode qui exécute les mouvements graphiques de splash screen * / private void gameScreen (boolean isSplash) {BottomPipe bp1 = new BottomPipe (PIPE_WIDTH, PIPE_HEIGHT) ; Bp2 BottomPipe = new BottomPipe (PIPE_WIDTH, PIPE_HEIGHT) ; Tp1 TopPipe = new TopPipe (PIPE_WIDTH, PIPE_HEIGHT) ; TopPipe tp2 = new TopPipe (PIPE_WIDTH, PIPE_HEIGHT) ; variables pour suivre les x et y image emplacements pour le bas tube int xLoc1 = SCREEN_WIDTH + SCREEN_DELAY, xLoc2 = (int) ((double) 3.0/2.0*SCREEN_WIDTH+PIPE_WIDTH/2.0)+SCREEN_DELAY ; int yLoc1 = bottomPipeLoc(), yLoc2 = bottomPipeLoc() ; variable destinée à contenir le début de la boucle du temps long startTime = System.currentTimeMillis() ; while(loopVar) {if((System.currentTimeMillis() - startTime) > UPDATE_DIFFERENCE) {//check si un ensemble de tuyaux a laissé l’écran //if, réinitialiser le tuyau X emplacement et assigner un nouvel emplacement Y si (xLoc1 < (0-PIPE_WIDTH)) {xLoc1 = SCREEN_WIDTH ; yLoc1 = bottomPipeLoc();} ElseIf (xLoc2 < (0-PIPE_WIDTH)) {xLoc2 = SCREEN_WIDTH ; yLoc2 = bottomPipeLoc();} //decrement xLoc2-= X_MOVEMENT_DIFFERENCE ; //update le bp1.setX(xLoc1) de sites BottomPipe et TopPipe, les emplacements de tuyau par le montant prédéterminé xLoc1-= X_MOVEMENT_DIFFERENCE ; bp1.setY(yLoc1) ; BP2.setX(xLoc2) ; BP2.Sety(yLoc2) ; TP1.setX(xLoc1) ; TP1.Sety(yLoc1-PIPE_GAP-PIPE_HEIGHT) ; assurer le tp1 placé au bon endroit tp2.setX(xLoc2) ; TP2.Sety(yLoc2-PIPE_GAP-PIPE_HEIGHT) ; s’assurer que tp2 placée au bon endroit //set les variables locales, BottomPipe et TopPipe, en PlayGameScreen en analysant les pgs.setBottomPipe de variables locales (bp1, bp2) ; pgs.setTopPipe (tp1, tp2) ; mise à jour JPanel topPanel.revalidate() de pgs ; topPanel.repaint() ; mettre à jour la variable suivi du temps après toutes les opérations terminées startTime = System.currentTimeMillis() ; {}}} / ** * Calcule un int aléatoire pour le placement de la pipe bas * int * / private int bottomPipeLoc() {int temp = 0; //iterate jusqu'à ce que le temp est une valeur qui autorise les deux tuyaux être à l’écran tout en (temp < = PIPE_GAP + 50 || temp > = SCREEN_HEIGHT-PIPE_GAP) {temp = (int) ((double) Math.random()*((double)SCREEN_HEIGHT));} return temp;}}