Форум Trainsim

Форум Trainsim (http://www.trainsim.ru/forum/index.php)
-   TrainZ - Моделирование (http://www.trainsim.ru/forum/forumdisplay.php?f=25)
-   -   Клавиши в trainz (http://www.trainsim.ru/forum/showthread.php?t=3366)

TRam_ 27.08.2008 18:07

Клавиши в trainz
 
до недавнего времени на всех "наших" сайтах о данной игре не освещался способ скриптования кавиш. И хотя почти все могут использовать форму

[CODE] 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);
}
}
}
[/CODE]в скрипте кабины, но никто не говорил о кодовых строках подобных "train_cabin_brake_application" . Полный их список содержится в
(директория трейнз)->Settings->keyboard.txt

В дальнейшем создавая скрипты управления клавишами, можно значительно упростить жизнь "работникам виртуальной ж-д "
Изменяя содержимое этого файла можно наоборот менять клавиши "под свои любимые". пример содержимого

[CODE] train_dcc_down x, comma
train_dcc_up w, fullstop
train_dcc_stop s, slash
train_dcc_handbrake a, apostrophe
[/CODE]
т.е. можно строку s скрипта сравнивать также со строками типа "train_dcc_up" или "train_dcc_stop".
Думаю даная тема позволит управлять новым ВЛ10 не только с помощью мышки :rolleyes: :russian:

Combine 27.08.2008 19:24

[QUOTE]Думаю даная тема позволит управлять новым ВЛ10 не только с помощью мышки [/QUOTE] Да я это все знаю давно, не всё, что в файле описано, работает, и в ВЛ10 управление с клавиатуры делать не будем.

Skif 27.08.2008 21:51

-20% привлекательности модели.

TRam_ 27.08.2008 22:04

[QUOTE=Skif;41058]-20% привлекательности модели.[/QUOTE]как знать, как знать...

genesis 28.08.2008 08:16

Не все так просто так как
1. Половина этих самых клавиш описанных в keyboard.txt не работает начиная с классика.
2. Добавление своих конешно решает эту проблему но создает лишь неудобства пользователям
3. Ауран эту проблему решать не собирается
[QUOTE]-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[/QUOTE]
Об какой спрашивается локализации они говорят?
4. Могу заверить что все это скриптерам давно известно:p

Combine 28.08.2008 15:04

[QUOTE]-20% привлекательности модели.[/QUOTE] Не нравится, не катайся ;)

genesis 28.08.2008 16:36

Присоединяюсь. Мышкой гораздо приятнее управляться в кабине, щелкать кнопками и прч.:)

Skif 28.08.2008 22:19

Вот и крути одновременно мышом камеру и ручки - если успеешь управиться одновременно смотреть в окно и на кран. А я буду дальше кататься с пульта, как нормальный человек.

genesis 28.08.2008 22:52

поверь, прекрасно успеваю, и еще получаю от этого удовольствие. Если у вас на экране не помещаются все рычаги управления, измените угол обзора в кабине ключом -cabinFOV=XX в trainzoptions.txt

Skif 28.08.2008 23:34

... А код-то в примере практически чистый С++ :)). Ох, чую я, что займусь я этими скриптами, да так, что от траинзы щепки полетят!

// злорадно и многообещающе потирает руки, ехидно посмеиваясь

Skif 30.08.2008 21:20

Очень даже понятный скрипт - при помощи интерфейсных конструкций GetTrainBrakes() и SetTrainBrakes осуществляется изменения состояния переменной brake - объекта класса train... Если текущее меньше предыдущего, не трогать тормоза, если больше - сделать разрядку....

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

genesis 30.08.2008 23:06

АПИ, загружается на files.auran.com

Skif 01.09.2008 21:20

Спасибо! Ещё переводить никто не брался? Было бы вообще класс, меньше кипит мозг при чтении.

xXx 02.09.2008 13:25

[QUOTE=Skif;41653]Очень даже понятный скрипт - при помощи интерфейсных конструкций GetTrainBrakes() и SetTrainBrakes осуществляется изменения состояния переменной brake - объекта класса train... Если текущее меньше предыдущего, не трогать тормоза, если больше - сделать разрядку....
[/QUOTE]

Вроде бы здесь о разрядке речь не идёт? :confused:
В скрипте речь идёт чисто о степени применения тормоза.

genesis 02.09.2008 14:04

[QUOTE=Skif;41963]Спасибо! Ещё переводить никто не брался? Было бы вообще класс, меньше кипит мозг при чтении.[/QUOTE]
Мозг будет кипеть после того, как узнаешь что половина "пикантных особенностей" не оговорена ни словом, к куче функций описания весьма скормны и непонятны, а кое-что поблескивает надписью "Obsolete, do not use!!!" или "This functions isn't implemented yet"... x_x

TRam_ 02.09.2008 20:50

ну и что? главное - что можно сделать кучу процессов которые будут работать одновременно(звуки, управления тягой, тормозами, проскальзыванием, тормозной рукояткой, компрессором, светом, "прикрепляемыми" и(или) анимрованными сценами (возможна даже "вложенная анимация", хотя официально это не возможно :) ), звуком, как 2-мерным, так и 3-мерным(и при удалении от этого звук естественно затухает))).
Но запомните - при торможении мы сможем опустошить только ГМ, т.к. "зарядка" в трейнз "автоматическая", автомат начинает прекрашать подачу воздуха в ТМ без сверхзарядки совсем (к сожалению я ошибся насчёт неё).

genesis 02.09.2008 23:09

[QUOTE=TRam_;42084]возможна даже "вложенная анимация", хотя официально это не возможно :)[/QUOTE]
Не понял что здесь имеется ввиду О_о Если сложение/наложение анимаций то все работает и поддерживается самим джетом

