我是Java.Swing的初学者,并尝试根据我在互联网上找到的一个例子制作我自己的Snake游戏,因此通过这个过程学习。一切都很好,游戏工作,但现在我正在尝试在"游戏中添加一个重启按钮。屏幕。该计划的结构如下:
主程序
public Snake() {
add(new Board());
setResizable(false);
pack();
setTitle("Snake");
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
JFrame ex = new Snake();
ex.setVisible(true);
}
});
}
董事会:(试图仅粘贴相关代码)
Board() {
initializeVariables();
addKeyListener(new EventHandler());
setBackground(Color.black);
setFocusable(true);
setPreferredSize(new Dimension(BOARD_WIDTH, BOARD_HEIGHT));
loadImages();
timer = new Timer(delay, this);
timer.start();
}
使用以下方法覆盖:
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
doDrawing(g);
}
@Override
public void actionPerformed(ActionEvent e) {
///
repaint();
}
当游戏结束时,蛇不再被绘制,但在paintComponent / doDrawing中调用以下方法:
private void gameOver(Graphics g) {
String msg = "Game Over";
String msg2 = "New Game?";
Font small = new Font("Helvetica", Font.BOLD, DOT_SIZE);
FontMetrics metr = getFontMetrics(small);
g.setColor(Color.white);
g.setFont(small);
g.drawString(msg, (BOARD_WIDTH - metr.stringWidth(msg)) / 2, BOARD_HEIGHT / 2);
g.drawString(msg2, (BOARD_WIDTH - metr.stringWidth(msg)) / 2, (BOARD_HEIGHT / 2) + DOT_SIZE*2);}
真的,我需要的是第二个字符串"新游戏?"响应并重新启动游戏。我该怎么做?
当然,我想过使用JButton。但是,我仍然不确定JFrame和JPanel是如何工作的。我尝试在actionPerformed()中创建按钮,仅在游戏结束时使用add()将其添加到屏幕上。它没有显示,我相信原因是JPanel已经占据了整个屏幕(JFrame?),因此需要在它之后绘制Button,但这将在JFrame之外。
我对如何进一步采取任何建议?
谢谢。
答案 0 :(得分:0)
尝试使用
dispose();
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
JFrame ex = new Snake();
ex.setVisible(true);
}
});
我不知道这只是一个假设我会在重播方法的核心上尝试它
欢迎使用更多代码以帮助您
答案 1 :(得分:0)
我通过在调用Board()时添加按钮来处理它,但将其设置为"隐藏"并且只在游戏结束时显示(并启用它)。方法:
private void addRestartButton() {
String buttonText = "New Game?";
restartButton = new JButton(buttonText);
Font font = new Font("Helvetica", Font.BOLD, size);
restartButton.setFont(font);
setLayout(null);
restartButton.setBounds(x,y,w,z);
add(restartButton);
restartButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
restart();
}
});
setButtonVisibility(false);
}
我不确切地知道为什么按钮没有出现在第一位;也许它不能在程序的后期添加?或者默认情况下可见性设置为false。由于我只是尝试这样做并且它起作用,我没有回去看看为什么。无论如何,这是我的一些发现:
我相信下一步是通过为每个屏幕制作一个单独的JPanel(所以开始页面,游戏,结束游戏)以及处理主Snake()程序中的面板更改来重构整个游戏。