简单的Java/Swing GUI游戏



我正在用java编写一款简单的2D游戏。到目前为止,我有一个GGame类,它基本上描述了整个游戏/它的状态。与这个游戏的唯一互动是通过

GGame#render(width, height) : BufferedImage

GGame#addEvent(event) : void

当游戏启动时,创建一个JFrame,并将扩展JPanel的GamePanel添加到框架中。GamePanel正在做所有的事情,从发送事件到渲染/重新绘制自身。

现在我想在游戏顶部添加GUI(库存,一些其他信息,…)。我的想法是简单地让GUI扩展JPanel并将其添加到像GamePanel这样的框架中,同时GUI有一个对GGame的引用来询问库存等。

这里要明确的是,我不想在游戏旁边添加GUI,而是在它上面。我的问题是,我总是需要所有的事件传递到两个面板,而顶部的一个(GUI)是透明的。此外,我希望两个面板都能自动适应窗口大小(GamePanel通过每次渲染器获取面板大小来实现这一点)。

实现这样的东西的最好方法是什么,为什么?

下面是具有您所要求的功能的两个面板的演示。请看评论。

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;
public class LayeredPaneDemo extends JFrame{
    private JLayeredPane layeredPane;
    private RedPanel redPanel;
    private YellowPanel yellowPanel;
    public LayeredPaneDemo()    {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(new Dimension(300, 310));
        //Create and set up the layered pane.
        layeredPane = new JLayeredPane();
        //create a red panel
        redPanel = new RedPanel();
        redPanel.setBackground(Color.RED);
        //make it the same size as parent 
        redPanel.setBounds(getBounds());
        //at it to layered pane with index of 1 
        layeredPane.add(redPanel, 1);
        //similarly make yellow panel
        yellowPanel = new YellowPanel (redPanel); //yellow panel has a reference 
                                                  //to red panel 
        yellowPanel.setBackground(Color.YELLOW);
        yellowPanel.setBounds(getBounds());
        layeredPane.add(yellowPanel, 2);
        //add a mouse listener to both panels 
        redPanel.addMouseListener(getMouseListener(yellowPanel));
        yellowPanel.addMouseListener(getMouseListener(redPanel));
        setContentPane(layeredPane);
        layeredPane.setLayout(new BorderLayout(0, 0));
        setVisible(true);
    }
    //mouse listener: when a panel is clicked, the other panel 
    //is moved to front 
    private MouseListener getMouseListener(JPanel panel) {
        return new MouseAdapter() {
            @Override
            public void mousePressed(MouseEvent e) {
                layeredPane.moveToFront(panel);
            }
        };
    }
    public class RedPanel extends JPanel {
        RedPanel(){
        }
        //returns a fixed value 
        public int getValue() {
            return 16;
        }
    }
    public class YellowPanel extends JPanel {
        YellowPanel(RedPanel redPanel){
            //add a label showing value retrieved from red panel 
            add(new JLabel("Value from red panel is :"+ redPanel.getValue()));
        }
    }
    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new LayeredPaneDemo();
            }
        });
    }
}

如果需要,不要犹豫,要求澄清。
(上面也演示了https://stackoverflow.com/help/mcve。更容易

最新更新