gpt4 book ai didi

java - 简单的 Java/Swing GUI 游戏

转载 作者:行者123 更新时间:2023-12-02 03:16:47 25 4
gpt4 key购买 nike

我正在用 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 通过每次渲染器获取面板大小来实现这一点)。

实现这样的事情的最佳方法是什么?为什么?

最佳答案

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

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 。更容易帮助并获得有关 MCVE 制定的问题的帮助)。

关于java - 简单的 Java/Swing GUI 游戏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40187591/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com