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

Комбинация движений

Опубликованно: 14.05.2017, 0:07
Последняя редакция, Andry: 14.05.2017 13:57

Класс ComboMoves позволяет определять комбинации вводов, которые вызывают специальные действия. Правильный ввод комбо может принести игроку дополнительные награды, такие как повышенная вероятность попадания, повышенная эффективность или ослабление блока, независимо от выбора игрового дизайнера. Дополнительная справочная информация

Комбо обычно представляют собой последовательность вводов в фиксированном порядке: например, комбинация клавиш может выглядеть так: «нажмите вниз, затем вниз + вправо вместе, затем вправо».

Применение:

  1. Создадим триггеров ввода
  2. Определим комбо
  3. Обнаружим комбо в ActionListener
  4. Выполним комбо в цикле обновления

Скопируйте два класса ComboMoveExecution.java и ComboMove.java в свое приложение и скорректируйте их в своих путях пакетов.

Пример кода

Создание триггеров ввода

Сначала вы задаете свой ввод как обычно: Внедряете интерфейс com.jme3.input.controls.ActionListener для вашего класса и добавьте сопоставления триггеров, такие как com.jme3.input.controls.KeyTrigger и com.jme3.input.KeyInput ,

Например:

inputManager.addMapping("Left",    new KeyTrigger(KeyInput.KEY_LEFT));
inputManager.addMapping("Right",   new KeyTrigger(KeyInput.KEY_RIGHT));
inputManager.addMapping("Up",      new KeyTrigger(KeyInput.KEY_UP));
inputManager.addMapping("Down",    new KeyTrigger(KeyInput.KEY_DOWN));
inputManager.addMapping("Attack1", new KeyTrigger(KeyInput.KEY_SPACE));
...
inputManager.addListener(this, "Left", "Right", "Up", "Down", "Attack1");

Определить Combos

Для каждого из ваших комбо-действий вы указываете серию вводов, которые будут запускать его. Порядок, в котором вы их определяете, — это порядок, в котором игрок должен совершать нажатия для записи шага. Когда все шаги записаны, комбо срабатывает.

Следующий пример показывает, как происходит комбо-действие файрбола, нажимая клавиши навигации «вниз, вниз + вправо», «вправо» в этом порядке.

ComboMove fireball = new ComboMove("Fireball");
fireball.press("Down").notPress("Right").done();
fireball.press("Right", "Down").done();
fireball.press("Right").notPress("Down").done();
fireball.notPress("Right", "Down").done();
fireball.setUseFinalState(false);

Также создайте объект ComboMoveExecution для каждого ComboMove. Он понадобится вам позже, чтобы выполнить обнаруженную комбинацию.

ComboMoveExecution fireballExec = new ComboMoveExecution(fireball);

Методы класса ComboMove

Используйте следующие методы ComboMove для указания комбо:

Методы ComboMove  Описание
press(“A).done(); +press(“A,“B).done();  Записывается шаг ввода комбинации, если вводится A. + Записывается шаг ввода комбинации, если A и B введены одновременно.
notPress(“A).done(); +notPress(“A,“B).done();  Записывается шаг ввода комбинации, если A отпущен. + Записывается шаг ввода комбинации, если A и B одновременно отпущены.
press(“A).notPress(“B).done();  Записывается шаг ввода комбинации, если вводится A, а не B
press(“A).notPress(“B).timeElapsed(0.11f).done(); 
Записывается шаг ввода комбинации через определенное время после ввода A, а не B. + и.т.д., и.т.д.
setPriority(0.5f);  Если есть неоднозначность, комбинация с высоким приоритетом будет запускаться вместо низкоприоритетного комбо. Это предотвращает, что подобный шаг комбо-команды «захватывает другой Combo. Используйте только один раз для ComboMove.
setUseFinalState(false); +setUseFinalState(true);  Это окончательная команда серии. + False: не ждать в конечном состоянии, последовательности шагов комбо. (?) + True: это конечное состояние, не следует комбинировать шаги комбо. (?)

Методы press() и notPress() принимают множество введенных триггеров, например. fireball.press(“A,“B,“C).done().

Следующие геттеры дают вам более подробную информацию о состоянии игры:

Методы ComboMove  Применение
getCastTime()  Возвращает время, прошедшее с момента записи последнего шага. (?)
getMoveName()  Возвращает строку текущего комбо
getPriority()  Возвращает приоритет этого движения

Обнаруживать комбинации в ActionListener

Теперь, когда вы указали шаги комбо, вы хотите их обнаружить. Вы делаете это в методе onAction(), который вы получаете из интерфейса ActionListener.

Создайте HashSet pressMappings для отслеживания текущих нажатых сопоставлений и объект ComboMove currentMove для отслеживания текущего движения.

Мы также отслеживаем длительность выполнения комбо, чтобы определить, не истекло ли время ожидания (см. Цикл обновления ниже).

private HashSet<String> pressedMappings = new HashSet<String>();
private ComboMove currentMove = null;
private float currentMoveCastTime = 0;
private float time = 0;
...

public void onAction(String name, boolean isPressed, float tpf) {
    // Запись нажатых сопоставлений
    if (isPressed){
        pressedMappings.add(name);
    }else{
        pressedMappings.remove(name);
    }

    // Нажатые сопоставления изменились: обновить объекты ComboExecution
    List<ComboMove> invokedMoves = new ArrayList<ComboMove>();
    if (fireballExec.updateState(pressedMappings, time)){
        invokedMoves.add(fireball);
    }
    // ... добавить ComboExecs здесь ...

    // Если какие-либо ComboMoves были успешно запущены:
    if (invokedMoves.size() > 0){
        // Определить движение с наивысшим приоритетом
        float priority = 0;
        ComboMove toExec = null;
        for (ComboMove move : invokedMoves){
            if (move.getPriority() > priority){
                priority = move.getPriority();
                toExec = move;
            }
        }
        if (currentMove != null && currentMove.getPriority() > toExec.getPriority()){
            return; // skip lower-priority moves
        }

        // Если ComboMove был идентифицирован, сохраните его в currentMove
        currentMove = toExec;
        currentMoveCastTime = currentMove.getCastTime();
    }
}

Выполнить комбинации в цикле обновления

Теперь, когда вы обнаружили текущие движение, вы хотите его выполнить. Вы делаете это в цикле обновления.

@Override
public void simpleUpdate(float tpf){
    time += tpf;
    fireballExec.updateExpiration(time);
    // ... обновите ComboExecs здесь....

    if (currentMove != null){
        currentMoveCastTime -= tpf;
        if (currentMoveCastTime <= 0){
            System.out.println("THIS COMBO WAS TRIGGERED: " + currentMove.getMoveName());
            // ЗДЕЛАЙТЕ: для каждого комбо, выполните специальные действия здесь
            currentMoveCastTime = 0;
            currentMove = null;
        }
    }
}

Тест currentMove.getMoveName() и вызовите методы, которые реализуют любые специальные действия и бонусы. Это зависит от вас и зависит индивидуально от вашей игры.

Почему Комбо?

В зависимости от жанра игры, дизайнер может вознаградить внутренние или внешние навыки игроков:

  • (Внутренние :) РПГ обычно вычисляют успех атаки из уровня тренировки персонажа в игре: Игрок играет роль персонажа, уровень навыка которого определен в цифрах. РПГ обычно не предлагают никаких Комбо.
  • (Внешние :) Спортивные игры и драки. В них обычно предпочитают вознаграждать «навыки рук игрока»: успех специального хода зависит исключительно от собственной ловкости игрока. В этих играх обычно предлагаются дополнительные комбинации.

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

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

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