TRam_ 03.09.2008 11:50

это не поддерживается плагином. обычные точки привязки неанимируемы

Evgenyi 03.09.2008 16:45

[QUOTE=Combine;41169]Не нравится, не катайся ;)[/QUOTE]

Сто раз согласен:drinks: ! Наконец-то будет лок, который управляется как в реале. Или вреале вы тоже нажимаете Num3, чтобы затормазить;) ?

Вопрос по теме:
Тут недавно вышел ВЛ80Р-1867 со скриптом включения ГВ и МВ. А можно это дело привязать к клавишам?

Combine 03.09.2008 19:07

[QUOTE]Но запомните - при торможении мы сможем опустошить только ГМ[/QUOTE] ГМ не бывает. Есть НМ, ТМ...

TRam_ 03.09.2008 19:34

вибачте, ГР (головний резервуар :) )

привязать то можно, но нужно и скрипт переделать и сделать скрипт кабины (а поскольку админ этого скрипта TRam_, и он пока не разрабатывает, то ответ нет)

TRam_ 22.07.2009 19:12

возобновляю эту старую, забытую тему....

итак... Открываем папку любой 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" и остальных :) )

Skif 23.07.2009 10:11

А если сделать шаг дальше - дописать в файл keyboard.txt еще пару клавиш и назначить им сообщение?

TRam_ 23.07.2009 11:47

Новых строк назначить нельзя. Можно только переназначит клавиши, соответствующие строкам

А сообщения вообще нильзя сделать никак

TRam_ 23.07.2009 12:05

точнее, самый простой способ "улавливания клашиши" и передачи её локомотиву в виде сообщения такой

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

}

Skif 23.07.2009 14:52

Володя, а ты не пробовал раскурочить аурановские файлы? Которые скомпилированные? Они ж все, заразы, дополнительно в виде исходников выложены. Может, стоит там поискать список сообщений?

TRam_ 23.07.2009 15:18

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

в 2009 нам дали 23(!!!) дополнительных слоков под клавиши. В дефолтных локах они ни на что не влияют. Поэтому смело делай "преобразователь" своего пульта на клавиши, соответствующие им (там большинство расшифровывается как Alt+<клавиша> )

[QUOTE] Которые скомпилированные?[/QUOTE] но зачем? И так 23 новых слота под клавиши работают... Неужели мало?

Задай к ним нужные тебе клавиши и "прилагай" к своему "пульту" новый keyboard.txt , адаптированный к пульту.

genesis 13.11.2009 23:07

Есть предложение глобально изменить keyboard.txt файл, так, чтобы было одинаково у всех.
Что не нравится в текущем варианте:
1. Наличие строк с неназначенными комбинациями, вроде
train_cabin_throttle_8 null
Это снижает количество возможных комбинаций
2. Несколько клавиш, обрабатываемые одной строкой, к примеру:
train_cabin_brake_release q, KP9, KPPgUp
Это сразу лишает возможности отдельно использовать нампад.
3. Клавиши p, [, ] заняты самой игрой. Я не знаю, исправит ли это правка файла, но стоит попробовать.

Одна из целей этого - обеспечить возможность реализации более удобной раскладки клавиш:
Блок qweasd - управление контроллером
r, f - управление реверсивкой
[, ] - КВТ (, и . в случае невозможности)
; ' - КМ
x, h, b - песок, тифон, свисток
Нампад - управление дверями в трамваях и МВПС, а также функции автоинформаторов, МСУД и т.п.

Соответственно, хочется услышать мнения насколько это все необходимо и обосновано, а также возможные последствия от этого шага.

TRam_ 14.11.2009 13:10

считаю что необходимо. Только потом сделать описание, чему каждая клавиша соостветствует и распространять его вместе с keyboard.txt

Skif 14.11.2009 13:35

Согласен. На основе унифицированного файла всем будет удобнее. А вот нумпад желательно бы вообще исключить :) - ну его, этот нумпад. Верхние цифры заняты под камеры, F-ы - под менюшки. Может, стоит рассмотреть вариант Shift+кнопка по образцу МСТС?

TRam_ 14.11.2009 13:39

так поредактируй в своём трс файл keyboard.txt :). shift+кнопка там прописать можно. Если получится что-то интересное, можешь здесь отписаться

Combine 14.11.2009 17:02

Нампад может быть полезен для ввода команд автоведения и КЛУБ.

Skif 14.11.2009 17:29

А ведь верно :) . Про панели таких приборчиков я и забыл!

genesis 14.11.2009 17:58

В ТРС09 удалось перенаправить команды вроде смены вида камеры на другие клавиши. Правда также выяснилось, что некоторые строки, наподобие train_cabin_brake_release в скрипт не поступают.

TRam_ 14.11.2009 20:28

[QUOTE]train_cabin_brake_release[/QUOTE] да, аурановцы обработку train_cabin_brake_release и train_cabin_brake_lap не делали ...

genesis 14.11.2009 21:10

Там еще с десяток таких. Это скорее всего намеренно.

TRam_ 14.11.2009 21:13

МБ. Аурановцы тоже нас боятся :)

Evgenyi 14.03.2010 15:12

TRam_, у меня вот такой вот вопрос:
Как реализуется прямое управление? Через public в скрипте лока, а вот каков сам механизм? Что и как и где надо прописывать? То что скрипт лока надо в кабину кинуть и инклудить его это я знаю.

genesis 14.03.2010 15:50

Прямое управление чего и чем?

TRam_ 15.03.2010 15:16

[QUOTE]Как реализуется прямое управление?[/QUOTE]поясни


Текущее время: 19:43. Часовой пояс GMT +4.

Powered by vBulletin® Version 3.8.12 by vBS
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd. Перевод: zCarot
© 2001-2019, Администраторы и разработчики Клуба Trainsim