Докуметация Cтарт Статьи Форум Лента Вход
Не официальное русскоязычное сообщество
Главная
    Документация jMonkeyEngine
        jMonkeyEngine Уроки и Документация
            Документация для продвинутых пользователей
                Nifty GUI 1.3 - Использование сценариев

Nifty GUI 1.3 — Использование сценариев

Опубликованно: 22.08.2017, 18:47
Последняя редакция, Andry: 25.08.2017 15:41

Этот документ содержит типичные случаи использования сценариев NiftyGUI, такие как добавление эффектов, состояние игр и создание типичных игровых экранов.

Требования: Эти советы предполагают, что вы прочитали и поняли «Создание пользовательских интерфейсов JME3 с помощью Nifty GUI» и уже скомпоновали свой базовый GUI, который взаимодействует с вашим JME3 приложением. Здесь вы узнаете, как лучше интегрировать GUI и добавлять продвинутые эффекты элементы управления.

Переключить игровые состояния

В JME игре у вас обычно есть три состояния игры:

  1. Остановлена: игра остановлена, отображается StartScreen.
  2. Запуск: игра запущена, отображается игровой HudScreen.
  3. Приостановлена: игра приостановлена, отображается PausedScreen.

(Кроме того, состояние Stopped часто содержит LoadScreen, LogonScreen, OptionsScreen, CharacterCreationScreen, HighScoreScreen, CreditsScreen и.т.д. В некоторых играх вы также можете получить доступ к OptionsScreen в состоянии Приостановлена. Состояние Запуск также может содержать InventoryScreen, ItemShopScreen, StatsScreen, SkillScreen и.т.д.)

В состояния JME игры реализованы как пользовательские объекты AppState. Пишите каждый AppState, так чтобы он приводил свои собственные сопоставления ввода, содержимое rootNode, поведение цикла обновления и.т.д.

  1. Остановлена: StartScreen AppState + GuiInputs AppState
  2. Приостановлена: PausedScreen AppState + GuiInputs AppState
  3. Запуск: HudScreen AppState + InGameInputs AppState + BulletAppState (jme физика), …

Когда игрок переключается между игровыми состояниями, вы отсоединяете один набор AppStates и присоединяете другой. Например, когда игрок останавливает текущую игру, вы используете boolean переключатель для приостановки игрового цикла и деактивации игровых вводов (стрельба, навигация). Экран PausedScreen накладывает видимый указатель мыши и кнопку «Продолжить». Когда игрок нажимает «Продолжить», указатель мыши деактивируется, активируются сопоставления ввода и навигации в игре, и игровой цикл продолжается.

Получить доступ к Application и циклу обновлений

Поскольку вы пишете jME3 приложение, вы можете дополнительно сделать любой класс ScreenController расширением класса AbstractAppState. Это дает ScreenController доступ к объекту Application и циклу обновления!

public class StartScreenState extends AbstractAppState {

  private ViewPort viewPort;
  private Node rootNode;
  private Node guiNode;
  private AssetManager assetManager;
  private Node localRootNode = new Node("Start Screen RootNode");
  private Node localGuiNode = new Node("Start Screen GuiNode");
  private final ColorRGBA backgroundColor = ColorRGBA.Gray;

public StartScreenState(SimpleApplication app){
    this.rootNode     = app.getRootNode();
    this.viewPort     = app.getViewPort();
    this.guiNode      = app.getGuiNode();
    this.assetManager = app.getAssetManager();
  }

  @Override
  public void initialize(AppStateManager stateManager, Application app) {
    super.initialize(stateManager, app);

    rootNode.attachChild(localRootNode);
    guiNode.attachChild(localGuiNode);
    viewPort.setBackgroundColor(backgroundColor);

    /** инициализируем сцену */
  }

  @Override
  public void update(float tpf) {
    /** любое основное действие цикла происходит здесь */
  }

