在游戏上打印具有透明背景的JLabel +使用Swing添加声音

时间:2017-06-09 17:17:46

标签: java swing awt jlabel tetris

对于计算机科学项目,我的任务是完成一个完整的Java游戏并添加一些部分。我决定在经典游戏俄罗斯方块上做我的工作,但是我遇到了一些问题。一个问题是,当游戏遇到 gameOver 时,我无法在游戏板上打印JLabel。我这样做是使用三个不同的程序,所有程序都由程序包组合而成,只需要三个程序中的两个(我相信)来实现这一点。此外,我到处搜索如何将声音放入Java中,但我找不到任何东西。我想在游戏中添加俄罗斯方块主题,但我也不知道在哪里添加它。

这里提取的第一个代码是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。我还试图从nextTetromino()方法发回一个布尔回到俄罗斯方块程序' main()以及俄罗斯方块(),但是我没有运气。

这个问题的第二部分是我可以添加俄罗斯方块主题的地方,以便在玩游戏时,主题也会播放。我已经下载了MP3文件,它在俄罗斯方块源文件夹中,是所有这些程序的所在地。

谢谢大家!

2 个答案:

答案 0 :(得分:1)

您无法向BorderLayout.CENTER添加标签。这将取代CENTER中的现有组件。

如果你想要标签"在顶部"其他组件,那么你有几个选择:

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

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

  3. 阅读Swing Tutorial,了解这两种方法的示例。有以下部分:

    1. How to Use Root Panes

    2. How to Use LayeredPanes

答案 1 :(得分:0)

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

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

关于声音方面。去看看这个帖子here甚至是java帖子here

我相信上面的代码可以帮助您满足您的声音需求。

希望这会有所帮助:D

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

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