Докуметация Cтарт Статьи Форум Лента Вход
Не официальное русскоязычное сообщество
Главная
    Документация jMonkeyEngine
        jMonkeyEngine Уроки и Документация
            jMonkeyEngine3: Привет мир, Обучающая Серия
                jMonkeyEngine 3 Урок (4) — Привет циклическое обновление (Hello Update Loop)

jMonkeyEngine 3 Урок (4) — Привет циклическое обновление (Hello Update Loop)

Опубликованно: 12.02.2016, 11:47
Последняя редакция, Andry: 21.06.2017 21:34

Предыдущий: Hello Assets, Следующий: Hello Input System.

Теперь, когда вы знаете, как загрузить игровые ресурсы, такие как 3D-модели, думаю вам бы хотелось реализовать некоторую игровою механику, которая использует эти игровые ресурсы. В этом уроке мы рассмотрим циклическое обновление. Циклическое обновление вашей игры — это происходящие действия.

Пример кода

package jme3test.helloworld;
import com.jme3.app.SimpleApplication;
import com.jme3.material.Material;
import com.jme3.math.ColorRGBA;
import com.jme3.scene.Geometry;
import com.jme3.scene.shape.Box;
 
/** Образец 4 - как вызвать повторение действия из основного цикла событий.
 * В этом примере вы используете цикл, чтобы персонажа игрока 
 * непрерывное вращался. */
public class HelloLoop extends SimpleApplication {
 
    public static void main(String[] args){
        HelloLoop app = new HelloLoop();
        app.start();
    }
 
 protected Geometry player;
 
    @Override
    public void simpleInitApp() {
        /** этот синий куб — наш персонаж игрока */
        Box b = new Box(1, 1, 1);
        player = new Geometry("blue cube", b);
        Material mat = new Material(assetManager,
        "Common/MatDefs/Misc/Unshaded.j3md");
        mat.setColor("Color", ColorRGBA.Blue);
        player.setMaterial(mat);
        rootNode.attachChild(player);
    }
 
    /* Используйте основной цикл событий, чтобы вызвать повторяющиеся действие.*/
    @Override
    public void simpleUpdate(float tpf) {
        // зададим вращение игрока:
        player.rotate(0, 2*tpf, 0); 
    }
}

Соберите и запустите код: вы увидите постоянно вращающийся куб.


Понимание кода

По сравнению с нашими предыдущими примерами кода, обратите внимание, что Геометрия игрока теперь — это поле класса. Это связано с тем, что мы хотим, чтобы цикл обновления мог получить доступ к преобразованию этой Геометрии. Как обычно, мы инициализируем объект игрока в методе simpleInitApp().

Теперь рассмотрим метод simpleUpdate() — это цикл обновления.

  • Строка Player.rotate (0, 2 * TPF, 0); которая определяет изменения связанные с вращением игрового объекта.
  • Мы используем переменную времени tpf («время на кадр»), время этого действия зависит от текущего количества кадров на секунду. Это просто означает, что куб вращается с той же скоростью на быстрых и медленных машинах, и игра остается, так сказать, на ходу.
  • После запуска игры, код rotate() выполняется снова и снова.

Использование циклического обновления

Вращающийся объект — это лишь простой пример. В цикле обновления, как правило, бывает множество разных тестов с запуском различных игровых действий. Здесь вы обновляете очки здоровья и другие игровые очков, проверяете наличие столкновений, заставляете врагов рассчитать их следующий ход, бросаете кости, срабатывает ловушка, играют случайные звуки окружающей среды и многое другое.

  • Метод simpleUpdate() запускается после того как метод simpleInitApp() инициализации граф сцены и переменные состояния.
  • JME3 выполняет все, что в методе simpleUpdate() неоднократно, и как можно быстрее.
    1. Используйте цикл для опроса состояния игры, а затем инициируйте действия.
    2. Используйте цикл, чтобы вызвать реакцию на событие и обновить состояние игры.
    3. Используйте цикл мудро, потому что слишком много вызовов в цикле также замедляет игру.

Инициализация — Обновление — Визуализация

Обратите внимание на три фазы в каждой игре:

  • Инициализация(Init): Метод simpleInitApp() выполняется только один раз, в самом начале;
  • Обновление(Update): Метод simpleUpdate() запускается постоянно, во время игры.
  • Визуализация(Render): После каждого обновления, jMonkeyEngine автоматически перерисовывает (визуализирует) экран для вас.

Поскольку рендеринг (визуализация) является автоматическим, инициализация и обновление являются двумя наиболее важными понятиями для вас в SimpleApplication — основе игры:

  • Метод simpleInitApp() является «первым дыханием» приложения. Здесь вы загружаете и создаете игровые данные (один раз).
  • Метод simpleUpdate() является «сердцебиением» (единица времени называется тактами(ticks)). Здесь вы изменяете свойства для обновления состояния игры (повторно).
Все в игре происходит либо во время инициализации, либо во время цикла обновления. Это означает, что эти два метода разрастаются очень долго и в течение долгого времени. Следуйте этим двум стратегиям разрастания кода через инициализацию и обновление в течение нескольких модульных классов Java:

  • Перемещайте блоки кода из метода simpleInitApp() в AppStates.
  • Перемещайте блоки кода из метода simpleUpdate() в Custom Controls (пользовательское управление).

Имейте это в виду, когда ваше приложение разрастется.


Упражнения

Вот некоторые забавные вещи для тренировки:

  1. Что произойдет, если вы дадите значению метода rotate() отрицательное значение?
  2. Сможете ли вы создать две геометрии рядом друг с другом, и сделать так, чтобы одна вращалась вдвое быстрее, чем другая? (Используйте переменную tpf)
  3. Сможете ли вы сделать куб пульсирующим? (Увеличивается и уменьшается)
  4. Сможете ли вы сделать куб, который изменяет цвет? (Изменить и установить Материал)
  5. Сможете ли вы сделать качение куба? (Вращаться вокруг оси х, а перемещения вдоль оси z)

Обратитесь к уроку Hello Node, если вы не помните методы преобразования для масштабирования, перемещения и вращения.

Ссылка на решения предлагаемые пользователями: Некоторые предлагаемые решения
Но, сначала, попытайтесь решить все сами!

Вывод

Теперь вы узнали о цикле обновления, «сердцебиении» игры, и вы можете добавить всевозможные виды действий к нему.

Следующее, что необходимо игроку — это какое-то взаимодействие! Продолжите обучение, как реагировать на ввод пользователя.


Смотрите также:

  • Опытные разработчики jME3 используют Application States и Пользовательские элементы Control для реализации игровой механики в своих циклах обновления. Вы снова столкнетесь с этими темами позже, когда перейдете к более продвинутой документации.

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

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

Содержание

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