  @Override
  public void cleanup() {
    rootNode.detachChild(localRootNode);
    guiNode.detachChild(localGuiNode);

    super.cleanup();
  }

}
Недостаточно просто наследовать от AbstractAppState. Вам необходимо создать экземпляр класса контроллера, зарегистрировать его в stateManager app, а затем передать его в nifty. См. Пример кода ниже.
public class TestNiftyGui extends SimpleApplication {
  public void simpleInitApp() {
     StartScreenState startScreenState = new StartScreenState(this);
     stateManager.attach(startScreenState);
     // [...] пропущенные шаблоны инициализации nifty
     nifty.fromXml("Interface/myGui.xml", "start", startScreenState); //один из элементов экрана из XML должен ссылаться на 
 //класс контроллера StartScreenState
  }
}

Знай свои переменные

Переменная  Описание
${CALL.myMethod()}  Вызывает метод в текущем ScreenController и получает возвращаемую String форму метода. Метод также может быть void и иметь побочный эффект, например проигрывать звук и.т.д.
${ENV.HOME}  Возвращает путь к домашнему каталогу пользователя.
${ENV.key}  Выбирает key в переменных среды. Используйте его как Java System.getEnv(“key).
${PROP.key}  Ищет key в свойствах Nifty. Используйте Nifty.setGlobalproperties(properties) и Nifty.getGlobalproperties(“key). Или SystemGetProperties(key);

Смотрите так же: https://github.com/nifty-gui/nifty-gui/wiki

Использование ScreenControllers для взаимно эксклюзивных функций

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

Например, создайте MyHudScreen.java для экрана hud и MyStartScreen.java для start экрана.

  • Включите все методы пользовательского интерфейса, которые необходимы во время игры (когда HUD включен) в MyHudScreen.java. Затем сделайте этот класс управляющим всеми экранами, которые могут быть во время игры (экран HUD, экран MiniMap, экран инвентаря, экран Способности или навыки и.т.д.). Все эти экраны, возможно, обмениваются данными (игровыми данными, данными игрока), поэтому имеет смысл управлять всеми их методами из одного и того же класса MyHudScreen.java.
  • start экран, в основном не зависит от текущей игры. Включите все методы пользовательского интерфейса, которые необходимы вне игры (пока вы находитесь на стартовом экране) в MyStartScreen.java. Затем сделайте этот класс управляющим всеми экранами, которые могут быть вне игры (экран «Пуск», экран «Настройки/Параметры», экран HighScore и.т.д.). Все эти классы должны считывать и записывать сохраненные данные игры, поэтому имеет смысл управлять всеми их методами из одного и того же класса MyStartScreen.java.

Создание экрана «Загрузка …»

Прочитать урок Экран Загрузки здесь.

Создание всплывающего меню

Прочитать урок Nifty GUI Всплывающее меню здесь.

Добавим визуальные эффекты

Вы можете зарегистрировать эффекты для элементов экрана.

  • Реакция на события элемента, такие как onStartScreen, onEndScreen, onHover, onFocus, onActive,
  • Триггеры эффектов, которые изменяют движение, смешивание цветов, размер, цвет, затухание и многое другое.

Вот пример, который перемещает панель при открытии startScreen. Вы помещаете тег <effect> внутри элемента, который должен быть затронут.

<panel height="25%" width="35%" ...>
  <effect>
    <onStartScreen name="move" mode="in" direction="top" length="300" startDelay="0" inherit="true"/>
  </effect>
</panel>

Подробнее читайте на странице по NiftyGUI:

Добавить звуковые эффекты

Воспроизведение звуков с использованием Nifty также возможно с эффектом playSound в качестве триггера. Не забудьте сначала зарегистрировать звук, который вы хотите воспроизвести:

<registerSound id="myclick" filename="Interface/sounds/ButtonClick.ogg" />
...
<label>
  <effect>
    <onClick name="playSound" sound="myclick"/>
  </effect>
