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中有一个方法“paint”

@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

最有可能gc.gameLoop()的方法是阻塞调用,它阻塞事件调度线程(EDT)。如果是这种情况,您应该在单独的线程中执行此操作。另一种方法是使用主动渲染。

请参阅以下链接:

于 2013-06-12T18:41:30.740 回答