2017-06-09 35 views
0

对于计算机科学项目,我负责完成一个完整的Java游戏并添加一些部分。我决定在经典游戏“俄罗斯方块”上做我的工作,但是我遇到了一些问题。其中一个问题是,当游戏遇到gameOver时,我无法在游戏板上打印JLabel。我正在使用三个不同的程序来完成这一切,并且只需要三个程序中的两个(我相信)来实现这一点。另外,我到处搜索如何将声音放入Java中,而且我还找不到任何东西。我想将俄罗斯方块主题添加到游戏中,但我也不知道在哪里添加它。在游戏中打印具有透明背景的JLabel +使用Swing添加声音

这里提取的第一代码是Tetris.java程序,它创建的JFrame和所有的JLabel:

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

第二程序是Board.java程序,我将提取方法,该方法我认为必须用于设置JLabel以显示:

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


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

你可以看到我的两个尝试将GAMEOVER的JLabel添加到JFrame比赛结束后。我也尝试从下一个Tetromino()方法返回一个布尔值回到Tetris程序的main()以及Tetris(),但是我没有运气。

这个问题的第二部分是我可以添加俄罗斯方块主题的地方,这样当游戏进行时,主题也会发挥作用。我下载了MP3文件,并将其放入所有这些程序的家中的Tetris源文件夹中。

谢谢大家!

+1

上一次在一个疑问焦点,否则使问题过于宽泛正确或sincintly – MadProgrammer

+0

1)回答尽快提供帮助,发布[MCVE]或[简短,独立,正确的示例](http://www.sscce.org/)。 2)@MadProgrammer *“太宽泛,无法正确回答或缺陷”*我想你的意思是'简洁',但完全同意。 SO是一个问答网站,不是帮助台或辅导服务。每个线程都应该关注**一个**具体问题。这不仅有助于鼓励那些知道如何解决一个问题而不是另一个问题的人的答案,还有助于人们以后寻找答案。如果程序员分解成更小的部分,这些事情也更容易进行调试。 –

+1

@AndrewThompson我想我的意思是,有些人早上起来太早,我不应该在今天尝试人类:P – MadProgrammer

回答

0

也许在你的主体内创建标签,就好像它是你的游戏的一部分,不管你是否输了。只是让它看不见。 label1.setVisible(false);

然后当你输了,通过将标签的可见性设置为true使标签可见。 (当你输了)

关于声音方面。去看看这个线程here或甚至在java post here

我相信上面的代码应该帮助你对声音的需求。

希望这有助于:d

至于从不同的类尝试设置标签的可见性:

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

我不知道如何找到声音文件的路径,或者简单地说不适合我。和JLabel问题我有点理解,我在第二个程序中可以将可见性设置为true的点,但我不知道如何将它发送回第一个程序来显示Game Over JLabel。 – Dylpyckle13

+0

更新后,再试一次。 – fluffy

1

你不能只添加标签到BorderLayout.CENTER。这将取代CENTER中的现有组件。

如果你想“上面”其他组件的标签,那么你有两个选择:

  1. 使用的JLayeredPane。您的游戏将在一层上播放。然后,您可以将JLabel添加到不同的图层上

  2. 在框架的glass pane上显示标签。这是两种方法中较容易的。

阅读Swing Tutorial这两种方法的示例。上有几个部分:

  1. How to Use Root Panes

  2. How to Use LayeredPanes