Страница 1 из 6

Комбинорованный контроллер номерного

СообщениеДобавлено: 11.06.2009, 00:30
Artur
Как сделать контроллер в кабине номерного комбинированным? Тоесть нужно сделать так, что бы можно было тормозить и давать позиции на ход контроллером. Применить хотелось бы вот тут Изображение - есть контроллер со всеми позициями, но все они работают на ход.
Куда и какой скрипт нужно прописать? Хотелось бы также привязать соответсвующие звуки (звуки ТЭДов при торможении электродинамикой) к торможению контроллером.

Re: Комбинорованный контроллер номерного

СообщениеДобавлено: 11.06.2009, 12:10
agmike
Скрипт нужно не прописать, а написать.

Re: Комбинорованный контроллер номерного

СообщениеДобавлено: 11.06.2009, 17:11
kemal
agmike
Я так понимю тут тоже самое, что ты говорил, когда мы тормоза обсуждали.
Раскажи, как это делается. Мне это тоже пригодится.

Re: Комбинорованный контроллер номерного

СообщениеДобавлено: 11.06.2009, 17:41
agmike
А что рассказывать, функции известные, контроллер настраивается. Ничего нового сказать не могу.

Re: Комбинорованный контроллер номерного

СообщениеДобавлено: 11.06.2009, 18:52
kemal
Кому известные, а кому как.. Не зря я открывал тему "Особенности скриптования ПС". По идее контроллеры тоже к ней относятся..
Так что рассказывай.

Re: Комбинорованный контроллер номерного

СообщениеДобавлено: 11.06.2009, 19:03
Vano-sie72
ты будешь делать с выводом позиций? Т1-Т1А-Т1 и.тд ???

Re: Комбинорованный контроллер номерного

СообщениеДобавлено: 11.06.2009, 19:21
agmike
Млин, что непонятного, все делается с помощью SetEngineSetting(string,float)
"dynamic-brake",0 - режим тяги
"dynamic-brake",2 - режим ЭДТ
Мощность регулируется "throttle",число от 0 до макс. позиции
Все это задокументировано в АПИ, это базовые возможности, придумывать или изобретать ничего не надо. Надо только читать и использовать.

Re: Комбинорованный контроллер номерного

СообщениеДобавлено: 11.06.2009, 20:17
TRam_
Мощность регулируется "throttle",число от 0 до макс. позиции
соответственно тяга выбирается из куидов enginespec вагонов (2 соответствующих раздела с тягой и "динмическим торможением" от скорости для каждой позиции).

Если захочешь, чтоб мощность была меньше, чем указанная там (для этого вагона) то можешь врубить буксование для данной силы тяги

Vehicle.SetMaximumTractiveEffort(float maxTE)


где maxTE - сила тяги "срыва в боксование" (
maxTE Maximum tractive effort of this vehicle in expressed in kilo Netwons(kN).
).
А если при этом охота, чтоб "колёса не пели", можно воспользоваться public native void SetWheelslipTractionMultiplier (float multiplier) как

Vehicle.SetWheelslipTractionMultiplier (1);

(типа при проскальзывании сила трения колеса равна силе тяги, т.е. колесо по 2 з-ну Нютона не проскальзывает, но сила тяги остаётся равной установленной в SetWheelslipTractionMultiplier)

ну а как писать "включение нужной тяги или торможения от скорости и положения рукоятки", думать вам самим

кстати, можете спросить Combine . Он вроде этим уже занимался для номерного...

Re: Комбинорованный контроллер номерного

СообщениеДобавлено: 12.06.2009, 01:03
Artur
А можна более конкретно сказать в какие строки нужно вписывать, что б нижние 3 позиции были тормозными? Я конечно понимаю, что вы все опытные на этом деле, и считаете это элементарным, но хотелось бы получить полную и развёрнутую информацию, что нужно для этого сделать.

Re: Комбинорованный контроллер номерного

СообщениеДобавлено: 12.06.2009, 17:11
TRam_
во-первых, тебе надо написать "ручку" этого контроллера. Для этого в конфиге кабины обзываешь её мешь каким-нибудь своим именем, например "kontroller" . Соответственно обычные ручки для контроллера и переключатель динамического тормоза НЕ ДЕЛАЕШЬ

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

1) обьявлена объект "CabinControl "

CabinControl throttle_lever; //!< Throttle lever.

2)при инициализации этот объект линкуется к меши, которую ты прописал в конфиге

public void Init(void)
{

/////
throttle_lever = GetNamedControl("throttle_lever");

////////
}

3)при переведении рычага трейнз вызывает


