Просмотр полной версии : Клавиши в trainz
до недавнего времени на всех "наших" сайтах о данной игре не освещался способ скриптования кавиш. И хотя почти все могут использовать форму
void UserPressKey(string s)
{
if (!veh)
{
inherited(s);
return;
}
Train train = veh.GetMyTrain();
if (s == "train_cabin_brake_application")
{
if (train_brake_lever )
{
// self-lapping brakes
float brakes = train.GetTrainBrakes();
if (brakes < Train.TRAIN_BRAKE_INITIAL)
brakes = Train.TRAIN_BRAKE_INITIAL;
else
{
brakes = brakes + 0.05f;
if (brakes > Train.TRAIN_BRAKE_APPLICATION)
brakes = Train.TRAIN_BRAKE_APPLICATION;
}
train.SetTrainBrakes(brakes);
}
}
}
в скрипте кабины, но никто не говорил о кодовых строках подобных "train_cabin_brake_application" . Полный их список содержится в
(директория трейнз)->Settings->keyboard.txt
В дальнейшем создавая скрипты управления клавишами, можно значительно упростить жизнь "работникам виртуальной ж-д "
Изменяя содержимое этого файла можно наоборот менять клавиши "под свои любимые". пример содержимого
train_dcc_down x, comma
train_dcc_up w, fullstop
train_dcc_stop s, slash
train_dcc_handbrake a, apostrophe
т.е. можно строку s скрипта сравнивать также со строками типа "train_dcc_up" или "train_dcc_stop".
Думаю даная тема позволит управлять новым ВЛ10 не только с помощью мышки :rolleyes: :russian:
Думаю даная тема позволит управлять новым ВЛ10 не только с помощью мышки Да я это все знаю давно, не всё, что в файле описано, работает, и в ВЛ10 управление с клавиатуры делать не будем.
-20% привлекательности модели.
-20% привлекательности модели.как знать, как знать...
Не все так просто так как
1. Половина этих самых клавиш описанных в keyboard.txt не работает начиная с классика.
2. Добавление своих конешно решает эту проблему но создает лишь неудобства пользователям
3. Ауран эту проблему решать не собирается
-Pass ALL keystroke information to the cab/cabin script. Currently only a subset of the keys usable are passed to the script methods meaning the cab script cannot react to all the users control requests and the range of controls is not extensible. -eldavo
--Please provide more information on what you want here. Which keys are you missing out on that you actually need? -chris
--At this time Trainz does not passes via Cabin.UserPressKey(string) large number of keyboard shortcuts defined in file Settings/keyboard.txt. This makes difficult to override default cabin implementation and defining custom functions to keys. -Mike
--As above, please provide specifics. We will not be simply passing through all keyboard information because this breaks localisation support. We may be able to help with specific requests. ~chris
Об какой спрашивается локализации они говорят?
4. Могу заверить что все это скриптерам давно известно:p
-20% привлекательности модели. Не нравится, не катайся ;)
Присоединяюсь. Мышкой гораздо приятнее управляться в кабине, щелкать кнопками и прч.:)
Вот и крути одновременно мышом камеру и ручки - если успеешь управиться одновременно смотреть в окно и на кран. А я буду дальше кататься с пульта, как нормальный человек.
поверь, прекрасно успеваю, и еще получаю от этого удовольствие. Если у вас на экране не помещаются все рычаги управления, измените угол обзора в кабине ключом -cabinFOV=XX в trainzoptions.txt
... А код-то в примере практически чистый С++ :)). Ох, чую я, что займусь я этими скриптами, да так, что от траинзы щепки полетят!
// злорадно и многообещающе потирает руки, ехидно посмеиваясь
Очень даже понятный скрипт - при помощи интерфейсных конструкций GetTrainBrakes() и SetTrainBrakes осуществляется изменения состояния переменной brake - объекта класса train... Если текущее меньше предыдущего, не трогать тормоза, если больше - сделать разрядку....
А кто вообще может дать почитать список всех используемых игрой функций управления объектами классов, описание самих классов ? Пожалуйста, очень интересно.
АПИ, загружается на files.auran.com
Спасибо! Ещё переводить никто не брался? Было бы вообще класс, меньше кипит мозг при чтении.
Очень даже понятный скрипт - при помощи интерфейсных конструкций GetTrainBrakes() и SetTrainBrakes осуществляется изменения состояния переменной brake - объекта класса train... Если текущее меньше предыдущего, не трогать тормоза, если больше - сделать разрядку....
Вроде бы здесь о разрядке речь не идёт? :confused:
В скрипте речь идёт чисто о степени применения тормоза.
Спасибо! Ещё переводить никто не брался? Было бы вообще класс, меньше кипит мозг при чтении.
Мозг будет кипеть после того, как узнаешь что половина "пикантных особенностей" не оговорена ни словом, к куче функций описания весьма скормны и непонятны, а кое-что поблескивает надписью "Obsolete, do not use!!!" или "This functions isn't implemented yet"... x_x
ну и что? главное - что можно сделать кучу процессов которые будут работать одновременно(звуки, управления тягой, тормозами, проскальзыванием, тормозной рукояткой, компрессором, светом, "прикрепляемыми" и(или) анимрованными сценами (возможна даже "вложенная анимация", хотя официально это не возможно :) ), звуком, как 2-мерным, так и 3-мерным(и при удалении от этого звук естественно затухает))).
Но запомните - при торможении мы сможем опустошить только ГМ, т.к. "зарядка" в трейнз "автоматическая", автомат начинает прекрашать подачу воздуха в ТМ без сверхзарядки совсем (к сожалению я ошибся насчёт неё).
возможна даже "вложенная анимация", хотя официально это не возможно :)
Не понял что здесь имеется ввиду О_о Если сложение/наложение анимаций то все работает и поддерживается самим джетом
это не поддерживается плагином. обычные точки привязки неанимируемы
Не нравится, не катайся ;)
Сто раз согласен:drinks: ! Наконец-то будет лок, который управляется как в реале. Или вреале вы тоже нажимаете Num3, чтобы затормазить;) ?
Вопрос по теме:
Тут недавно вышел ВЛ80Р-1867 со скриптом включения ГВ и МВ. А можно это дело привязать к клавишам?
Но запомните - при торможении мы сможем опустошить только ГМ ГМ не бывает. Есть НМ, ТМ...
вибачте, ГР (головний резервуар :) )
привязать то можно, но нужно и скрипт переделать и сделать скрипт кабины (а поскольку админ этого скрипта TRam_, и он пока не разрабатывает, то ответ нет)
возобновляю эту старую, забытую тему....
итак... Открываем папку любой trz , папку Settings, файл keyboard.txt
В нём мы видим все используемые этой игрой клавиши, и строки, кодирующие эти клавиши.
Именно СТРОКИ движок trz воспринимает при нажатии клавиш. Как видете, многие клавиши
повторяются для разных строк (значит, обе эти строки будут обрабатываться одновременно).
В трс можно два способа "информирования" скрипта о нажатии клавиши - скриптовый и косвенно-скриптовый.
Начнём с косвенно-скриптового, т.е. с распознавания сообщений о том или ином действии клавиши.
Таких действия 4 - включение гудка, включение "звонка"(Америка...), включение посыпания песка
и поднятие токоприёмника. Покажу, как их "доставать". Если у нас 2009(более ранним не надо),
то в trainzoptions.txt прописывем строку
-enablescriptmessagelogging
Заходим в trz, устанавливаем на рельсы электровоз, и нажимаем клавиши из keyboard.txt
соответствующие строкам
train_horn
train_sand
train_bell
train_pantograph_toggle
После этого выключаем trz и просматриваем файл "JetLog.txt". В нём находим интресующие нас
строки -
? 000004B8 Warn 1:01.1 Trainz : ScriptLog> router message from 0002 '' to 0000 '', message Train, NotifyHorn
? 000004B8 Warn 0:53.1 Trainz : ScriptLog> router message from 0002 '' to 0000 '', message Train, NotifySanding
? 000004B8 Warn 0:54.2 Trainz : ScriptLog> router message from 0002 '' to 0000 '', message Train, NotifyBell
? 000004B8 Warn 0:58.7 Trainz : ScriptLog> router message from 0002 '' to 0000 '', message Train, NotifyPantographs
Значит, для того, чтобы "поймать" эти клавиши, достаточно создать в скрипте локомотива функцию-обработчик одного из этих
сообщений типа
void obrabotchik1(Message msg)
{
// проверяем, что это сообщение послал именно наш поезд
if(cast<train> (msg.src)==me.GetMyTrain())
{
//здесь собственно обработка нажатия
}
}
и "установить" её на локомотив
AddHandler(me,"Train","NotifyHorn","obrabotchik1");
Но это не основной способ получения клавиш.
Рассмотрим основной, скриптовый. Итак, заходим в папку scripts , находим там файл "Cabin.gs" и открываем его.
Тут описывается всё функции кабины, написаные аурановцами и скомпилированные в "Cabin.gsl" папки libraries .
класс CabinControl вообще широко известен, именно он широко используются в ВЛ10-1628 и ЧС4т для
"вылавливания" поворота мышью ручек и тумблеров. Ну класс Cabin является родителем класса DefaultLocomotiveCabin,
установленного почти на всех "нескриптованных" непаровых локомотивах .
А теперь рассмотрим функцию, которая в самом низу этого класса, выглядящую так
public void UserPressKey(string s)
{
Interface.Log("Cabin.UserPressKey> unhandled key-command " + s);
}
Аурановцы говорят, что вызовом этой функции заставить trz "подумать, что нажималась клавиша" нельзя,
эта функция только ВЫЗЫВАЕТСЯ ОБРАБОТЧИКОМ нажатия клавиши на клавиатуре.
Подождите, что-то знакомая строка.... Открываем JetLog.txt и перед строкой
? 000004B8 Warn 0:58.7 Trainz : ScriptLog> router message from 0002 '' to 0000 '', message Train, NotifyPantographs
видим строку (тут прописывание -enablescriptmessagelogging в 2009 роли не играет)
? 000004B8 Warn 0:58.7 Trainz : WorldState::NativeLog> Cabin.UserPressKey> unhandled key-command firebox-door-toggle
Вот-то она, работа этой самой процедуры... А "firebox-door-toggle" - почти то же, что "train_cabin_firebox_door_toggle",
согласно keyboard.txt соответствует клавиша KP1 , та же, что и для токоприёмника.
Ну и перебрав таким же образом (на нескриптованном электровозе) все клавиши, описанные в keyboard.txt, получаем следующий список
"работающих":
а) для всех версий trz
train_cabin_brake_application
firebox-door-toggle (соответствует train_cabin_firebox_door_toggle)
train_cabin_throttle_0
train_cabin_throttle_up
train_cabin_throttle_down
steam-regulator-up (соответсвует train_cabin_regulator_up)
steam-regulator-down (соответсвует train_cabin_regulator_down)
steam-reverser-up (соответсвует train_cabin_reverser_up)
steam-reverser-down (соответсвует train_cabin_reverser_down)
wave (соответсвует train_cabin_coalman_wave)
steam-blower-up (соответсвует train_cabin_blower_up)
steam-blower-down (соответсвует train_cabin_blower_down)
steam-injector-up (соответсвует train_cabin_injector_up)
steam-injector-down (соответсвует train_cabin_injector_down)
cabin-fans (соответсвует train_cabin_fans)
shovel-coal (соответсвует train_cabin_shovel_coal)
б) и для версий 2009 и старше (аурановцы, как и обещали, расширили предыдущий список)
train_cabin_toggle_draincocks
train_cabin_aws_isolate
train_cabin_aws_activate
train_cabin_tpws_reset
train_cabin_tpws_override
train_cabin_dra_on
train_cabin_dra_off
train_cabin_emergency_stop
train_cabin_master_switch_on
train_cabin_master_switch_off
train_cabin_panel_lamp_test
steam-injector2-up (соответсвует train_cabin_injector2_up)
steam-injector2-down (соответсвует train_cabin_injector2_down)
train_cabin_toggle_draincocks
train_cabin_engine_on
train_cabin_engine_off
train_cabin_hardware_0
train_cabin_hardware_1
train_cabin_panel_lamp_test
train_cabin_wipers_on
train_cabin_wipers_off
train_cabin_hardware_0
train_cabin_hardware_1
обращаю Ваше внимание - некоторые строки относятся к 2 клавишам одновременно. Хотя файл keyboard.txt в ранних версиях
защищён от записи, Вы можете скопировать его содержимое в копию любого текстового файла из директории trs (для сохранения кодировки)
назвать keyboard.txt и заменить им этот файл.
В 2009 его можно редактировать свободно.
Ну а пример обработки кабиной, например, "wave" такой
void UserPressKey(string s)
{
if (s == "wave")
{
// собственно обработка клавиши
}
}
Напоминаю, что кабина "активна", если вы находитесь на этом локомотиве (но не обязательно в виде "1" - и в "2" и остальных :) )
А если сделать шаг дальше - дописать в файл keyboard.txt еще пару клавиш и назначить им сообщение?
Новых строк назначить нельзя. Можно только переназначит клавиши, соответствующие строкам
А сообщения вообще нильзя сделать никак
точнее, самый простой способ "улавливания клашиши" и передачи её локомотиву в виде сообщения такой
class Cabin_keyb isclass DefaultLoocmotiveCabin
{
void UserPressKey(string s)
{
if (s == "train_cabin_engine_on")
{
PostMessage(loco,"engine","on",0);
}
else
if (s == "train_cabin_engine_off")
{
PostMessage(loco,"engine","off",0);
}
}
хотя я предпочитаю другой способ, используя класс CabinData
}
Володя, а ты не пробовал раскурочить аурановские файлы? Которые скомпилированные? Они ж все, заразы, дополнительно в виде исходников выложены. Может, стоит там поискать список сообщений?
список строк я дал. Думаю, он совершенно полный, т.к. именно по файлу keyboard.txt трейнз расшифровывает клавиатуру (насколько я понял аурановцев). Если хотите, можете перепроверить его на наличие неуказнных мною строк, которые всё-таки работают...
в 2009 нам дали 23(!!!) дополнительных слоков под клавиши. В дефолтных локах они ни на что не влияют. Поэтому смело делай "преобразователь" своего пульта на клавиши, соответствующие им (там большинство расшифровывается как Alt+<клавиша> )
Которые скомпилированные? но зачем? И так 23 новых слота под клавиши работают... Неужели мало?
Задай к ним нужные тебе клавиши и "прилагай" к своему "пульту" новый keyboard.txt , адаптированный к пульту.
Есть предложение глобально изменить keyboard.txt файл, так, чтобы было одинаково у всех.
Что не нравится в текущем варианте:
1. Наличие строк с неназначенными комбинациями, вроде
train_cabin_throttle_8 null
Это снижает количество возможных комбинаций
2. Несколько клавиш, обрабатываемые одной строкой, к примеру:
train_cabin_brake_release q, KP9, KPPgUp
Это сразу лишает возможности отдельно использовать нампад.
3. Клавиши p, [, ] заняты самой игрой. Я не знаю, исправит ли это правка файла, но стоит попробовать.
Одна из целей этого - обеспечить возможность реализации более удобной раскладки клавиш:
Блок qweasd - управление контроллером
r, f - управление реверсивкой
[, ] - КВТ (, и . в случае невозможности)
; ' - КМ
x, h, b - песок, тифон, свисток
Нампад - управление дверями в трамваях и МВПС, а также функции автоинформаторов, МСУД и т.п.
Соответственно, хочется услышать мнения насколько это все необходимо и обосновано, а также возможные последствия от этого шага.
считаю что необходимо. Только потом сделать описание, чему каждая клавиша соостветствует и распространять его вместе с keyboard.txt
Согласен. На основе унифицированного файла всем будет удобнее. А вот нумпад желательно бы вообще исключить :) - ну его, этот нумпад. Верхние цифры заняты под камеры, F-ы - под менюшки. Может, стоит рассмотреть вариант Shift+кнопка по образцу МСТС?
так поредактируй в своём трс файл keyboard.txt :). shift+кнопка там прописать можно. Если получится что-то интересное, можешь здесь отписаться
Нампад может быть полезен для ввода команд автоведения и КЛУБ.
А ведь верно :) . Про панели таких приборчиков я и забыл!
В ТРС09 удалось перенаправить команды вроде смены вида камеры на другие клавиши. Правда также выяснилось, что некоторые строки, наподобие train_cabin_brake_release в скрипт не поступают.
train_cabin_brake_release да, аурановцы обработку train_cabin_brake_release и train_cabin_brake_lap не делали ...
Там еще с десяток таких. Это скорее всего намеренно.
МБ. Аурановцы тоже нас боятся :)
TRam_, у меня вот такой вот вопрос:
Как реализуется прямое управление? Через public в скрипте лока, а вот каков сам механизм? Что и как и где надо прописывать? То что скрипт лока надо в кабину кинуть и инклудить его это я знаю.
Прямое управление чего и чем?
Как реализуется прямое управление?поясни
Ну кабина-локомотив, как это сделанно в 1628
Для этого нужно иметь доступ к фактическому классу локомотива из кабины. А для этого нужно иметь точную копию скрипта лока в папке кабины (даже мизерное отличие приведет к null'у в касте) и в аттаче привести лок к его фактическому классу. В ТРС09 можно использовать script-include-table и подключить скрипт лока сразу из ассета лока, без мучений с копированием.
Набор методов в локе ты сам волен определить, так что не спрашивай что делать :)
даже мизерное отличие приведет к null'у в касте Я думаю, будет достаточно просто бинарной совместимости классов.
Хочешь выстрелить себе в ногу?)
Ну это так, чисто теоретическое измышление.
L.U.B.I.N.D.A...
10.05.2010, 12:25
Вспомнилось тут...
Зажал как-то в trs какую-то комбинацию клавиш и после этого "летал" в кабине при помощи стрелок. Теперь ищу эту комбинацию. :)
L.U.B.I.N.D.A..., можно написать в trainzoptions.txt (в корневой папке ТРС) "-freeintcam" и теперь всегда можно передвигаться по кабине при помощи стрелок.
ViktorRy
19.07.2014, 16:35
В своё время TRam_ публиковал в этой ветке полный список строковых эквивалентов, генерируемых движком при нажатии определённых клавиш клавиатуры. Именно эти строковые эквиваленты обрабатываются методом UserPressKey(string s). С тех пор было написано много скриптов к различным локомотивам, использующих этот метод для отслеживания нажатия клавиш.
Но вот на дворе уже 2014 г., Auran успела выпустить ещё одну новую игру и несколько обновлений к ней. К несчастью, разработчики почему-то значительно решили урезать список доступных кодов...
Приведу полный список действующих строк для версии игры Trainz Simulator 12 v3.7:
train_cabin_brake_application
train_cabin_throttle_0
train_cabin_throttle_up
train_cabin_throttle_down
wave
cabin-fans
train_cabin_aws_reset (новая)
train_cabin_aws_isolate
train_cabin_aws_activate
train_cabin_tpws_reset
train_cabin_tpws_isolate (новая)
train_cabin_tpws_activate (новая)
train_cabin_tpws_override
train_cabin_dra_on
train_cabin_dra_off
train_cabin_emergency_stop
train_cabin_panel_lamp_test
train_cabin_engine_on
train_cabin_engine_off
train_cabin_hardware_0
train_cabin_hardware_1
train_cabin_wipers_on
train_cabin_wipers_off
train_cabin_vigilance_foot_pedal (новая)
Были исключены:
firebox-door-toggle
steam-regulator-up
steam-regulator-down
steam-reverser-up
steam-reverser-down
steam-blower-up
steam-blower-down
steam-injector-up
steam-injector-down
shovel-coal
train_cabin_toggle_draincocks
train_cabin_master_switch_on
train_cabin_master_switch_off
steam-injector2-up
steam-injector2-down
Так что для создателей модификаций ПС со скриптованными кабинами предстоит кропотливая работа по исправлению скриптов. Пожелаю им удачи...
Не совсем. Аурановцы ввели новый тип ассетов - KIND Controlset (http://online.ts2009.com/mediaWiki/index.php/KIND_Controlset). В нём прописываешь все нужные тебе контейнеры клавиш, а затем прописываешь этот куид в кабине или библиотеке. В результате нажатия настроенных у этих контейнеров клавиш (в главном меню игры) получаешь сообщения, которые затем обрабатываешь хендлерами или потоками в скриптах кабин/библиотек. Пример локомотивов с этим хозяйством - 2ТЭ121 и ДМ62.
ViktorRy
19.07.2014, 21:26
TRam_, спасибо, попробую разобраться...
vBulletin® v3.8.12 by vBS, Copyright ©2000-2025, Jelsoft Enterprises Ltd. Перевод: zCarot