0

我正在开发一个基于主 JFrame 的图形棋盘游戏程序。游戏板本身源自 JPanel。

当有人获胜时,我希望能够在整个窗口上显示“胜利屏幕”。我想我可以从一开始就成功显示的“欢迎屏幕”扩展这个想法。当这段代码运行时,欢迎屏幕出现,停留 2 秒,然后消失,游戏板出现并准备好玩。希望这些基本部分足以说明我如何设置它:

public class MyGame{     
  public static Board b;                //Board extends JPanel
  public static Window gameWindow;      //Window extends JFrame
  ...
  public static void main(String args[]) throws IOException{
    ...
    gameWindow = new Window("My Game"); 
    //DisplayScreen extends JPanel
    DisplayScreen intro = new DisplayScreen("welcomeScreen.png"); 
    gameWindow.setSize(960, 570); 
    gameWindow.add(intro); 
    gameWindow.setVisible(true); 
    wait(2); //just a function I wrote 
    ...
    b = new Board("board.png"); 
    ... 
    gameWindow.remove(intro);  
    gameWindow.add(b); 
    gameWindow.repaint(); 
    gameWindow.setVisible(true); 
    ...
  }
  ... 
}

诚然,它需要大量的试验和错误才能让它发挥作用。不过,就我的一生而言,我无法弄清楚如何在游戏后期的某个时刻临时放置胜利画面。我想我可以通过中心MyGame班的一个函数来做到这一点(我在Window班上和其他地方都试过,但没有成功)。就像是:

public static void VictoryScreen(){
    DisplayScreen victoryScreen = new DisplayScreen("victoryScreen.jpg");   
    victoryScreen.setVisible(true); 
    gameWindow.add(victoryScreen); 
}

不幸的是,这没有显示任何内容。我已经尝试了各种方式,,,add等等setVisiblevalidate并查看了其他一些问题,但似乎没有任何效果。我还尝试将victoryScreen声明放在初始欢迎屏幕旁边并将其设置为不可见(然后在我想显示它时设置为可见),但这只是在一开始就在所有内容上放置一个灰色面板。似乎在构造某些东西时,它会自动绘制。将电路板作为另一个 JPanel 层似乎很冒险,但我对 JSwing 知之甚少。

无论如何,我被难住了。关于使胜利屏幕(以及最终其他屏幕)按需要显示的程序的任何建议?

*编辑:这是我覆盖paintComponent屏幕显示类的方式:

public void paintComponent(Graphics g){ 

              //works fine for welcome screen
      g.drawImage(screenImage, 0, 0, 960, 540, null); 
      repaint(); 
}
4

2 回答 2

2

一种方法是通过 CardLayout 和多个 JPanel。

另一种方法是设计一个状态机,其中程序状态在一个面板中发生变化。

老实说,这在当前的 java 状态下是一个非常困难的问题,出于演示目的,坚持第一个。就个人而言,我更喜欢第二种选择。

这两种方法都令人沮丧且无效,因为 CardLayout 不是为游戏屏幕变化而设计的,而制作一个严重依赖全局状态的程序真的很难推理......

于 2013-04-02T02:01:45.780 回答
1

这可能不是最佳做法,但如果这么快就到期了——

我的直接反应是只使用 setContentPane 替换 JFrame 的内容,然后用游戏板再次调用它以将其重新设置。

我认为对 .add 的调用与对介绍屏幕的调用方式不同的原因是,您没有在添加胜利屏幕之前删除游戏板,而是在添加游戏板之前删除了介绍。也许如果您删除游戏板然后调用 add 将胜利屏幕放入它会起作用?

于 2013-04-02T02:18:55.993 回答