如何在swing应用程序中正确放置libgdx应用程序?

时间:2014-01-21 08:59:45

标签: java swing libgdx

我正在为我的游戏创建一个关卡编辑器,而且我在使用LwjglCanvas和JFrame时遇到了问题。我使用JFrame(而不是LwjglFrame)来保持引擎和关卡编辑器尽可能独立。 我有两个JAR:WorldEditor.jar和GameEngine.jar。在WorldEditor中,我有一个名为“test”的按钮,假设加载GameEngine.jar(如果尚未加载)并启动(如果已加载则将其重新启动)到应用程序主框架中。 实际上,我所做的是将WorldEditor游戏容器(例如JFrame中的JPanel)注入游戏应用程序,并使用Gdx.app.postRunnable将lwjglcanvas添加到注入的游戏容器中:

世界编辑方:

JPanel _gameContainer = new JPanel(); // is inside a JFrame
MyGame game = loadGame(_gameContainer); // load the GameEngine JAR, and retrive the game

GameEngine方面:

// container is the _gamecontainer of above
public void createGame(final Container gameContainer)  
{
    LwjglCanvas canvas = new LwjglCanvas(myapp, myconfig);
    Gdx.app.postRunnable(new Runnable()
    {
       public void run()
       {
           gameContainer.add(canvas.getCanvas());
       }
    });
}

事实是postRunnable永远不会被调用(由于应用程序之前没有可见,我错了吗?) 我已经尝试了很长时间但没有结果...

有人知道我可以做些什么来解决这个问题吗?或者至少另一种(让我们说更容易)方法来做到这一点?

2 个答案:

答案 0 :(得分:10)

我就是这样做的:

public class EditorApp extends JFrame {

    public EditorApp() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        final Container container = getContentPane();
        container.setLayout(new BorderLayout());

        LwjglAWTCanvas canvas = new LwjglAWTCanvas(new MyGame(), true);
        container.add(canvas.getCanvas(), BorderLayout.CENTER);

        pack();
        setVisible(true);
        setSize(800, 600);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new EditorApp();
            }
        });
    }
}

我的游戏类也有一些API,可以让我的编辑器轻松使用。

答案 1 :(得分:5)

你必须使用SwingUtilites.invokelater,因为postRunnable发布到未运行的游戏循环。我会尝试从MyGame获取一个Component并添加它。如果您返回一个Component,则表示您没有dep。到了LwjglCanvas。它不是那么好,因为现在MyGame界面有一个dep。摇摆,但值得一试,看看它是否解决了你的问题。