Тухляк на форуме
Добавлено: 28.06.2016, 18:54
РВ уже уже трогается, поэтому по такой странной логике есть заготовка скрипта управления пантографами на примере двухкабинного лока
P.S. есть еще пример тяги
- Код: Выделить всё
-- Таблица, описывающее управление пантографами
tPantograph = {
-- внутри нее таблицы (ключи таблиц = текст = имя контрола)
-- таблица положений переключателя
Switch = {
-- передний
["FrontPantoSwitch"] = -1,
-- задний
["RearPantoSwitch"] = -1
},
-- ссылка на анимацию в конфиге
Animation = {
-- аналогично
["FrontPantoSwitch"] = "frontP",
["RearPantoSwitch"] = "rearP"
},
-- состояние пантографа поднят = true
Moved = {
["FrontPantoSwitch"] = false,
["RearPantoSwitch"] = false
},
-- значение напряжения на пантографе
Voltage = {
["FrontPantoSwitch"] = 0,
["RearPantoSwitch"] = 0
}
} -- tPantograph
-- функция в таблице tPantograph, вызываемая из системной функции OnControlValueChange(name, index, value)
function tPantograph:Controls(name, index, value)
-- присвоение контролу нового значения
Call("SetControlValue", name, index, value)
-- если значение 0 или 1 (ключ полностью переключен)
if value == 0 or value == 1 then
-- изменить соответствующее значение в таблице tPantograph.Switch для данного переключателя
for k, v in pairs(self.Switch) do if string.find(name , k) then self.Switch[k] = -1 + 2*value end end
end -- if
end -- func
-- функция в таблице tPantograph, вызываемая из системной функции Update(time) каждый кадр при управлении.
function tPantograph:EWKUpdate(t)
-- проверка состояния каждого пантографа
for k, v in pairs(self.Switch) do
-- получение информация, завершилась ли анимация поднятия/опускания
self.Moved[k] = Call("*:AddTime", self.Animation[k], v * t --[[* 0.03]])
-- если переключатель в положении ВКЛ и анимация завершилась
if self.Switch[k] == 1 and self.Moved[k] ~= 0 then
-- на этом пантографе есть напряжение (да, даже на неэлектрифицированном пути)
self.Voltage[k] = 1
-- иначе если переключатель в положении ВЫКЛ
elseif self.Switch[k] == -1 then
-- на этом пантографе нет напряжения
self.Voltage[k] = 0
end
end -- for
-- если хотя бы на одном из пантографов есть напряжение (хотя бы один поднят)
if self.Voltage["FrontPantoSwitch"] + self.Voltage["RearPantoSwitch"] > 0 then
-- установка соответствующих системных контролов в положение ВКЛ
Call( "SetControlValue", "PantographControl", 0, 1)
Call( "SetControlValue", "Voltage", 0, 1)
-- если оба пантографа опущены или только начали опускаться
else
-- отключение компрессоров (если компрессора были включены, то точно их выключить, но это совсем другая история)
tCompressor:Controls("swt_Compressor1", 0, 0)
tCompressor:Controls("swt_Compressor2", 0, 0)
-- установка соответствующих системных контролов в положение ВЫКЛ
Call( "SetControlValue", "PantographControl", 0, 0)
Call( "SetControlValue", "Voltage", 0, 0)
-- VoltageBase = 0
end --if
end --func
-- управление пантографами под ботом
function tPantograph:PUpdate(t)
--пусто
end -- func
-- функция в таблице tPantograph, вызываемая из системной функции OnCameraEnter(cabEndWithCamera, carriageCam) при смене кабины (!)
-- условие о смене кабины не показано
function tPantograph:ChangeCab()
-- смена привязки анимации пантографов при смене кабины, чтобы пантограф был "передним" относительно положения активной кабины
tPantograph.Animation["FrontPantoSwitch"], tPantograph.Animation["RearPantoSwitch"] = tPantograph.Animation["RearPantoSwitch"], tPantograph.Animation["FrontPantoSwitch"]
end -- func
-- опускание пантографа на 146% при запуске карты (вызывается из функции Initialise())
function tPantograph:Initialise()
for k, v in pairs(self.Switch) do
self.Moved[k] = Call("*:AddTime", self.Animation[k], -5)
end
end
P.S. есть еще пример тяги