Команды RPG Maker MV/Ждать

Материал из Русская версия РПГ.укр
Окна настройки команды «Ждать» в RPG Maker MV.

Ждатькоманда событий в RPG Maker MV, позволяющая установить задержку перед выполнением следующей команды события.

У этой команды только одна настройка: время задержки. Время устанавливается в кадрах, и один кадр по умолчанию равен 1/60 доле секунды.

Команда работает по-разному в параллельных и непараллельных событиях:

  • При задержке в непараллельных событиях во время ожидания играющие не могут ходить и взаимодействовать с другими событиями (кроме параллельных).
  • Задержки в параллельных событиях влияют только на это событие, не мешают играюшим перемещаться, а другим событиям выполняться.

Параллельные события — это событие (либо событие на карте, либо общее событие) с триггером «Параллельно». Если во время задержки в параллельном событии меняется условие и событие переходит на другую страницу, все команды после задержки не будут выполнены.

Другие команды задержки[править]

Многие другие команды в RPG Maker MV также позволяют задерживать выполнение следующих за ними команд. В частности:

В настройках большинства таких команд есть галочка «Ожидать завершения» или «Ждать завершения». Если она включена, эти команды действуют так же, как команда «Ждать».

Кроме того, ряд команд действуют подобным образом, но блокируют управление партией даже из параллельных событий:

К этой группе команд примыкают команды, переходящие на другую сцену — во время перехода на другую сцену никаких команды из сцены карты не выполняются:

Технические подробности[править]

Внутренний формат[править]

Код команды — 230. Она кодируется таким образом:

   {
     "code": 230,
     "indent": степень_вложенности,
     "parameters": [
       количество_кадров
     ]
   }

Где:

  • вместо степень_вложенности следует поставить число команд, в которые вложена данная команда,
  • вместо количество_кадров следует поставить количество кадров, которые будет длиться ожидание.

Аналоги в JavaScript[править]

Прямого аналога этой команды в JavaScript нет. В JavaScript код, выполняемый этой командой, следует преобразовать: часть кода, выполняемую после ожидания, необходимо вынести в отдельную функцию, и вызвать её либо в функции update сцены после истечения определённого числа обновлений (функция update сцены вызывается один раз за кадр RPG Maker), либо в функции setTimeout (подробнее о ней см. на сайте learn.javascript.ru).

Использование setTimeout[править]

Функции setTimeout можно передать функцию, которая выполнится через заданное число миллисекунд. Первый аргумент — функция, второй — число миллисекунд (1 секунда — 1000 миллисекунд):

setTimeout(function () {
  //здесь код, который выполнится через секунду
}, 1000);

Допустим, нам нужно начать затемнение экрана, затем подождать 10 секунд (600 кадров), и вернуть сделать вернуть оттенок в норму. В событии мы бы сделали это с помощью команды Оттенок экрана, Ждать, и ещё одной команды Оттенок экрана. Но в JavaScript нужно разбить код — часть, которая выполняется после ожидания, будет внутри функции, передаваемой в setTimeout:

$gameScreen.startTint([-68, -68, -68, 0], 60);
setTimeout(function () {
  $gameScreen.startTint([0, 0, 0, 0], 60);
}, 10000);

Функция setTimeout — стандартная функция в JavaScript, она никак не связана с RPG Maker, поэтому время задаётся в миллисекундах, а не в кадрах.

Использование метода update сцены[править]

Программный код на этой странице передан в общественное достояние согласно CC0. Его можно использовать как угодно. Указывать авторство кода не требуется.

Другой способ отсчитывать время — метод update у сцен и многих объектов RPG Maker. Метод update у сцены вызывается один раз за кадр, а кадром считается 1/60 секунды. Таким образом, если мы перепишем метод update у сцены, мы сможем вызывать его 60 раз в секунду.

Вот пример переопределения update сцены Scene_Map (код):

(function () {
  var Scene_Map_update = Scene_Map.prototype.update;
  Scene_Map.prototype.update = function() {
    //здесь код, который будет выполняться 60 раз в секунду
    Scene_Map_update.call(this);
  }
})();

Вот пример плагина, который создаёт команду плагина «dark-10-sec», которая затемняет экран на 10 секунд (600 кадров), ждёт 600 кадров, и осветляет экран до стандартного оттенка:

(function () {
  var timeBeforeRestoringTone = 0;
  var waitingToRestoreTone = false;
  
  var Scene_Map_update = Scene_Map.prototype.update;
  Scene_Map.prototype.update = function() {
    if (waitingToRestoreTone) {
      timeBeforeRestoringTone--;
      if (timeBeforeRestoringTone <= 0) {
        $gameScreen.startTint([0, 0, 0, 0], 60);
        waitingToRestoreTone = false;
      }
    }
    Scene_Map_update.call(this);
  }

  var Game_Interpreter_pluginCommand = Game_Interpreter.prototype.pluginCommand;
  Game_Interpreter.prototype.pluginCommand = function(command, args) {
    if (command == 'dark-10-sec') {
      $gameScreen.startTint([-68, -68, -68, 0], 60);
      timeBeforeRestoringTone = 600;
      waitingToRestoreTone = true;
    }
    else {
      Game_Interpreter_pluginCommand.call(this, command, args);
    }
  }
})();

Здесь мы заводим такие переменные:

  • timeBeforeRestoringTone хранит число кадров (1 кадр = 1/60 секунда) перед тем, как оттенок экрана будет установлен;
  • waitingToRestoreTone истинна (true), если идёт отсчёт секунд перед возвращением оттенка; и ложна (false), если отсчёт секунд не идёт.

При использовании команды «dark-10-sec» происходит начало затемнения экрана и начинается отсчёт в 600 кадров.

Когда идёт отсчёт кадров (когда timeBeforeRestoringTone истинна), в фунции update сцены карты происходит уменьшение счётчика. Когда счётчик равен нулю — происходит восстановление оттенка экрана и отключение отсчёта времени.