</label>

Передать ClickLoc от Nifty к Java

После щелчка мышью вы можете записать 2D clickLoc и отправить эту информацию в свое Java-приложение. Однако обычные методы ScreenController имеют только аргумент String. Вам нужно будет преобразовать String в int.

Чтобы передать clickLoc как два int, вы можете использовать специальный (int x, int y) синтаксис в ScreenController:

  public void clicked(int x, int y) {
    // Здесь вы можете использовать x и y для clickLoc
  }

В коде (например, XML-файл) Nifty GUI экрана вы должны вызывать (int x, int y) метод без каких-либо параметров!

<interact onClick="clicked()"/>

Вы можете назвать метод (здесь clicked), как вам нравится, до тех пор, пока вы сохраняете синтаксис аргумента.

Загрузка нескольких XML файлов

В базовом примере Nifty GUI показано, как использовать метод nifty.fromXML() для загрузки одного XML файла, содержащего все экраны Nifty GUI. В следующем примере кода показано, как вы можете загрузить несколько XML-файлов в один nifty объект. Возможность загрузки нескольких файлов с помощью nifty.addXml() позволяет разделить каждый экран на один отдельный XML-файл, вместо одного большого трудно читаемого XML-файл для всех экранов.

NiftyJmeDisplay niftyDisplay = new NiftyJmeDisplay(assetManager, inputManager, audioRenderer, viewPort);
Nifty nifty = niftyDisplay.getNifty();
nifty.addXml("Interface/Screens/OptionsScreen.xml");
nifty.addXml("Interface/Screens/StartScreen.xml");
nifty.gotoScreen("startScreen");
StartScreenControl screenControl = (StartScreenControl) nifty.getScreen("startScreen").getScreenController();
OptionsScreenControl optionsControl = (OptionsScreenControl) nifty.getScreen("optionsScreen").getScreenController();
stateManager.attach(screenControl);
stateManager.attach(optionsControl);
guiViewPort.addProcessor(niftyDisplay);

Зарегистрировать дополнительные явные контроллеры экрана

В дополнение к методам nifty.addXml() для соединения множества nifty XML-файлов существует метод nifty.registerScreenController() для явного подключения дополнительных контроллеров экрана.

Следующий пример кода показывает, как вы можете явно подключить несколько контроллеров экрана, прежде чем добавлять XML-файл в nifty, что в противном случае могло бы nifty привести к неявному экземпляру класса контроллера экрана.

NiftyJmeDisplay niftyDisplay = NiftyJmeDisplay.newNiftyJmeDisplay(assetManager, inputManager, audioRenderer, viewPort);
Nifty nifty = niftyDisplay.getNifty();

nifty.registerScreenController(new OptionsScreenController(randomConstructorArgument));
nifty.addXml("Interface/Screens/OptionsScreen.xml");

Создайте свои собственные стили

По умолчанию ваш экран Nifty XML использует стиль built.in:

 <useStyles filename="nifty-default-styles.xml" />

Но вы можете переключиться на набор пользовательских стилей в папке asset вашего игрового проекта, например:

 <useStyles filename="Interface/Styles/myCustomStyles.xml" />

Внутри myCustomStyles.xml вы определяете такие стили как эти:

<?xml version="1.0" encoding="UTF-8"?>
<nifty-styles>
  <useStyles filename="Interface/Styles/Font/myCustomFontStyle.xml" />
  <useStyles filename="Interface/Styles/Button/myCustomButtonStyle.xml" />
  <useStyles filename="Interface/Styles/Label/myCustomLabelStyle.xml" />
  ...
</nifty-styles>

Подробнее о том, как создавать стили, смотрите в исходный код Nifty GUI для «nifty-style-black». Скопируйте его как шаблон и измените его, чтобы создать свой собственный стиль.

Подробнее читайте на странице по NiftyGUI:


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

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

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