3

私はゲームを作ろうとしています。ゲームには、メインメニューや実際のゲーム画面など、いくつかの異なる画面があります。これらはそれぞれ個別のjpanel拡張機能です。GameというクラスであるJFrameにそれぞれを追加しました。私のゲームクラスでは、次のメソッドがあります

public void addPanel( JPanel p ) {
    panels.add( p ); // An array of all the different panels I need
    this.getContentPane().add( p );
}

public void switchToPanel( JPanel p ) {
    for ( JPanel somePanel : panels ) {
        somePanel.setVisible( false );
    }

    p.setVisible( true );
    repaint();
}

これのポイントは、私には多くの異なるパネルがあり、メニュー画面などの特定のパネルを表示する必要がある場合は、switchToPanel(myPanel)を呼び出すことです。基本的には、すべてのパネルを非表示にしてから、表示する必要のあるパネルを非表示にします。唯一の問題は、これらのパネルに切り替えたときにこれらのパネルが表示されないことです。表示されるのは、最後に追加したパネルだけです。Objective CIでは、この手法を使用して常にビューを切り替えますが、問題は発生していません。この種のことはJavaでは許可されていませんか?

編集:切り替え後にrepaint()を呼び出していますが、まだ機能していません

4

4 に答える 4

9

同じ効果を得るために、さまざまなことを行うことができます。

私が行う最初の提案は、CardLayout ( CardLayout の使用方法) を使用することです。

もう 1 つは、JTabbedPane (タブ付きペインの使用方法)を使用することです。

于 2012-09-17T23:59:32.173 に答える
3

ゲームを作る場合は、 とは別のスレッドで作成しますEDT。ほとんどのゲームは、パネルを変更せずにさまざまな画面を表示しますが、単一のパネルを使用し、その上で に従ってレンダリングしGameStateます。

これが例です。

public class MyGame extends JPanel implements Runnable {

    public static enum GameState {
        MENU, INTRO, LEVELS, END, TITLES
    }

    GameState state = GameState.MENU;

    public MyGame(){
        setDoubleBuffered(true);
        // Initialize the resources
        new Thread(this).start();
    }

    public void update(long elapsedTime){
        switch (state){
            case MENU:
                // Show the menu
                break;
            ....
        }
    }

    private void GameLoop(){
        // Game Loop goes here
    }

    public void run(){
        GameLoop();
    }

    public void paint(Graphics g){
        // switch and draw your game
    }

    public static void main(String[] args){
        JFrame f = new JFrame("MyGame");
        f.setSize(640, 480);
        f.add(new MyGame());
        f.setVisible(true);
    }

}

1 つの状態、つまりメニューが完了した場合は、state変数を変更します。そしてGameEngine、自分で作る前にまず a の使い方を学びましょう。

于 2012-09-18T02:55:10.720 に答える