Информация: Уважаемые посетители! В течение нескольких месяцев на форуме существовала проблема с регистрацией новых пользователей, о которой администрации стало известно недавно. Если вы ранее пытались зарегистрироваться на форуме, но не получили на ваш e-mail письмо с ссылкой для подтверждения регистрации, просим вас зарегистрироваться повторно. Приносим извинения за доставленные неудобства. Если вы все еще испытываете проблемы с регистрацией на форуме, обратитесь за помощью на e-mail: mr.angelo@railroadsim.net

Аватара пользователя
A1iv
 
Сообщения: 442
Зарегистрирован: 27.10.2011, 03:30
Откуда: РФ, Тверская обл.
Имя: Алексей
Блог: Просмотр блога (10)
Поиск в блогах

1 из 52 из 53 из 54 из 55 из 5

Диалоги с картинками в сценариях Railworks

Постоянная ссылка A1iv 06.07.2014, 17:58

Диалоги с картинками в сценариях Railworks


В прошлый раз было рассмотрено использование кинематографич. камер в сценариях Railworks. На этот раз это сообщения с картинками.

Расширенные (с картинками) диалоги

Сложность: умеренная

Автор руководства: Rick Grout
Перевод и практич. комм.: Алексей Иванов (A1iv)
Тип руководства: для сценариев

Введение

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

Краткое изложение

Расширенные диалоги составлены из файлов изображений и текстовых HTML файлов. Сценарий должен содержать Триггер, Остановиться у или другие инструкции сценария, чтобы вызвать срабатывание назначенного пользователем События Успеха (либо неудачи). Когда такое событие происходит, ScenarioScript.lua вызывает диалоговое окно, которое будет отображено на экране, производя системный вызов, который ссылается на соотв. HTML-файл.

Предпосылки к успешному использованию

Чтобы успешно пользоваться этим руководством, вам необходимо следующее:
-- Опыт в создании обычных сценариев для Train Simulator.
-- Знание папок расположения контента, маршрутов и сценариев, и каким образом файлы расположены в этих папках.
-- Наличие и знакомство с программой редактирования изображений.
-- Понимание HTML структуры и тэгов разметки.*
-- Общее представление о содержимом LUA скриптов и знакомство с принципами написания скриптов.
-- Достаточное понимание вышеизложенного для устранения проблем по мере их возникновения.

*На самом деле достаточно один раз создать подходящий HTML-файл и везде его использовать, слегка редактируя.


Шаг 1. Подготовка изображений

Большинство ваших диалогов будут содержать разговоры между членами локомотивной бригады и переговоры с диспетчером. Вы можете использовать любые изображения, какие хотите, для воспроизведения этих персонажей. Один из способов заключается в том, чтобы захватить скриншотами снаружи действующих персонажей в кабине локомотива и рабочих возле ж/д путей. RSC иногда использует изображение соответствующего ж/д здания для воспроизводства диспетчера (в нем), но вы, вероятно, сможете придумать что-то получше этого. Опять же, здесь подойдет все, что бы вы ни использовали.

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

Откройте изображение в вашем редакторе изображений и выберите квадратную область, охватывающую голову и плечи персонажа. Обрежьте изображение и уменьшите его размер до 128*128 пикс. Это обычный размер для портретов, но вы можете использовать любой размер, какой захотите, из того, что впишется в диалоговое окно. Сохраните изображение в PNG формате. Название, которое вы задаете картинке, здесь не имеет значения, но, возможно, оно о чем-то напоминает вам.

Изображение

Шаг 2. Написание текста диалога

Расширенные диалоги пишут в простой версии HTML (Hypertext Markup Language, язык Интернета). HTML файлы могут быть открыты и отредактированы в любом текстовом редакторе. Но если вы дважды щелкните по файлу, он откроется в веб-браузере. Для редактирования файла щелкните правой кн. мыши по нему и выберите "открыть с помощью", и во всплывающем меню выберите ваш тестовый редактор.

Вот пример:

