2013-06-12 50 views
0

我尝试创建游戏。如果我直接开始游戏,游戏逻辑和绘画工作正常。但是从菜单开始游戏后有空的JPanel。为什么?Java - 即使方法被调用,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(); 
} 
+0

问题是,???? –

+0

为什么我从菜单开始游戏后没有画任何东西 – cepak

+0

为什么你有两条主线?你应该@Override'paintComponent'而不是'paint'在摆动组件 – nachokk

回答

2

最有可能gc.gameLoop()方法是一个阻塞调用,其阻断事件调度线程(EDT) 。如果是这种情况,你应该在一个单独的线程中完成。另一种方法是使用主动渲染。

请访问以下链接:

+0

很酷。我把我的图画放入gameLoop()。现在我必须编写清除jPanel的方法。但窗口似乎超载,并且不会对点击退出图标作出反应。 – cepak

相关问题