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

Java 在游戏上打印带有透明背景的JLabel+使用Swing添加声音,java,swing,awt,jlabel,tetris,Java,Swing,Awt,Jlabel,Tetris,对于一个计算机科学项目,我的任务是制作一个完整的Java游戏并添加一些部分。我决定做我的工作在经典的游戏俄罗斯方块,但我有一些问题。一个问题是,当游戏点击gameOver时,我无法在游戏板顶部打印JLabel。我使用三个不同的程序来完成这项工作,所有这些程序都由软件包组合而成,我只需要三个程序中的两个就可以实现。此外,我到处都在寻找如何将声音放入Java中,但没有找到任何东西。我想把俄罗斯方块主题添加到游戏中,但是我也不知道在哪里添加它 这里提取的第一个代码是Tetris.java程序,它创建J

对于一个计算机科学项目,我的任务是制作一个完整的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。我还尝试将一个布尔值从nextetromino方法发送回俄罗斯方块程序的主程序和俄罗斯方块,但是我没有运气

这个问题的第二部分是我可以在哪里添加俄罗斯方块主题,这样在玩游戏时,主题也会玩。我下载了MP3文件,并将其保存在所有这些程序所在的俄罗斯方块源文件夹中


谢谢大家

无论你输赢与否,都可以在你的main中创建标签,就好像它是你比赛的一部分一样。让它隐形。标签1.setVisiblefalse

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

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

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

希望这有帮助:D

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

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

不能只向BorderLayout.CENTER添加标签。这将替换中心的现有零部件

如果希望标签位于其他组件的顶部,则有两个选项:

使用JLayeredPane。您的游戏将在一层上进行。然后可以在不同的层上添加JLabel

在框架的玻璃窗格上显示标签。这是两种方法中比较容易的一种

阅读这两种方法的示例。以下章节介绍:


要么我不知道如何找到声音文件的路径,要么就是它对我不起作用。还有JLabel问题,我有点理解,我现在可以在第二个程序中将可见性设置为true,但我不知道如何将其发送回第一个程序以通过JLabel显示游戏。更新,尝试一下。每次关注一个问题,否则,这会使问题过于宽泛,无法正确回答,因此,为了更快地获得更好的帮助,请张贴或。2@MadProgrammer..太宽泛,无法正确或真诚地回答我猜你的意思是“简洁”,但完全同意。问答网站也是如此,而不是服务台或辅导服务。每个线程都应该关注一个特定的问题。这不仅有助于鼓励知道如何解决一个问题而不知道如何解决另一个问题的人回答问题,而且有助于人们以后寻找答案。这些东西如果分解成更小的部分,程序员也更容易调试。@AndrewThompson我想我的意思是,有人让我早上起得太早了,我今天不应该试着去调试:P