Код: Выделить всё
 <HTML>
  <BODY BGCOLOR="#0000007F">
    <TABLE>
      <TR valign="top">
        <TD><img src="../Диспетчер.png" alt="" width="128" height="128" ></TD>
        <TD><FONT COLOR="#FFFFFF" FACE="Arial" SIZE="4">
        <P>Диспетчер:<BR>
           Приготовьтесь остановиться перед следующим красным сигналом!</P>
        </FONT></TD>
      </TR>
    </TABLE>
  </BODY>
</HTML>


Обратите внимание, что таблица используется для размещения изображения в левой колонке, а текст во второй (правой) колонке. Это самый распространенный формат [для диалога]. Но не обязательно так делать. Вы можете разместить изображение и текст последовательно, т.е. друг за другом, если хотите.

В тексте вы можете использовать дополнительные <p> тэги (параграф) для отделения строк текста абзацами (параграфами), либо применить <br> тэги (переход на след. строку) для простого перехода на след. строку.

Вы не ограничены одним изображением. Просто убедитесь, что значения ширины и высоты, которые вы указываете, соотв. ширине и высоте самого изображения. И, конечно, убедитесь, что все изображения поместятся в диалоговом окне. Выберите больший диалог при необходимости (см. Шаг 4).

Создайте новую папку в вашей папке сценария и назовите ее "En" по-английски. Сохраните законченный HTML файл в En папку. Для этого урока, мы назовем наш файл ExtDlg1.HTML, но вы можете назвать файл как угодно, лишь бы он имел расширение .HTML .

Дважды щелкните по вашему новому HTML файлу для его просмотра в веб-браузере. Сделайте поправки по мере необходимости.

Что касается текстового содержимого, тут можно пойти двумя путями. Если вы заменяете традиционное сообщение в существующем сценарии, то вы можете зайти в редактор сценариев и извлечь текст из Инструкции Сценария где он содержится. Переместите текст в ваш новый HTML файл. Убедитесь, что Инструкция сценария больше не содержит в себе текст, поскольку текст должен присутствовать только в одном из мест.

Вы можете пойти конечно, и другим путем, составив свой собственный текст.

Шаг 3. Добавление или изменение инструкций сценария

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

Откройте Редактор Сценария и в верхнем левом вылетающем меню нажмите на значок "просмотр Расписания" (синие и красные часы). Если вы в процессе создания нового сценария, добавьте новую Инструкцию сценария. Если же вы изменяете существующий сценарий, найдите Инструкцию сценария, которую хотите изменить.

Теперь откройте диалоговое окно новой Инструкции сценария. Проведите мышкой по значкам, пока не обнаружите значок Триггер События об Успехе -- это значок одного из двух шестеренок с курсором редактора. В небольшом поле справа от значка впишите простую череду алфавитно-числовых символов, которые вам о чем-то говорят. Например, если ваш сценарий назван Утренняя поездка, можете использовать сокращенное UTRO1. (Здесь же используется MSM1). Число здесь на случай, если вы будете добавлять более чем одну Триггер инструкцию. Все подобные Инструкции сценария должны иметь свое собств. название и числ. значение, что предполагает легкий поиск по нумерации на конце. Запишите эти символические названия (с расшифровкой), либо запомните их, так как вам это вскоре понадобится.

Конечно, вы также можете сделать что было разобрано выше и для Триггера События о Неудаче.

Особенность Триггера События заключается в том, что он будет отображать только одиночный блок текста [без картинки]. Таким образом, Триггер Инстукция должна содержать единственно Триггер Событие [хотя возможно добавлять в ней и текст, но нам нельзя в ней писать текст как на правом рисунке] .
Изображение Изображение

Ну а далее, процесс [создания расширенных диалогов] такой же, как уже было описано выше. Если вы преобразовываете существующий сценарий под отображение расширенных диалогов, и вам встретится инструкция сценария, которая содержит текст - удалите текст. У вас к этому времени уже должен быть заготовлен [HTML-файл] из Шага 2 под Инструкцию Сценария. Если вы еще не сделали этого, скопируйте [текст HTML] и вставьте его во временный файл. Вам нужно будет вернуться к Шагу 2 для понимания процесса отображения содержимого в расширенных диалогах [(разобрать теги)].

