Докуметация Cтарт Статьи Форум Лента Вход
Не официальное русскоязычное сообщество

JME3 Canvas в Swing GUI

Опубликованно: 04.06.2017, 0:07
Последняя редакция, Andry: 04.09.2017 19:53

3D-игры обычно воспроизводятся в полноэкранном режиме или в окне, которое берет на себя мышь и весь остальной ввод данных. Однако также можно встроить холст(canvas) jME 3 в стандартное приложение Swing.
Это может быть полезно, когда вы создаете какой-то интерактивный 3D-просмотрщик с более сложным пользовательским интерфейсом, чем просто HUD: например, интерактивная научная демонстрация, редактор уровней или дизайнер игровых персонажей.

  • Преимущества:
    • Вы можете использовать компоненты Swing (рамка, панели, меню, элементы управления) рядом с вашей игрой jME3.
    • NetBeans Конструктор GUI(builder GUI) совместим с jMonkeyEngine; Вы можете использовать его, чтобы выложить frame Swing GUI, а затем add() в него холст jME. Установите Конструктор GUI через Сервис ▸ Подключаемые модули ▸ Доступные подключаемые модули.
  • Недостатки:
    • Вы не можете так же как и раньше использовать захват мыши SimpleApplication по умолчанию для управления камерой, так что вы должны придумать свое решение.

Вот полный пример кода TestCanvas.java.

Расширение SimpleApplication

Вы начинаете так же, как и для любой jME3 игры: базовое приложение, здесь SwingCanvasTest, расширяющее com.jme3.app.SimpleApplication. Как обычно, вы используете simpleInitApp() для инициализации сцены и simpleUpdate() как цикл событий.
Поведение камеры по умолчанию в SimpleApplication — это захват мыши, что не имеет смысла в окне Swing. Вы должны деактивировать и заменить это поведение flyCam.setDragToRotate(true); При инициализации приложения:

public void simpleInitApp() {
  // активировать режим оконного ввода
  flyCam.setDragToRotate(true);
  // Настройте ввод и загрузите сцену как обычно
  ...
}

Короче: первое, что отличается, это метод main(). Как обычно, мы не вызываем start() в объекте SwingCanvasTest. Вместо этого мы создаем Runnable(), который создает и открывает стандартный Swing jFrame. В runnable мы также создаем нашу игру SwingCanvasTest со специальными настройками, создаем Canvas для нее и добавляем ее в jFrame. Затем мы вызываем startCanvas().

Main() и Runnable()

Swing не является потокобезопасным и не позволяет нам обновлять canvas jME3. Вот почему мы создаем runnable для холста jME и ставим его в поток событий AWT, поэтому его можно вызвать «позже в цикле, когда Swing готов к обновлению собственного материала.
В методе main() SwingCanvasTest создайте очередь runnable(). Он будет содержать холст jME и frame Swing.

  public static void main(String[] args) {
    java.awt.EventQueue.invokeLater(new Runnable() {
      public void run() {
         // ... смотри ниже...
      }
    });
  }
Обратите внимание, что вы должны использовать app.enqueue() при изменении объектов в сцене из очереди событий AWT, вы должны использовать java.awt.EventQueue.invokeLater() из других потоков (например цикла обновления) при изменении swing элементов. Это может быстро привести к трудностям если у вас нет подходящей модели потоковой планировки, поэтому вы можете использовать NiftyGUI, поскольку он встроен в поток цикла обновления и также кросс-платформенный (например, android и.т.д.).

Создание Canvas

Здесь, в методе run(), мы запускаем приложение jME, создаем его холст(canvas), создаем frame Swing и добавляем все вместе.
Задайте com.jme3.system.AppSettings, что бы jME мог знать размер панели Swing, в которую мы ее помещаем. Приложение не будет запрашивать у пользователя настройки отображения, вы должны указать их заранее.

AppSettings settings = new AppSettings(true);
settings.setWidth(640);
settings.setHeight(480);

Мы создаем наше приложение SwingCanvasTest для холста и настраиваем его. Мы вручную создаем холст для этой игры и настраиваем com.jme3.system.JmeCanvasContext. Метод setSystemListener() гарантирует, что слушатель получает события, связанные с созданием, обновлением и уничтожением context.

SwingCanvasTest canvasApplication = new SwingCanvasTest();
canvasApplication.setSettings(settings);
canvasApplication.createCanvas(); // создание canvas!
JmeCanvasContext ctx = (JmeCanvasContext) canvasApplication.getContext();
ctx.setSystemListener(canvasApplication);
Dimension dim = new Dimension(640, 480);
ctx.getCanvas().setPreferredSize(dim);

Обратите внимание, что мы не вызывали start() в приложении, как это обычно делалось в методе main(). Вместо этого мы будем вызывать startCanvas() и позже.

Создание Swing Frame

Внутри метода run() вы создаете окно Swing, как обычно. Создайте для него пустые компоненты jFrame и add() или создайте собственный объект jFrame в другом файле класса (например, с помощью NetBeans GUI builder) и создайте его здесь. Что бы вы ни делали, давайте назовем окно jFrame.

JFrame window = new JFrame("Swing Application");
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

Мы создаем стандартный JPanel внутри JFrame. Дайте ему любой Layout, который вы хотите — здесь мы используем Flow Layout. Если в примере кода вы увидите «Some Swing Component», то здесь вы добавляете свои кнопки и элементы управления.
Важным шагом является add() компонента canvas в панель, как и все другие компоненты Swing.

JPanel panel = new JPanel(new FlowLayout()); // панель
// добавьте все свои компоненты Swing ...
panel.add(new JButton("Some Swing Component"));
...
// добавьте JME canvas
panel.add(ctx.getCanvas());

OK, jFrame и панель готовы. Мы добавляем панель в jFrame и собираем все вместе. Установите window видимым, то есть на true, чтобы он появилось.

window.add(panel);
window.pack();
window.setVisible(true);

Помните, что мы еще не вызывали start() в приложении jME? Для холста существует специальный метод startCanvas(), который вы должны вызывать сейчас:

canvasApplication.startCanvas();

Очищайте, собирайте и запускайте!

Навигация

Помните, чтобы перемещаться по сцене, нажмите кнопку мыши и перемещайте мышью(!) Или нажмите клавиши WASD. В зависимости от вашей игры вы даже можете определить пользовательские ввод для обработки навигации в этой нетипичной среде.


Переведено для jmonkeyengine.ru, оригинал
Автор перевода: Andry

Добавить комментарий

jMonkeyEngine.ru © 2017. Все права сохранены.