Форум Trainsim

Форум Trainsim (http://www.trainsim.ru/forum/index.php)
-   TrainZ - Звуки (http://www.trainsim.ru/forum/forumdisplay.php?f=29)
-   -   Вопросы по Auran GameScript (http://www.trainsim.ru/forum/showthread.php?t=13454)

Prince 03.01.2011 19:39

Вопросы по Auran GameScript
 
Ну, раз на Трейнзапе есть такая тема(кста, ето я ёё там создал:2:), то пусть и тут будет. Думаю, она будет полезна! Дерзайте, господа!

Prince 03.01.2011 20:08

Ну, пожалуй первым буду. Вопрос свой я адресую Владимиру aka TRam_. Вопрос касается обновлённого 2ТЕ116 от Rokky вышедшим не очень давно на Трейнзапе. Там реализован запуск дизеля с условием, что включен Автомат управления. Собсно вопрос: где вы ето условие прописали? Смотрел и скрипт лока, и кабины, но так ничё и не нашёл. Можете запостить ети строки скрипта на форум?

П.С. Сорри за мой руский. Я украинец.

Prince 03.01.2011 20:51

Ой! Сорри. Немного не там тему создал. Модераторы, перенесите плиз.

TRam_ 03.01.2011 21:09

проверка в скрипте кабины, в строках 776 и 791. В функции обработки перемещения рычагов и кнопок пользователем void UserSetControl(CabinControl p_control, float p_value) на обработке нажатия объектов zapusk1 и zapusk2, назначенных кнопкам "zapusk1" и "zapusk2".

[CODE]if(p_control == zapusk1)
{
if(bloc.GetValue()==0 or throttle_lever2.GetValue()!=0 or loco.GetEngineSetting("reverser") == 1 or automat1.GetValue()==0)
return;


if(p_value>0.5)
cd.zapusk1=true;
else
cd.zapusk1=false;
loco.SetCabinData(cd);
}

if(p_control == zapusk2)
{
if(bloc.GetValue()==0 or throttle_lever2.GetValue()!=0 or loco.GetEngineSetting("reverser") == 1 or automat1.GetValue()==0)
return;

if(p_value>0.5)
cd.zapusk2=true;
else
cd.zapusk2=false;
loco.SetCabinData(cd);
}[/CODE]
а именно automat1.GetValue()==0

PS я тож украинец.

Prince 03.01.2011 21:45

Спасибо, Владимир! Я думал всё проще сделано- в условие запуска прописаны свитчи, ну типа if SwitchOn1=true.

[QUOTE=TRam_;229461]я тож украинец[/QUOTE]

Круто! А вы с какого города?

TRam_ 03.01.2011 22:05

[QUOTE]А вы с какого города?[/QUOTE]Краматорск, Донецкой области.

[QUOTE]в условие запуска прописаны свитчи[/QUOTE]условие запуска отделено, и отделено глубоко-глубоко в скрипт локомотива. В данном случае автомат отключает только возможность срабатывания кнопки.

Prince 03.01.2011 22:17

[QUOTE=TRam_;229482]условие запуска отделено, и отделено глубоко-глубоко в скрипт локомотива. В данном случае автомат отключает только возможность срабатывания кнопки. [QUOTE]
Зрозумів. Думав, що усе дещо простіше.


[QUOTE=TRam_;229482]Краматорск [/QUOTE]

253км от меня)). Я с Марганца, Днепропетровская область.

Prince 04.01.2011 13:09

[QUOTE=TRam_;229482]automat1.GetValue()==0[QUOTE]

Стоп, стоп, стоп!! Почему ноль? Должно ж быть один! Тоесть он должен работать! И почему два знака уравнения!??

TRam_ 04.01.2011 14:39

1) потому что на это условие вызывается return; - если автомат выключен (== 0), то прекратить выполнение функции
2) два знака уравнения ищи в описании C# или Java . Так как trainz script является калькой с Java.

Prince 04.01.2011 16:44

[QUOTE=TRam_;229604]1) потому что на это условие вызывается return; - если автомат выключен (== 0), то прекратить выполнение функции[/QUOTE]
А, а я то думал, зачем оно там))

[QUOTE=TRam_;229604]2) два знака уравнения ищи в описании C# или Java . Так как trainz script является калькой с Java.[/QUOTE]

Вот, нашол:

[/QUOTE]оператор == (два знака равенства) — это проверка на равенство двух выражений[/QUOTE]

Тоесть, один знак равно-ето присвоение значения тегу/обьекту, а два знака равно- ето проверка равенства значений обьекта и числа которое стоит после знака. Верно?

