2017-06-09 1 views
0

Pour un projet informatique, je suis chargé de prendre un jeu Java terminé et d'y ajouter des parties. J'ai décidé de faire mon travail sur le jeu classique Tetris, mais j'ai quelques problèmes. Un problème est que je suis incapable d'imprimer un JLabel sur le plateau de jeu lorsque le jeu atteint un gameOver. Je le fais en utilisant trois programmes différents tous combinés par le paquet, et seulement besoin de deux des trois programmes (je crois) pour y parvenir. En outre, j'ai cherché partout comment placer le son dans Java et je n'ai pas pu trouver quoi que ce soit. Je veux ajouter le thème Tetris au jeu, mais je ne sais pas non plus où l'ajouter.Impression d'un JLabel avec un arrière-plan transparent sur un jeu + ajout de son à l'aide de Swing

Le premier code extrait ici est le programme Tetris.java, ce qui crée le JFrame et tous les JLabels:

JLabel gameTitle; 
static JLabel gameOver; 
static boolean gameIsOver = false; 
JLabel gameStatus; 
public static void main(String argsp[]) throws Exception 
{ 
    Tetris game = new Tetris(); 
    game.setVisible(true); 
    game.setResizable(false); 
    game.setSize(400, 900); 
    game.setTitle("Tetris - myName"); 
    game.setDefaultCloseOperation(EXIT_ON_CLOSE); 
    game.setLocationRelativeTo(null); 
    game.getContentPane().setBackground(Color.DARK_GRAY); 

    while(gameIsOver) 
     game.add(gameOver, BorderLayout.CENTER); 
} 
public Tetris() throws Exception 
{ 
    URL fontURL = new URL("http://www.WebpagePublicity.com/" + "free-fonts/f/Futura%20Black%20BT.ttf"); 
    Font f = Font.createFont(Font.TRUETYPE_FONT, fontURL.openStream()); 
    GraphicsEnvironment g = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
    g.registerFont(f); 

    gameTitle = new JLabel("TETRIS", SwingConstants.CENTER); 
    gameTitle.setForeground(Color.WHITE); 
    f = f.deriveFont(Font.PLAIN, 80); 
    gameTitle.setFont(f); 
    add(gameTitle, BorderLayout.NORTH); 

     gameOver = new JLabel("GAME OVER", SwingConstants.CENTER); 
     gameOver.setForeground(Color.RED); 
     gameOver.setOpaque(true); 
     f = f.deriveFont(Font.PLAIN, 50); 
     gameOver.setFont(f); 

    gameStatus = new JLabel("LINES: 0 - SCORE: 0", SwingConstants.CENTER); 
    gameStatus.setForeground(Color.WHITE); 
    f = f.deriveFont(Font.PLAIN, 30); 
    gameStatus.setFont(f); 
    add(gameStatus, BorderLayout.SOUTH); 

    Board b = new Board(this); 
    add(b); 
    b.start(); 
} 

Le deuxième programme est le programme Board.java, et je vais extraire la méthode Je crois doit être utilisé pour régler le JLabel apparaître:

private void nextTetromino() 
{ 
    cP.setRandomTetromino(); 
    cX = bW/2 + 1; 
    cY = bH - 1 + cP.minY(); 
    if(!moveTetromino(cP, cX, cY)) 
    { 
     cP.setTetromino(Tetrominoes.NoShape); 
     t.stop(); 
     playing = false; 
     ///////////////////////////////////////////////////// 


     gameOver.add(gameOver, BorderLayout.CENTER); 

     //Tetris.gameOver.add(gameOver, BorderLayout.CENTER); 


     ///////////////////////////////////////////////////// 
    } 
} 

Vous pouvez voir mes deux tentatives pour ajouter le gameOver JLabel au JFrame après la fin du match. J'ai aussi essayé de renvoyer un booléen de la méthode nextTetromino() vers le programme principal() de Tetris ainsi que le Tetris(), mais je n'ai pas eu de chance.

La deuxième partie de cette question est où je peux ajouter le thème Tetris de sorte que lorsque le jeu est en cours de lecture, le thème jouera aussi bien. J'ai le fichier MP3 téléchargé et c'est dans le dossier Tetris Source qui est à la maison à tous ces programmes.

Merci à tous!

+1

Mise au point sur une question à la fois, sinon il fait la question trop large pour répondre correctement ou sincintly – MadProgrammer

+0

1) mieux vous aider plus tôt, publiez un [MCVE] ou [Short, Self Contained, Example correct] (http://www.sscce.org/). 2) @MadProgrammer * ".. trop large pour être répondu correctement ou sincèrement" * Je suppose que vous voulez dire "succinctement" mais entièrement d'accord. SO est un site Q & A, pas un service d'assistance ou de tutorat. Chaque fil devrait se concentrer sur ** une ** question spécifique. Cela permet non seulement d'encourager les réponses de personnes qui savent comment résoudre une question mais pas l'autre, mais aussi d'aider les personnes à chercher des réponses plus tard. Ces choses sont aussi plus faciles à déboguer pour le programmeur si elles sont décomposées en parties plus petites. –

+1

@AndrewThompson Je suppose que je veux dire, quelqu'un m'a eu beaucoup trop tôt le matin et je ne devrais pas essayer d'être humain aujourd'hui: P – MadProgrammer

Répondre

0

Peut-être créer l'étiquette dans votre main comme si elle était à part de votre jeu, que vous perdiez ou non. Juste le rendre invisible. label1.setVisible(false);.

Ensuite, lorsque vous perdez, rendez l'étiquette visible en définissant la visibilité de l'étiquette sur true. (Quand vous perdez)

En ce qui concerne l'aspect sonore. Allez jeter un oeil à ce fil here ou même au poste java here

Je crois que le code ci-dessus vous aidera dans votre besoin de son.

Hope this helps: D

En ce qui concerne le réglage de la visibilité de l'étiquette d'un essai de classe différente:

if(loseGame){ 
    className.getLabelName().setVisible(true); 
    myPanel.repaint(); 
} 
+0

Soit je ne sais pas comment trouver le chemin vers le fichier son, ou simplement ça ne marche pas pour moi. Et le problème JLabel que je comprends un peu, je suis au point où je peux définir la visibilité à true dans le second programme, mais je ne sais pas comment le renvoyer au premier programme pour afficher le Game Over JLabel. – Dylpyckle13

+0

Mis à jour, essayez-le. – fluffy

1

Vous ne pouvez pas ajouter juste une étiquette à l'BorderLayout.CENTER. Cela remplacera le composant existant dans le CENTRE.

Si vous voulez que l'étiquette « au-dessus » des autres composants alors vous avez deux options:

  1. Utilisez un JLayeredPane. Votre jeu sera joué sur une couche. Ensuite, vous pouvez ajouter le JLabel sur un calque différent

  2. Afficher l'étiquette sur le glass pane du cadre. C'est le plus facile des deux approches.

Lisez le Swing Tutorial pour des exemples de ces deux approches. Il y a des sections sur:

  1. How to Use Root Panes

  2. How to Use LayeredPanes