Закройте диалоговое окно "просмотр расписания", сохраните и выйдите.

Шаг 4. Добавление скрипта

Если папка вашего сценария уже содержит файл под названием ScenarioScript.lua, можете пропустить следующий абзац.

Найдите имеющийся LUA скрипт. Возможно, вам придется просмотреть несколько папок сценариев, прежде чем вы найдете его. Начните поиск с одного из недавно вышедших маршрутов. Скрипты всегда называются ScenarioScript.lua. Перенесите скрипт в папку вашего сценария.

Откройте ScenarioScript.lua в папке вашего сценария любым текстовым редактором. Вы должны увидеть что-то наподобие этого:

-- true/false defn
FALSE = 0
TRUE = 1
-- condition return values
CONDITION_NOT_YET_MET = 0
CONDITION_SUCCEEDED = 1
CONDITION_FAILED = 2
-- Message types
MT_INFO = 0 -- large centre screen pop up
MT_ALERT = 1 -- top right alert message
MSG_TOP = 1
MSG_VCENTRE = 2
MSG_BOTTOM = 4
MSG_LEFT = 8
MSG_CENTRE = 16
MSG_RIGHT = 32
MSG_SMALL = 0
MSG_REG = 1
MSG_LRG = 2
------------------------------------------------
-- Fn OnEvent
-- event - name of the event
-- return - TRUE/FALSE if event handled
function OnEvent ( event ) -- Instruction triggers
---------------------------
-- Timed triggers
---------------------------
:
:
Здесь кусок скрипта
:
:

return FALSE
end

Случай 1: Если вы используете LUA скрипт, который скопировали с другого сценария, удалите текст, представленный выше строками Здесь кусок скрипта. ЗАМЕНИТЕ текст, который вы только что удалили, приведенным ниже.
Случай 2: Если ScenarioScript.lua уже имеется в вашей папке сценария, ДОБАВЬТЕ приведенное ниже перед выражением return FALSE.
Код: Выделить всё
 if event == "MSM1" then
  SysCall ( "ScenarioManager:ShowInfoMessageExt", "67d61e56-1b1d-438d-a97f-93279205e529", "ExtDlg1.html", 8, MSG_LEFT + MSG_TOP, MSG_SMALL, FALSE );
  return TRUE
end

Первая строчка кода содержит ссылку на Событие под названием MSM1, которое вы назначали вместе с Инструкцией Сценария в Шаге 3. Когда симулятор сталкивается с такой Инструкцией Сценария, он запускает ScenarioScript.lua, проверяя название События на соответствие MSM1, и выполняет указания, которые вместе с этим последуют.

Системный вызов SysCall, должно быть, говорит сам за себя, но вот каково значение всего вместе взятого?

Первый пункт, GUID (уникальный глобальный 128-битный идентификатор), это 128-разрядное число, представленное строкой символов, составляющих сложный комплекс, у которого невероятно мала вероятность его повторения в каком-либо другом месте. Все ShowInfoMessageExt вызовы в существующем сценарии должны иметь один и тот же GUID.
Лучшим способом залучить [100%] действующий GUID является поиск в интернете GUID-генератора. Поисковик выдаст вам список из нескольких пригодных простых инструментов для его создания. Выберите любой из них и добудьте свой GUID.*

* Нет актуальности в такой политике сегодня, так как НОВЫЕ сценарии в Railworks всегда с хорошими GUIDами (а вот старые попадались с плохими типа одни нули). GUID генерирует сам симулятор при создании сценария для него. Совпадений GUID - один на миллион. К тому же, придется изменять это число GUID везде в сценарии - как минимум в трех местах - это папка сценария, файл ScenarioProperties и файл +0000000+000001.bin (как-то так), который еще вдобавок нужно сконвертировать в xml.. . GUID -, собственно, содержится в названии папки сценария (само название папки и есть GUID, который нужно скопировать и вставить в скрипт).

Скопируйте-вставьте свой GUID между кавычек как указано в приведенном выше отрывке скрипта.

