【问题标题】:How to put properly a libgdx application inside swing application?如何在 Swing 应用程序中正确放置 libgdx 应用程序?
【发布时间】:2014-02-10 18:26:13
【问题描述】:

我正在为我的游戏创建关卡编辑器,但在使用带有 JFrame 的 LwjglCanvas 时遇到了问题。我使用 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 从未被调用(由于应用程序在可见之前不被调用,我错了吗?) 我已经尝试了很长时间,但没有结果......

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

【问题讨论】:

    标签: java swing libgdx


    【解决方案1】:

    这就是我的做法:

    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,可以让我的编辑器轻松使用它。

    【讨论】:

    • 即使你提出的方案完全依赖游戏和编辑器,我也会尝试。
    • 我认为主要的收获是我实际上可以在玩游戏的同时编辑游戏关卡,让它变得非常强大。
    • 没错,其实这正是我想做的:)
    • 第二个参数true是做什么用的?似乎他们从较新的版本中删除了它。
    • 它曾经用于启用opengl es 2.0:public LwjglAWTCanvas (ApplicationListener listener, boolean useGL2) {...
    【解决方案2】:

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

    【讨论】:

    • 我想我已经尝试过了,但是遇到了一些线程问题。无论如何,今晚我会看看你的解决方案,谢谢。
    • 是的!使用SwingUtilities.invokeLater 有效!游戏出现在 JFrame 中。现在我必须处理一些其他问题(应用程序窗口不会关闭,并且游戏不会出​​现在它应该出现的位置)。谢谢!
    • 来自文档:请注意,由于 LWJGL 和/或 Swing 处理关闭挂钩的方式,您可能需要调用 stop() 或 Swing 应用程序可能会在 System.exit 上死锁。 libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/…
    • 谢谢,我解决了这个问题,应用程序现在可以正常关闭了 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-18
    相关资源
    最近更新 更多