Следующий туториал: jMonkeyEngine 3 Tutorial (2) - Hello Node
Перед вами предварительная версия перевода одного из туториалов по jMonkeyEngine "для самых маленьких". Английский вариант взят с официального сайта jMonkeyEngine. В перспективе планируется перевод остальных туториалов и создание проекта, посвященного этому замечательному движку.
Требования: предполагается что вы уже установили jMonkeyEngine SDK и имеете базовые знания о Java.
Данный и последующие туториалы написаны в реалиях jMonkeyEngine SDK, но более опытным разработчикам не составит труда использовать для работы с jMonkeyEngine любую IDE или даже командную строку и блокнот.
В переводе намеренно сохранены многие английские названия и термины, автор перевода не несет ответственности за использование русскоязычных версий средств разработки.
Создание проекта
В jMonkeyEngine SDK:
- Выберите File>New Project… в главном меню.
- В открывшемся мастере создания проекта выберите шаблон(template) JME3>Basic Game. Нажмите "Next".
- укажите имя проекта, например, "HelloWorldTutorial".
- укажите путь к папке, в которой вы хотите сохранить файлы проекта, например папку jMonkeyProjects в домашней директории.
- Нажмите "Finish".
Если у вас возникли вопросы, существует отдельная статья, посвященная созданию проекта, но она еще не переведена.
Для лучшего усвоения материала рекомендуется самостоятельно выполнить все этапы туториалов, но если вам по каким-то причинам понадобятся примеры - всегда можно создать проект на основе шаблона JmeTests в jMonkeyEngine SDK.
Расширяем SimpleApplication (альтернативный перевод - наследуем).
Для этого туториала вам понадобится создать в вашем проекте файл 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 чтобы закрыть приложение.
Если у вас все получилось - поздравляю! Теперь давайте посмотрим поближе.
Разбираем код
Приведенный выше код инициализирует сцену и запускает приложение.
Запускаем SimpleApplication
Посмотрите на первую строку описания класса (игнорируем 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() чтобы запустить игровой движок.
Вызываем метод 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, в котором детально рассматривается инициализация игрового мира, также известного как сцена.
Владеющим английским языком может быть интересен первоисточник.