jMonkeyEngine 3 Tutorial (1) - Hello SimpleApplication

Добавлен , опубликован
Следующий туториал: jMonkeyEngine 3 Tutorial (2) - Hello Node
Перед вами предварительная версия перевода одного из туториалов по jMonkeyEngine "для самых маленьких". Английский вариант взят с официального сайта jMonkeyEngine. В перспективе планируется перевод остальных туториалов и создание проекта, посвященного этому замечательному движку.
Требования: предполагается что вы уже установили jMonkeyEngine SDK и имеете базовые знания о Java.
Данный и последующие туториалы написаны в реалиях jMonkeyEngine SDK, но более опытным разработчикам не составит труда использовать для работы с jMonkeyEngine любую IDE или даже командную строку и блокнот.
В переводе намеренно сохранены многие английские названия и термины, автор перевода не несет ответственности за использование русскоязычных версий средств разработки.

Создание проекта

В jMonkeyEngine SDK:
  1. Выберите File>New Project… в главном меню.
  2. В открывшемся мастере создания проекта выберите шаблон(template) JME3>Basic Game. Нажмите "Next".
    • укажите имя проекта, например, "HelloWorldTutorial".
    • укажите путь к папке, в которой вы хотите сохранить файлы проекта, например папку jMonkeyProjects в домашней директории.
  3. Нажмите "Finish".
Если у вас возникли вопросы, существует отдельная статья, посвященная созданию проекта, но она еще не переведена.
Для лучшего усвоения материала рекомендуется самостоятельно выполнить все этапы туториалов, но если вам по каким-то причинам понадобятся примеры - всегда можно создать проект на основе шаблона JmeTests в jMonkeyEngine SDK.

Расширяем ​Simple​Application (альтернативный перевод - наследуем).

Для этого туториала вам понадобится создать в вашем проекте файл HelloJME3.java и поместить его в пакет jme3test.helloworld. В принципе, названия класса и пакета могут отличаться от предложенных, но для удобства работы с туториалами рекомендуется придерживаться этих названий.
В jMonkeyEngine SDK:
  • Сделайте правый клик по узлу Source Packages в структуре проекта.
  • Выберите New…>Java Class чтобы создать новый файл класса.
  • Введите название класса: HelloJME3
  • Введите название пакета: jme3test.helloworld.
  • Нажмите "Finish".
SDK создаст для вас файл HelloJME3.java.

Код примера

Замените содержимое файла HelloJME3.java следующим кодом:
package jme3test.helloworld;
 
import com.jme3.app.SimpleApplication;
import com.jme3.material.Material;
import com.jme3.math.Vector3f;
import com.jme3.scene.Geometry;
import com.jme3.scene.shape.Box;
import com.jme3.math.ColorRGBA;
 
/** Пример 1 - простейшее JME 3 приложение.
 * Отображает трехмерный синий куб и позволяет рассмотреть его
 * со всех сторон, управляя камерой с помощью мышки и WASD. */
public class HelloJME3 extends SimpleApplication {
 
    public static void main(String[] args){
        HelloJME3 app = new HelloJME3();
        app.start(); // запускаем нашу "игру"
    }
 
    @Override
    public void simpleInitApp() {
        Box b = new Box(1, 1, 1); // создаем кубическую форму
        Geometry geom = new Geometry("Box", b);  // создаем геометрию куба для формы.
        Material mat = new Material(assetManager,
          "Common/MatDefs/Misc/Unshaded.j3md");  // создаем простой материал
        mat.setColor("Color", ColorRGBA.Blue);   // задаем синий цвет материалу
        geom.setMaterial(mat);                   // применяем материал к кубу
        rootNode.attachChild(geom);              // отображаем куб на сцене
    }
}
Сделайте правый клик по классу HelloJME3 и выберите пункт "Run". Если появится окно настроек jME3, подтвердите использование стандартных настроек.
  • После этого вы должны увидеть простое окно, отображающее куб в 3D.
  • Для навигации используйте WASD и мышку.
  • В нижнем левом углу можно увидеть счетчик FPS и прочую отладочную информацию. Эта информация понадобится вам в процессе разработки, но для релиза ее рекомендуется убрать. Чтобы правильно понимать числа, учитываете, что отладочная информация также влияет на счетчики объектов и вершин (на момент написания туториала это было 14 лишних объектов и 914 вершин).
  • Нажмите Esc чтобы закрыть приложение.
Если у вас все получилось - поздравляю! Теперь давайте посмотрим поближе.

Разбираем код

Приведенный выше код инициализирует сцену и запускает приложение.

Запускаем ​Simple​Application