TRam_ 04.01.2011 19:16

да, всё верно.

Prince 05.01.2011 13:02

Вот ёсчё вопросик: как ввести в скрипт тег и переменную, значение которой етот тег будет изменять. И можно ли задать еффективность любому тегу, например Set(имя тега)Efficently= (значение, которое хотим задать).

P.S. Сорри за такое большое количество вопросов.

TRam_ 05.01.2011 13:17

нет, нельзя. Надо для этого поток делать. А в кабине - прописывать увеличение в функции Update

Prince 05.01.2011 13:35

Тоесть вот так: thread void Set(имя тега)Efficently= (значение, которое хотим задать).

Combine 05.01.2011 13:39

[QUOTE]Вот ёсчё вопросик: как ввести в скрипт тег и переменную, значение которой етот тег будет изменять.[/QUOTE] Пришел злой Комбайн.
1. В программировании нет понятия "тег", это не ЖЖ.
2. По программированию на GS, С и Яве, равно как и по программированию в целом существует полно макулатуры в интернетах

[QUOTE]И можно ли задать еффективность любому тегу[/QUOTE] Любая программа имеет КПД=100%, т.к. является математической сущностью.

[QUOTE]В функции обработки перемещения рычагов и кнопок пользователем void UserSetControl(CabinControl p_control, float p_value)[/QUOTE] Настоятельно не рекомендую использовать его, а проверять значение контрола непосредственно в месте его использования. Есть вероястность того, что между UserSetControl и использованием данные успеют устареть. А еще лучше завести некий монитор, который будет в каждом кадре (по Update()) проверять все контролы и производить соотв. изменения в данных. Так мы отделим модель от реализации, что хорошо.

TRam_ 05.01.2011 13:48

[QUOTE]Есть вероястность того, что между UserSetControl и использованием данные успеют устареть.[/QUOTE]в случае "событийной" модели данные не устаревают, т.к. обработчики сообщений срабатывают мгновенно. В данном случае какие бы события не происходили с кабиной 2ТЭ116 после нажатия кнопки запуска, если топливный насос включен, то дизель заведётся.

Prince 05.01.2011 14:52

[QUOTE=Combine;229894]
2. По программированию на GS, С и Яве, равно как и по программированию в целом существует полно макулатуры в интернетах[/QUOTE]

Понял, сваливаю.....

[QUOTE=Combine;229894]
Любая программа имеет КПД=100%, т.к. является математической сущностью..[/QUOTE]

Я имел ввиду еффективность, с которой "тег" будет повышать/понижать значение некой переменной.

TRam_ 05.01.2011 14:56

в C# не бывает эффективности.

Prince 08.01.2011 13:28

Как сделать так, чтобы через определённый промежуток времени к переменной прибавлялось некое число?Ничего лучше, чем вот ето

thread void MyFunction
{
int Voda_temper=0

Nagrevanie=Voda_temper+0.25
Sleep(10)
}

в голову не пришло.

Combine 08.01.2011 14:31

А лучше ничего и нет. Только у тебя в коде не хватает точек с запятой. И еще, не знаю, задумано ли так, но поток отработает один раз и закроется, так что Sleep тут не нужен, равно как и ключевое слово thread.

Prince 08.01.2011 14:34

Но мне нужно, чтобы ето число прибавлялось постоянно до определённого лимита(условия)!

Arturmachinist 08.01.2011 14:42

Может, циклом тогда?

Combine 08.01.2011 15:00

int Voda_temper=0; //Глобальная

thread void MyFunction(void)
{
while(condition) //condition — условие, пока верно, цикл выполняется, если нет, выходим
{
Voda_temper=Voda_temper+0.25;
Sleep(10);
}
}

Prince 08.01.2011 17:13

Пост ниже

Prince 08.01.2011 17:15

[QUOTE=Combine;230911]
{
Voda_temper=Voda_temper+0.25;
}[/QUOTE]

Может, Nagrevanie=Voda_temper+0.25;

Но всё равно. спасибо большое!

Arturmachinist 08.01.2011 17:21

Тогда тебе после этого действия придётся ещё приравнивать Voda_temper к Nagrevanie. Зачем тебе это? У тебя одна переменная изменяется в ходе цикла. Вторая не нужна.

Prince 09.01.2011 23:28

Оффтоп: Трам читай личку!!!

GSTrainz 02.02.2011 23:42

Подскажите пожалуйста:
Как значение переменной int time=21.05 (время суток)
присвоить двум переменным (часы и минуты) чтобы
int Hours=21;
int Mins=05;
:o

kemal 03.02.2011 13:31

[QUOTE=GSTrainz;238481]int time=21.05[/QUOTE]

