Trainz Railroad Simulator 2004. Руководство по созданию пользовательских ресурсов

Угольный хоппер
[Учебник 1 - Уголь, энергия и правила]

Введение

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


Очередь загрузки

Если вагон может перевозить грузы, он должен иметь по крайней мере одну очередь. Вот раздел файла config.txt угольного хоппера, описывающеий его входную очередь:

queues
{
  load0
  {
    size 54300
    initial-count 0
    animated-mesh load
    product-kuid <KUID:44179:60013>
    allowed-categories
    {
      0 <KUID:-3:10040>
    }
  }
}

Очередь load0 имеет максимальную емкость 54300, а КИД груза product-kuid установлен в КИД угля, стандартный груз для хоппера - уголь. Однако по умолчанию вагон пуст, поскольку начальная загрузка initial-count равна 0. Указав разрешенные категории allowed-categories, мы определяем, что очередь может содержать множество различных грузов. Использован КИД категории "Насыпные грузы", поэтому вагон кроме угля сможет перевозить любой груз, входящий в эту категорию, включая опилки.

Чтобы показать анимированный процесс загрузки хоппера, load нашей очереди определен как анимированная сетка animated-mesh. Теперь Trainz сможет автоматически подогнать сетку в зависимости от заполненности очереди. Так создаетя иллюзия повышения и понижения груза угля.


Сценарий для угольного хоппера

Сценарий для угольного хоппера относительно прост, поскольку все, что он делает - проигрывает звуки и включает/выключает атмосферные эффекты. Вагонам часто вообще не требуются сценарии - например, лесовозу. Полный исходный текст сценария для угольного хоппера определен следующим образом:

include "vehicle.gs"


//
// Класс сценария для хоппера.  Потоков нет - только перекрытые обратные вызовы Vehicle,
// которые вызывает Industry.
//
class Hopper isclass Vehicle
{
  // Проиграть звук в начале загрузки хоппера".
  float BeginLoad(LoadingReport report)
  {
    Asset meAsset = GetAsset();
    World.PlaySound(meAsset, "coal_load1.wav", 1000.0f, 20.0f, 1000.0f, me, "");
    return 0.0;
  }

  // Запустить эффекты и проиграть звук в начале разгрузки хоппера.
  float BeginUnload(LoadingReport report)
  {
    SetMeshAnimationState("left-door", true);
    SendMessage(me, "pfx", "+0+1");

    SetMeshAnimationState("right-door", true);
    SendMessage(me, "pfx", "+2+3");

    Asset meAsset = GetAsset();
    World.PlaySound(meAsset, "coal_dump1.wav", 1000.0f, 20.0f, 1000.0f, me, "");

    return 1.0;
  }

  // Отключить эффекты и проиграть звук в конце разгрузки хоппера.
  float EndUnload(LoadingReport report)
  {
    Sleep(1.0);

    SetMeshAnimationState("left-door", false);
    SendMessage(me, "pfx", "-0-1");

    SetMeshAnimationState("right-door", false);
    SendMessage(me, "pfx", "-2-3");

    return 1.0;
  }
};

Поскольку хоппер относится к вагонам, класс Hopper наследует от класса Vehicle. Обратите внимание, что в этом классе нет потоков. Единственные методы - BeginLoad(), BeginUnload() and EndUnload(), являются перекрытыми методами обратного вызова из Vehicle.

BeginLoad() вызывается методом Vehicle::LoadProduct() до начала загрузки вагона. Это можно проверить в реализации метода LoadProduct() в файле vehicle.gs. В этом классе проигрывается звуковой файл. Поскольку PlaySound() возвращает управление сразу же, а не после проигрывания звука, метод BeginLoad() закончится сразу после вызова PlaySound().

BeginUnload() и EndUnload() вызываются методом UnloadProduct() соответственно в начале и в конце операции разгрузки. BeginUnload() проигрывает анимацию нижних дверей хоппера с обоих сторон вагона и включает атмосферные эффекты. Несколькими секундами позже вызывается EndUnload(). Этот метод практически идентичен BeginUnload(), только он останавливает анимацию дверей и отключает эффекты. Оба этих метода возвращают 1.0, чтобы Vehicle::UnloadProduct() знал, как долго продлятся эти действия (в нашем примере - 1.0 секунда в обоих методе).

Цепочка событий выглядит примерно так:

Поскольку предприятие не взаимодействует напрямую с конкретными вагонами, может показаться, что весь процесс несколько запутан. Однако это оправдывается его гибкостью. Сценарии не зависят друг от друга, а предприятие не должно знать, как работать с различными конкретными типами вагонов, Пока сценарий и его ресурс делают то, что требует Trainz, все должно работать правильно.


Trainz Railroad Simulator 2004. Руководство по созданию пользовательских ресурсов
Copyright (C) 2002-2003 Auran Developments Pty Ltd. All Rights Reserved.
Hosted by uCoz