void UserSetControl(CabinControl control, float value)
{
///

if (control == throttle_lever)
loco.SetEngineSetting("throttle", value);



////
}
и при этом value - это угол поворота левера, делённый на разность "максимального и минимального углов", и затем умножается на значение тега "limits" в конфиге

Если хочешь, чтоб было от "0" до "1", прописывай там limits 0,1

ну а чтоб скриптом принудительно повернуть рычаг, трейнз использует

train_brake_lever.SetValue(<собственно степень поворота, если limits 0,1 то от 0 до 1 >);
правда, возможно, она в 2006 и 2007 не работает, только в классике и 2009
и ещё
есть одна функция, которая тут не используется, но вообще может быть полезна

public void Update(void)
вызывается трейнз автоматически, причём чем больше загруженность процессора, тем реже. Если ваши "проверяльщики параметров" будут вызываься из неё, никто не будет ругать Вас "за использование слишком большого числа потоков"

итак, тебе нужен пимерно такой скрипт


include DefaultLocomotiveCabin.gs
include "train.gs"
include "locomotive.gs"

class nomerny_cab isclass DefaultLocomotiveCabin
{

CabinControl Mykontroller;

public void Init(void)
{
inherited(); // эта штука прописывается, чтобы выполнилась функция Init класса DefaultLocomotiveCabin

Mykontroller=GetNamedControl("kontroller");
}

void UserSetControl(CabinControl control, float value)
{
inherited(); // вызывается UserSetControl из DefaultLocomotiveCabin . Это чтоб амперметры реверсоры и прочее работало...
// здесь это сделано вначале, т.к. именно она будет проверять, инициализирован ли локомотив.
// соответственно если UserSetControl из DefaultLocomotiveCabin вызовет return; то строки этой UserSetControl ниже inherited(); выполняться не будут



if (control ==Mykontroller)
{
if(value<0.3) // мы договорились, что значения будут от 0 до 1
{
// соответственно при 0 должна быть 8 позиция ЭДТ
// при < 0.3 ЭДТ должно включаться, при =>0.3 выключаться

loco.SetEngineSetting("dynamic-brake", 2);
// ну а дальше придуем рассчётную формулу "позиции ЭДТ" от "степени повёрнутости рычага"
// например "позиция" = ((0.3 - "степени повёрнутости")/0.3 )*8 (так как их всего 8)


loco.SetEngineSetting("throttle", (0.3 - value)/0.3 *8 );
}
else // вспоминаем что при =>0.3 ЭДТ выключается
{
loco.SetEngineSetting("dynamic-brake", 0); //(выключаем)

// формула для рассчёта "положения тяги" например такая
//"позиция" = (("степени повёрнутости"-0.3)/0.7 )*8

loco.SetEngineSetting("throttle", (value-0.3)/0.7 *8 );
}
}
}
}

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

Re: Комбинорованный контроллер номерного

СообщениеДобавлено: 18.11.2009, 21:00
kemal
В примере вычисления выполняются кабиной. Вопрос: можно ли эти вычисления поручить локомотиву? И как?

Re: Комбинорованный контроллер номерного

СообщениеДобавлено: 18.11.2009, 21:25
TRam_
можно. Но для этого надо создать "мост" между локом и кабиной. Можешь посмотреть 2ТЭ10М, КДЭ161 или 2ТЭ116 (мостом может быть либо специальный класс-наследник класса CabinData (синхронизируемые объекты которого создаются и на локе, и на кабине, и взаимно обновляют друг друга), либо сообщения)

Re: Комбинорованный контроллер номерного

СообщениеДобавлено: 18.11.2009, 22:19
AlexanderG
А лучше ТГМ23 — там самый простой и дубовый скрирт.

Re: Комбинорованный контроллер номерного

СообщениеДобавлено: 19.11.2009, 02:29
kemal
А примерами не поделитесь? А то найти не могу((

Re: Комбинорованный контроллер номерного

СообщениеДобавлено: 19.11.2009, 02:50
TRam_
КДЭ161 http://railroadsim.net/ru/downloads/trainz/special_rs

ТГМ23Б есть у мну на trainzold.mylivepage.ru

они и являются примерами... Обращай внимание на фукцию SetCabinData() - именно в ней происходит обработка посылок от кабины к локу, а GetCabinData() - запросы кабины у лока

и то, и другое выполняет кабина. Причина тут в том, что когда перелезашь с одного вагона на другой, кабина на том, из которого ты вылез, "разбирается", а на том, который ты залез - инициализируется. Поэтому локу нерационально разузнавать, жива ли его кабина или нет. Поэтому,, если кабине что-то надо (кабина ссылку на лок получает при выполнении ф-ции attach() ), она обычно вызывает GetCabinData(), а если в лок надо что-то впихнуть - то лучше проводить <локомотив>.SetCabinData(<CabinData кабины>)