Как это?? о_0
Или уж float, или без дробной части.
А вообще, Trainz для этих целей использует дробное значение от 0 до 1. И где-то в скриптах даже есть функции перевода.

TRam_ 03.02.2011 13:52

функции перевода из минут в аурановские единцы есть в скриптовых библиотеках раскачивания, в ТЭП10, новых локомотивах... Там используются минуты, т.е. 21.05 это 1265 минут.

GSTrainz 03.02.2011 17:02

kemal ,на int time=21.05 как ни странно,компилятор не ругается.
Просто так удобнее забивать график поездов в программу.Можно по другому:
сразу ручками вбивать одной переменной значение часов,другой-минут.Но так не очень удобно.Вот я и спрашиваю:можно ли как-то целое значение переменной time
присвоить одной переменной,а дробное-другой?

TRam, тут наоборот-задача перевести привычное время расписания в еденицы,понятные скрипту(для отправления поезда по расписанию)
Сейчас это так происходит:
P=18,O=07;// поезд 5762 Феодосия-Кировское ,время отправления 18.07 (дополнительные переменные нужны потому,что для каждого поезда-свое время отправления для каждой станции)
time=World.GetGameTime ();
iHours=P,iMins=O;
if (iHours < 12)
fTime = 0.5 + (iHours / 24.0) + (iMins / 1440.0) + (iSecs / 86400.0);
else
fTime = ((iHours - 12) / 24.0) + (iMins / 1440.0) + (iSecs / 86400.0);
while(time<fTime) // пока фактическое время меньше времени отправления-ждем
{
time=World.GetGameTime ();
Sleep(1);
}
if ( soundvokzal !="_") Sleep (World.Play2DSound(SCN_dir,soundvokzal+".mp3"));// объявление об отправлении

PS Неудачно взял для примера int time=21.05. Это не та переменная,что присутствует в фрагменте скрипта.

GSTrainz 11.02.2011 00:43

Так...Ну с этой ерундой вроде разобрался (не знаю,правильно ли)
float time=21.40;
int hh=time;
int min=(time-hh)*100;
Interface.Print ("time="+time+" hh="+hh+" min="+min) ;
результат: time=21.40 hh=21 min=39 (интересно,почему min= не 40?)

Задача:пасс из 5 вагонов прибывает на 1 путь.В хвост-прицепка 10 вагонов.Остановиться надо ближе к выходному светофору на триггере "TE2C"
Остановка раньше этого момента должна сопровождаться периодически повторяющимся сообщением информатора (у первой платформы протягивают пассажирский состав),чтобы подсказать игроку,что надо двигаться к светофору.

int n=0;
while(n<2)
{
while (train1.IsStopped()==false) n=1;
Sleep (Math.Rand(2,5));
if ( Navigate.OnTrigger(me,train1,"TE2C",Navigate.TRIGGER_ENTER)) n=3;
if (n==1) Sleep (World.Play2DSound(SCN_dir, "ob_na_vokz_118"+".mp3")),Sleep (Math.Rand(5,10));
}
// продолжение программы

Вроде бы логически все верно и компилятор ошибок не выдает,но в игре вылетает ошибка ER_Timeout в строке while (train1.IsStopped()==false) n=1;

TRam_ 11.02.2011 12:23

логически неверно. Ты скобки неверно поставил.

int n=0;
while(n<2)
{
while (train1.IsStopped()==false) [INDENT]{
n=1;
Sleep (Math.Rand(2,5));
}[/INDENT]if ( Navigate.OnTrigger(me,train1,"TE2C",Navigate.TRIGG ER_ENTER)) [INDENT]n=3;[/INDENT]if (n==1) [INDENT]Sleep (World.Play2DSound(SCN_dir, "ob_na_vokz_118"+".mp3"));[/INDENT]Sleep (Math.Rand(5,10));
}

GSTrainz 11.02.2011 14:44

Спасибо.Теперь ошибка ушла.Но задачка все равно не решена.Получается,что пока поезд не наедет на "TE2C"-ничего не происходит сколько не останавливайся.А потом,при наезде на триггер сразу идет продолжение программы.Попробовал по другому:поставил триггер "TE1C" с зоной действия на участке,где останавливаться рано.
while(n<2)
{
while (train1.IsStopped()==false)
{
n=1;
Sleep (Math.Rand(2,5));
}

if ( Navigate.OnTrigger(me,train1,"TE1C",Navigate.TRIGGER_ENTER)) n=1;
else n=3;
if (n==1)
Sleep (World.Play2DSound(SCN_dir, "ob_na_vokz_118"+".mp3"));
Sleep (Math.Rand(5,10));
}

