游戏的简单 Java/Swing GUI [已关闭]

问题描述 投票:0回答:1

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

GGame#render(width, height) : BufferedImage

GGame#addEvent(event) : void

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

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

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

实施此类操作的最佳方法是什么?为什么?

java swing user-interface
1个回答
2
投票

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

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();
            }
        });
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.