TRam_ » 12.06.2009, 17:11
во-первых, тебе надо написать "ручку" этого контроллера. Для этого в конфиге кабины обзываешь её мешь каким-нибудь своим именем, например "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 );
}
}
}
}
работоспособность не гарантирую (не тестировал) но вообще должно быть так
(собственно это и есть мануал по скриптованию кабин, правда, без взаимодействия со скриптом локомотива)
в z7 всё можно, а что нельзя - можно в sU