Посмотрите на первую строку описания класса (игнорируем package и include). Ваш класс HelloJME3.java наследуется от com.jme3.app.SimpleApplication.
public class HelloJME3 extends SimpleApplication {
  // ваш код
}
Каждая игра на JME3 это экземпляр класса com.jme3.app.SimpleApplication. Класс SimpleApplication по мнению авторов представляет собой пример простейшего приложения: оно управляет 3d сценой, принимает пользовательский ввод, обновляет состояние игры, и автоматически отображает сцену на экран. Это основные функции игрового движка. Процесс создания игры на JME3 заключается в наследовании от SimpleApplication и настройке полученного класса.
Каждая игра на JME3 начинается с метода main(), как и любое стандартное приложение на Java:
Создаем экземпляр вашего класса, наследующего SimpleApplication.
Вызываем метод start() чтобы запустить игровой движок.
    public static void main(String[] args){
        HelloJME3 app = new HelloJME3(); // создание экземпляра класса
        app.start();                     // запуск игры
    }
Строка app.start(); открывает окно приложения. Теперь давайте разберемся как разместить что-то в этом окне (на сцене).

Усваиваем терминологию

Что вы хотите сделать Как это будет в терминах JME3
Хотим создать куб. Создаем геометрию с формой Box и размерами 1x1x1.
Хотим использовать синий цвет. Создаем материал со свойством "Color", установленным в ColorRGBA.Blue.
Хотим покрасить куб в синий цвет. Назначаем материал геометрии Box-а.
Хотим добавить куб на сцену. Прикрепляем геометрию Box-а к rootNode.
Хотим чтобы куб появился в центре экрана. Создаем Box в начале координат = в точке Vector3f.ZERO.
Если некоторые слова вам не понятны, то для этого есть отдельная статья, но она тоже еще не переведена.

Инициализация сцены

Посмотрите на оставшуюся часть кода примера. Метод simpleInitApp() вызывается автоматически в начале игры после запуска приложения. В каждой игре на сонове JME3 должен быть этот метод. Фактически, метод simpleInitApp() отвечает за загрузку игровых объектов перед началом игры.
    public void simpleInitApp() {
       // ваш код инициализации...
    }
Вот так выглядит код инициализации синего куба:
    public void simpleInitApp() {
        Box b = new Box(1, 1, 1); // создаем форму типа Box с размерами 1x1x1
        Geometry geom = new Geometry("Box", b);  // создаем геометрию на основе формы
        Material mat = new Material(assetManager,
          "Common/MatDefs/Misc/Unshaded.j3md");  // создаем простой материал
        mat.setColor("Color", ColorRGBA.Blue);   // задаем синий цвет материалу
        geom.setMaterial(mat);                   // назначаем геометрии куба созданный выше материал
        rootNode.attachChild(geom);              // отображаем геометрию на сцене
    }
Типичная игра на JME3 содержит следующие этапы инициализации:
  • Инициализация игровых объектов:
    • Создание или загрузка объектов и их размещение.
    • Отображение объектов на сцене путем прикрепления их к rootNode.
    • Пример: Загрузка игрока, земли, неба, противников, препятствий, …, и размещение их на стартовых позициях.
  • Инициализация переменных
    • Создание переменных для учета состояния игры.
    • Задание начальных значений для переменных.
    • Пример: Установка счета в 0 и здоровья в 100%, …
  • Инициализация контроллеров мышки и клавиатуры
    • Следующие элементы пользовательского ввода настроены по умолчанию:
      • W,A,S,D – движение по сцене
      • движение мышки и стрелки – поворот камеры
      • Esc – выход из игры
    • Назначение ваших собственных действий, которые выполняются при нажатии клавиш и кликах мышкой. Также рекомендуется переопределить стандартные.
    • Пример: клик - стрелять, пробел - прыгать, …

Заключение

Из этого туториала вы должны были узнать что SimpleApplication предоставляет следующие возможности:
  • Метод simpleInitApp() для создания объектов.
  • Объект rootNode для прикрепления других объектов, что позволяет отобразить их на сцене.
  • Полезные стандартные настройки пользовательского ввода для навигации в пределах сцены.
В разработке игрового приложения вам понадобится:
  • Инициализировать игровую сцену.
  • Управлять игровыми действиями.
  • Реагировать на пользовательский ввод.
В следующих туториалах разбирается как добиться этого и многого другого от jMonkeyEngine 3.
Продолжение в туториале Hello Node, в котором детально рассматривается инициализация игрового мира, также известного как сцена.
Владеющим английским языком может быть интересен первоисточник.