SpacePotaters (JFrame のサブクラス) というトップレベルの GUI クラスがあり、そのコンテンツ ペインに panelViews (CardLayout レイアウト マネージャーを使用) という JPanel を追加します。特に、MainMenu オブジェクト (JPanel のサブクラス) と GameView オブジェクト (JPanel のサブクラス) をカードとして panelView に追加します。
public SpacePotaters(){
super("Space Potaters");
Container content = getContentPane();
// initialize components
gameView = new GameView(this);
mainMenu = new MainMenu(this);
leaderboard = new Leaderboard(this);
instructions = new JPanel(); // to do
cLayout = new CardLayout();
// add "cards" to CardLayout manager
panelViews = new JPanel(cLayout);
panelViews.setPreferredSize(new Dimension(WINDOW_WIDTH, WINDOW_HEIGHT));
panelViews.add("gameView", gameView);
panelViews.add("mainMenu", mainMenu);
panelViews.add("leaderboard", leaderboard);
panelViews.add("instructions", instructions);
// initially display menu menu
content.add(panelViews);
cLayout.show(panelViews,"mainMenu");
addWindowListener(this);
pack();
setResizable(false);
// relocate window to center of screen
setLocationRelativeTo(getRootPane());
}
便利な場合は、メイン メニューのペイント メソッドを次に示します。
@Override
public void paintComponent(Graphics g){
super.paintComponent(g);
g.drawImage(mainMenuBackground, 0, 0, spTop.getWindowWidth(), spTop.getWindowHeight(), null);
}
今は背景画像をペイントするだけです。後で、クリックすると別のカードに切り替わる JButton を追加します。
メイン メニュー カードから始めて、必要に応じて他のカードに切り替えるという考え方です。プログラムを実行したところ、gameView 用に作成された画像に置き換わる前に、メイン メニュー カードが一瞬点滅することに気付きました。ゲームが途中で開始されないように、実際にそのカードに切り替えるまで、gameView グラフィックスのレンダリングを待つ必要があることはわかっています。私が混乱するのはそこじゃない。待たなくても、gameView が表示されずに起動してしまうのではないでしょうか。つまり、gameView 内で何が起こっているかに関係なく、mainMenu だけが表示されるカードのままであるべきではありませんか?
問題は、アクティブ レンダリングとダブル バッファリングを使用する gameView 内にあると考えました。GameView には、ゲームのループごとに 1 回呼び出される次のメソッドがあります。
public void paintScreen(){
// get fresh graphics context for GameView each time
Graphics context = getGraphics();
if (context != null && dbImage != null){
context.drawImage(dbImage, 0, 0, null);
}
context.dispose();
}
このメソッドの本体をコメント アウトすると、必要な結果が生成されます。mainMenu のみが表示されます。どうしてこうなったのか不思議です。各コンポーネント (JFrame、JPanel など) には独自のグラフィックス コンテキストがあると思いました。では、GameView 内で getGraphics() を呼び出した場合、spTop または panelViews のグラフィック コンテキストではなく、gameView パネルのグラフィック コンテキストを返すべきではありませんか? また、その特定のグラフィックス コンテキストのみを変更するため、gameView パネルが表示されない場合 (mainMenu オブジェクトで CardLayout の show() メソッドを使用する場合は表示されないはずです)、メイン メニューのビューに影響を与えることはありません。 . 何か案は?
注: isVisible() を使用して gameView と mainMenu の両方をテストすると、gameView は false を返し、mainMenu は true を返します。また、getGraphics() を使用して、mainMenu、spTop、および gameView グラフィック コンテキストがすべて異なるかどうかをテストしました。そのため、gameView は独自のグラフィックス コンテキストで画像を描画しており、表示されませんが、paintScreen() 内の drawImage() の効果は引き続き表示されます。本当に混乱しています。