Остановился там,где не надо-зазвучало сообщение информатора.При возобновлении движения информатор замолчал.Съехал с триггера TE1C
но,вопреки ожиданию,программа не продолжила работу.(а ведь,по идее должна была сработать строка else n=3; )
Осадил состав назад(снова наехал на триггер TE1C) и остановился-вновь зазвучало сообщение информатора...

genesis 11.02.2011 20:30

[QUOTE=GSTrainz;240611]Задача:пасс из 5 вагонов прибывает на 1 путь.В хвост-прицепка 10 вагонов.Остановиться надо ближе к выходному светофору на триггере "TE2C"
Остановка раньше этого момента должна сопровождаться периодически повторяющимся сообщением информатора (у первой платформы протягивают пассажирский состав),чтобы подсказать игроку,что надо двигаться к светофору.[/QUOTE]

[CODE]Message msg;
Sniff(train1, "Trigger", "Stopped", true);
PostMessage(me, "TimerTick", "", 0.1);

wait()
{
on "Trigger", "Stopped", msg:
{
if (msg.src != Router.GetGameObject("TE1C")
or msg.dst != train1)
{
continue;
}
break;
}
on "TimerTick", "":
{
while (train1.IsStopped())
World.Play2DSound(SCN_dir, "ob_na_vokz_118"+".mp3");
PostMessage(me, "TimerTick", "", Math.Rand(5.0, 10.0));
continue;
}
}

msg = null;
Sniff(train1, "Trigger", "Stopped", false);[/CODE]

TRam_ 12.02.2011 00:36

[QUOTE] on "TimerTick", "":
{
while (train1.IsStopped())
World.Play2DSound(SCN_dir, "ob_na_vokz_118"+".mp3");
PostMessage(me, "TimerTick", "", Math.Rand(5.0, 10.0));
continue;
}[/QUOTE]

on "TimerTick", "":
{
if (train1.IsStopped())
World.Play2DSound(SCN_dir, "ob_na_vokz_118"+".mp3");
PostMessage(me, "TimerTick", "", Math.Rand(5.0, 10.0));
continue;
}

GSTrainz 12.02.2011 02:50

Спасибо,genesis!Спасибо TRam!Все заработало!
А можно ли это решение оформить как подпрограмму?Если да,то как это сделать?(ну,чтоб при каждом похожем случае не копипастить в текст программы одно и то-же,за исключением названия триггера)

TRam_ 12.02.2011 12:13

наверно как-то так...



[CODE]void WaitForTrain(Asset SCN_dir, Train train1, string ObjectName, string SoundName)
{
Message msg;
Sniff(train1, "Trigger", "Stopped", true);
PostMessage(me, "TimerTick", "", 0.1);

wait()
{
on "Trigger", "Stopped", msg:
{
if (msg.src != Router.GetGameObject(ObjectName)
or msg.dst != train1)
{
continue;
}
break;
}
on "TimerTick", "":
{
if (train1.IsStopped())
World.Play2DSound(SCN_dir, SoundName);
PostMessage(me, "TimerTick", "", Math.Rand(5.0, 10.0));
continue;
}
}

msg = null;
Sniff(train1, "Trigger", "Stopped", false);
}[/CODE]

правда не совсем уверен что заработает (wait() может потребовать наличие потока (т.е. не void WaitForTrain а thread void WaitForTrain), а потоки бы обрабатывались не последовательно, а параллельно - следуещее событие прицепки не ждало бы предыдущего)

genesis 12.02.2011 19:01

Если эта функция вызвана из потока, то проблем не будет.

GSTrainz 13.02.2011 20:57

Все ок,спасибо!
Новая задачка: в сценарии грузовые поезда создаются таким образом(упрощенно):
dltr2=Math.Rand(20,70);// длина состава

KUID[] sostav2=new KUID[0];
for (is = 0; is<dltr2; ++is)
{
snvag=Math.Rand(20,110);// номер вагона
// хопер-дозаторы 21-30
// цистерны четырехосные 31-50
// цистерны восьмиосные 51-60
// платформы 61-70
// полувагоны 71-80
// хоперы-минераловозы 81-90
// рефрежераторы 91-100
// крытые 101-110
sostav2[is]=GetAsset().LookupKUIDTable("vag"+snvag);
}
train2=World.CreateTrain(sostav2,"ST",true);

Можно ли как-то назначать определенным вагонам грузы?(например,если snvag = платформа,то загрузить на этот вагон груз для платформы)Где вообще брать эти грузы?Их куиды то-же надо вносить в конфиг сценария?


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

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