Как правильно разместить приложение libgdx внутри приложения swing?
Я создаю редактор уровней для своей игры, и у меня проблема с использованием LwjglCanvas с JFrame. Я использую JFrame (не LwjglFrame), чтобы поддерживать как можно более независимый редактор движка и уровня.
У меня два JAR: WorldEditor.jar и GameEngine.jar. Внутри WorldEditor у меня есть кнопка под названием "test", то есть предположим, что загрузите GameEngine.jar(если она еще не загружена) и запустите (переставьте ее, если она уже загружена) в основной кадр приложения.
Фактически, то, что я делаю, это инъекция игрового контейнера WorldEditor (например JPanel внутри JFrame) в игровое приложение и использование 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
никогда не вызывается (из-за того, что приложение не должно быть видимым, я ошибаюсь?)
Я пробовал в течение долгого времени, но никакого результата...
Есть ли у кого-то представление о том, что я могу сделать, чтобы исправить эту проблему? Или, по крайней мере, еще один способ (пусть проще) сделать это?
Ответы
Ответ 1
Вы должны использовать SwingUtilites.invokelater, потому что postRunnable сообщения в игровой цикл, который не запущен. Я попытался бы получить компонент из MyGame и добавить его. Если вы вернете компонент, у вас нет депо. к LwjglCanvas. Это не очень приятно, потому что теперь у интерфейса MyGame есть папка. качать, но это стоит того, чтобы понять, разрешает ли ваша проблема ваша проблема.
Ответ 2
Вот как я это делаю:
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 для моего игрового класса, что упрощает работу с моим редактором.
Ответ 3
Я использовал метод Per-Erik Bergman (выше), но почему-то я не могу "спрятать" свой JPanel на основе libGDx - графический фрейм остается намазанным поверх всех других элементов пользовательского интерфейса Swing-приложений.
Как только JPanel на основе libGDx создан, его нельзя скрыть. Он исчезнет, если вы удалите JPanel из родительского объекта, но тогда мы получим SIGSEGV, когда вы добавите его обратно.