0

ゲームを作ってみました。ゲームを直接起動すると、ゲーム ロジックとペイントが正常に機能します。しかし、メニューからゲームを開始すると、空の JPanel が表示されます。なんで?

ゲームを直接開始:

gameLoop()ゲームが終了すると停止する「無限」ループが呼び出されます。

public class Window extends JFrame {
 public Window() {
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setLocationRelativeTo(null);
    setResizable(false);
    setTitle("Shop-Lifter");
    setFocusable(true);
    setVisible(true);
 }

 public static void main(String[] args) {
    Window window = new Window();
    GameCore gameCore = new GameCore(level);

    window.setSize(gameCore.size);
    window.add(gameCore);
    gameCore.requestFocus();
    gameCore.gameLoop();
    window.dispose();
 }
}

gameCoreには「ペイント」というメソッドがあります

@Override
public void paint(Graphics g) {
    super.paint(g);
    graphicsHendler.paint(g);
}

しかし、レベルを選択できる「メニュー」を作成しようとしています。そこで、Window オブジェクトを作成し、2 つのボタンを持つ JPanel を追加します。ボタンをクリックすると、ゲームが開始されるはずです。しかし、JFrame には灰色の JPanel しかありません。GameLoop() は実行されていますが、ペイントしていません。ゲームを開始しないgameCore.gameLoop();paint()、オブジェクトが作成された後に一度呼び出されます。

ゲーム メニューを作成します。

public class Window extends JFrame {

 public Window() {
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setLocationRelativeTo(null);
    setResizable(false);
    setTitle("Shop-Lifter");
    setFocusable(true);
    setVisible(true);
 }

 public static void main(String[] args) {
    Window window = new Window();
    WelcomeScreen levelChooser = new WelcomeScreen();
    window.setSize(levelChooser.getPreferredSize());
    window.add(levelChooser);
 }
}

そして、ゲームを開始するボタンのメソッド:

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
    Window w = new Window();
    GameCore gc = new GameCore(LevelLoader.loadLevel("ll1.lvl"));

    w.setPreferredSize(gc.size);
    w.add(gc);
    w.requestFocus();
    w.pack();
    gc.gameLoop();   
}
4

1 に答える 1

2

ほとんどの場合、メソッドはブロッキング呼び出しであり、イベント ディスパッチャー スレッド(EDT)gc.gameLoop()をブロックします。このような場合は、別のスレッドで行う必要があります。それを行う別の方法は、アクティブ レンダリングを使用することです。

次のリンクを参照してください。

于 2013-06-12T18:41:30.740 に答える