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

Сценарии
[Теория]

Введение в сценарии

Разработанная для TRS2004 новая игровая модель, основанная на сессиях, требует и нового подхода к кодированию сценариев. Хотя этот новый подход написания независимых фрагментов может сначала показаться сильно отличающимся от программы с единственным входом, трудным для изучения и освоения, гибкость, которую предоставляют сценарии, делает стоящим переход на модель сессий. Из-за различий в подходах, существует необходимость дать в этом разделе людям, умеющим программировать, теоретические знания, требующиеся для понимания сценариев.

Требующиеся знания
Этот раздел и другие части справочника, относящиеся к сценариям, предполагают знание программирования. Для тех, кто желает писать свои собственные сценарии, как минимум, требуется понимание языков программирования третьего поколения - логических конструкций, простых типов данных (целое, вещественное и т.д.), строк, булевой логики, переменных, области видимости, операторов, циклов, функций (аргументы и возвращаемые значения) и структур данных.

Компилятор Auran Game Script (GS) использует синтаксис, очень похожий на синтаксис Cи/Cи++ и Явы, так что знание одного из этих языков очень поможет для начала. Те, кто не знаком с Cи/Cи++, но знают другой язык программирования. например, Паскаль, Модулу-2 или Перл, не должны расстраиваться, поскольку это языки с похожими концепциями и перейти от них к GS не должно быть очень трудно.

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


Что такое сценарий?

Сценарий - это независимый сегмент кода, используемый для управления поведением объекта Trainz asset. Сценарии можно представлять себе как дирижеров, указывающих объекту, например, предприятию или локомотиву, как действовать в среде Trainz.

Сценарии прикреплены к отдельным ресурсам, а не выполнены в виде большого куска кода, выполняемого последовательно. Таким образом ресурсы со сценариями могут быть использованы в других сессиях. Повторно используя уже готовые ресурсы, непрограммист может создавать свои собственные сессии. Если бы код хранился в виде одной последовательной программы, он был бы намного менее портируемым.

Определение сценария
Код сценария определяется в исходном файле .gs, который должен быть расположен в том же каталое, что и ресурс, с которым связан данный сценарий. Тогда Trainz будет знать, где найти исходный текст сценария. В файле config.txt ресурса должны быть установлены два параметра. Например:

script "<имя файла>"
class "<имя класса>"

Параметр script определяет имя исходного файла .gs для ресурса (без расширения .gs), а class - это имя главного класса сценария. Этот класс должен быть унаследован от GameObject, а его код должен находиться в указанном исходном файле. В дополнение к главному классу сценария в исходном файле могту быть определены и другие классы.

Например, в сценарии для завода может быть использован класс, наследующий от класса Industry. Вообще говоря, сценарий может быть написан для любого ресурса, для которого определен GameObject.

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

Как работает сценарий правила, какие данные конфигурации он содержит, как они устанавливаются в Топографе - все это зависит от того, как написан сам сценарий.

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

Для компиляции файла .gs вручную с целью проверки его на ошибки, убедитесь, что каталог \Trainz\bin находится в текущем пути и введите gsc -c <имя-файла> в командной строке, находясь в каталоге ресурса (то есть там, где расположен исходный текст сценария). Программа gsc.exe откомпилирует файл .gs в файл байт-кода .gsl. Если в файле .gs будут обнаружены ошибки, компилятор напечает их вместе с соответствующими номерами строк.

Примечание:
Сообщения компилятора об ошибках могут быть неясными и сбивающими с толку, но это обычно для разработки программ и большинства компиляторов. Здесь вам поможет опыт.
Помните, что даже если сценарий нормально откомпилируется, это еще не означает, что он будет без проблем работать - в нем возможны ошибки, даже если компилятор не нашел нарушений синтаксиса. Анализ файла протокола (\Trainz\JetLog.txt) и точное размещение операторов вывода вроде Interface::Print() будет удачным началом отладки неправильно работающего сценария.

Примечание:
НЕ пытайтесь откомпилировать или менять текст файлов .gs, расположенных в каталоге \Trainz\scripts или файлов .gsl в \Trainz\libraries.

Модель мира для сценариев

Программирование сценариев для объектов, используемых в игровой сессии, требует изменения подхода по сравнению со старой моделью.

Самое большое отличие заключается в самой модели исполнения сценария. У него нет одной определенной точки входа, подобной главной функции старых сценариев, которые требовали, чтобы программист определил класс Scenario с функцией main(), являющейся единственной точкой входа, очень похожей на функцию main() в C/C++. Это может вызвать недоумение: откуда же начинать написание кода.

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

Приечание:
Может одновременно существовать несколько экземпляров класса сценария. Поэтому очень важно понимать разницу между классом и объектом, являющимся экземпляром класса.
При запуске сессии Trainz вызывает функцию Init() для всех объектов сценария, у которых она есть. В ней программист может выполнить всю необходимую инициализацию, а также запустить поток для управления ресурсом и при необходимости придать объекту сценария форму "постоянного существования" if needed.

Использование потока для запуска объекта требуется не всегда. Это обычно требуется для предприятия, но для единицы ПС это не очень разумно, поскольку если для каждой единицы данного типа, поставленной на маршруте, будет создан отдельный поток, общий счет потоков может пойти на десятки и даже сотни. Поскольку скриптовые языки вроде GS интерпретируются, нагрузка может оказаться слишком большой. Поскольку для многих ресурсов имеются функции обратного вызова, потоки сценария можно удерживать в разумных пределах.


Вверху: Упрощенное представление игровых объектов, действующих в среде Trainz.

Как показано на диаграмме вверху, объекты сценариев (равно как и обычные игровые объекты) могут взаимодействовать в среде Trainz. Взаимодействие выполняется с помощью сообщений, вызовов функций, а также с помощью других методов, например, функций обработки сообщений.

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

Это сложная тема, и возможно вам не все в ней понятно. Вероятно, тщательное изучение учебников поможет вам разобраться

См. также:
Сессии, Сценарии для электростанции, Правило выбора типа управления, Угольный хоппер



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