我正在为我的游戏创建一个关卡编辑器,而且我在使用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
永远不会被调用(由于应用程序之前没有可见,我错了吗?)
我已经尝试了很长时间但没有结果...
有人知道我可以做些什么来解决这个问题吗?或者至少另一种(让我们说更容易)方法来做到这一点?
答案 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。摇摆,但值得一试,看看它是否解决了你的问题。