След. пункт - название HTML-файла, который вы создали в Шаге 2 выше. [Вставляя в скрипт], убедитесь, что взяли название в кавычки.

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

След. пункт задает размер диалога. Самостоятельные размеры не допустимы. Допустимые размеры перечислены в самом начале сценария, и это MSG_SMALL, MSG_REG и MSG_LRG. В большинстве диалогов используют MSG_SMALL формат сообщения (маленькое окно), но вы можете использовать более широкие форматы, если требуется.

Последний пункт, если установлено TRUE, все действия прекратятся, будь то игровые или видео кинематограф. камеры, пока игрок не закроет диалог (прочитает его). Как правило, здесь должно быть выставлено FALSE.

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

Блок авторства (различен для каждого сценария)

-- true/false defn
FALSE = 0
TRUE = 1
-- condition return values
CONDITION_NOT_YET_MET = 0
CONDITION_SUCCEEDED = 1
CONDITION_FAILED = 2
-- Message types
MT_INFO = 0 -- large centre screen pop up
MT_ALERT = 1 -- top right alert message
MSG_TOP = 1
MSG_VCENTRE = 2
MSG_BOTTOM = 4
MSG_LEFT = 8
MSG_CENTRE = 16
MSG_RIGHT = 32
MSG_SMALL = 0
MSG_REG = 1
MSG_LRG = 2
------------------------------------------------
-- Fn OnEvent
-- event - name of the event
-- return - TRUE/FALSE if event handled
function OnEvent ( event )
-- Instruction triggers
---------------------------
-- Timed triggers
---------------------------
:
:
Здесь имеющаяся часть скрипта (если она есть)
:
:

if event == "MSM1" then
SysCall ( "ScenarioManager:ShowInfoMessageExt", "67d61e56-1b1d-438d-a97f-93279205e529", "ExtDlg1.html", 8, MSG_LEFT + MSG_TOP, MSG_SMALL, FALSE );
return TRUE
end
return FALSE
end


Шаг 5. Проверка

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

ПРАКТИКА

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

1. В редакторе сценария зайти в "просмотр расписания", создать Триггер Инструкцию и справа в небольшом поле задать ей название (оно же событие), и сохранить сценарий.

2. Пойти в папку со сценарием и создать там папку "Ru". Находится папка со сценарием ориентировочно, если сценарий создан на маршруте Тест-трек, по пути: ДИСК:\Steam\steamapps\common\railworks\Content\Routes\00000008-0000-0000-0000-000000000000\Scenarios\9aa03d61-fd50-4cf5-9811-af7985e9448c\ .
Там будет несколько сценариев. Чтобы найти свой, можно смотреть по времени создания папки, или же открыть файл ScenarioProperties.xml и отыскать там название своего сценария, при условии, что он был написан англ. буквами, а то одни корякозябры будут.

3. На втором этапе нужно создать HTML файл с изображением и диалогом внутри, и положить все в папку со сценарием.

Изображение - лучше брать размером 128*128 примерно - это оптимально. Не обязательно квадратное, любое сойдет. Формат изображения - jpg, png - сим точно прочитает. Я взял картинку диспетчера из видеоролика.
HTML-документ - можно использовать предложенный Rick Grout в Шаге 2, слегка подредактировав. Но можно и "существенно" улучшить HTML-страницу - подредактировав расположение картинки относительно текста, размер шрифта, цвет шрифта, сам шрифт и др. . Да.., к сожалению, здесь немногое возможно сделать, так как симулятор понимает о-очень мало HTML-тегов.
А вот ссылку на картинку в HTML-файле можно указывать в любое место ее нахождения, по правилам написания ссылок на картинку. Например, если картинку автор решит положить в ту же папку, что и сам HTML файл, то ссылка на нее должна быть прямой - <img src="dispetcher1.jpg" >
HTML-документ нужно сохранить в кодировке UTF-8 и положить в папку со сценарием (вместе со связанной с ним картинкой). Сохранять в формат HTML можно и из Notepad++, например.

Вот мой код HTML-файла:

Код: Выделить всё
 <HTML>
  <BODY BGCOLOR="#0000005F">
       
   <TABLE>
   <FONT COLOR="#CC5555" FACE="Arial" SIZE="4">
        <P>Диспетчер:<BR>
      </FONT>
     <TR valign="top">
        <TD><img src="dispetcher1.jpg" ></TD>
        <TD><FONT COLOR="#FFFFFF" FACE="Arial" SIZE="4">
        <P>Приготовьтесь отправиться через минуту. Вам предстоит прицепить состав на третьем пути и отвести его к шахтам.</P>
        </FONT></TD>
      </TR>
    </TABLE>
  </BODY>
</HTML>

Мой с картинкой, могу поделиться

Понятно, что после создания HTML-файла его нужно редактировать для каждого конкретного сценария, в первую очередь отредактировать текст диалога и название файла.

4. На третьем этапе предстоит написать, точнее отредактировать скрипт, вызывающий HTML-файл. Затем сохранить его под названием ScenarioScript.lua в кодировке ANSI, и положить в папку со сценарием. Сохранять в формат lua можно из notepad++, хотя, думаю, это все равно просто текстовый файл с кодом.

Код: Выделить всё
------------------------------------------------
-- ScenarioScript.lua
-- 14/06/2011
-- Copyright 2011 RailSimulator.com ltd. Edit by A1iv for dialogs.
--
-- Scenario Script Tutorial - 'Early Morning Switching '
------------------------------------------------

-- true/false defn
FALSE = 0
TRUE = 1

-- condition return values
CONDITION_NOT_YET_MET = 0
CONDITION_SUCCEEDED = 1
CONDITION_FAILED = 2

-- Message types
MT_INFO = 0         -- large centre screen pop up
MT_ALERT = 1      -- top right alert message

MSG_TOP = 1
MSG_VCENTRE = 2
MSG_BOTTOM = 4
MSG_LEFT = 8
MSG_CENTRE = 16
MSG_RIGHT = 32

MSG_SMALL = 0
MSG_REG = 1
MSG_LRG = 2

------------------------------------------------
-- Fn OnEvent
--       event - name of the event
--       return - TRUE/FALSE if event handled
function OnEvent ( event )
   if event == "intro" then -- Affiche Texte
      
      SysCall ( "ScenarioManager:ShowInfoMessageExt", "9aa03d61-fd50-4cf5-9811-af7985e9448c", "dialog1.html", 10, MSG_LEFT + MSG_TOP, MSG_REG, FALSE );
      return TRUE;
         
   end
    return FALSE
end


Это скрипт для вызова диалога с картинкой(ами). Здесь:
intro - название Триггер инструкции в сценарии, какую я задавал.
9aa03d61-fd50-4cf5-9811-af7985e9448c - идентификатор (заместо названия) сценария. Это название папки сценария; либо его можно найти в файле ScenarioProperties.xml, в строках GUID, что в начале.
dialog1.html - название моего html-файла.
10 - число секунд для отображения диалога.
MSG_LEFT + MSG_TOP - расположение сообщ. относит. экрана - слева-вверху. Возможные варианты см. в начале скрипта, где присваиваются значения.
MSG_REG - размер окна сообщения. Это средний и наилучший. Есть также маленькое и большое (MSG_SMALL, MSG_LRG соотв.), но не советую.
FALSE - сообщение не помешает другим действиям игрока.

5. Забыл сказать, скрипты лучше компилировать. LUAC компилятор имеется в корневой папке Railworksa. Нужно на него сделать ярлык и положить на раб. стол. Затем накинуть свой скрипт на ярлык, и выдадут скомпилированный скрипт. Далее, как обычно, положить скрипт в папку сценария. Если не работает, компилятор есть в окне "просмотр расписания" в редакторе.
--------------------------------------

На рейтинги статей мне все равно, их оценить смогут только разработчики симулятора и я.
Последний раз редактировалось A1iv 29.07.2014, 00:32, всего редактировалось 38 раз(а).

0 комментариев 252791 просмотров

Кто сейчас на конференции

Зарегистрированные пользователи: сеня, Google [Bot], Yandex [Bot]