Вопросы по Auran GameScript
Ну, раз на Трейнзапе есть такая тема(кста, ето я ёё там создал:2:), то пусть и тут будет. Думаю, она будет полезна! Дерзайте, господа!
|
Ну, пожалуй первым буду. Вопрос свой я адресую Владимиру aka TRam_. Вопрос касается обновлённого 2ТЕ116 от Rokky вышедшим не очень давно на Трейнзапе. Там реализован запуск дизеля с условием, что включен Автомат управления. Собсно вопрос: где вы ето условие прописали? Смотрел и скрипт лока, и кабины, но так ничё и не нашёл. Можете запостить ети строки скрипта на форум?
П.С. Сорри за мой руский. Я украинец. |
Ой! Сорри. Немного не там тему создал. Модераторы, перенесите плиз.
|
проверка в скрипте кабины, в строках 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 я тож украинец. |
Спасибо, Владимир! Я думал всё проще сделано- в условие запуска прописаны свитчи, ну типа if SwitchOn1=true.
[QUOTE=TRam_;229461]я тож украинец[/QUOTE] Круто! А вы с какого города? |
[QUOTE]А вы с какого города?[/QUOTE]Краматорск, Донецкой области.
[QUOTE]в условие запуска прописаны свитчи[/QUOTE]условие запуска отделено, и отделено глубоко-глубоко в скрипт локомотива. В данном случае автомат отключает только возможность срабатывания кнопки. |
[QUOTE=TRam_;229482]условие запуска отделено, и отделено глубоко-глубоко в скрипт локомотива. В данном случае автомат отключает только возможность срабатывания кнопки. [QUOTE]
Зрозумів. Думав, що усе дещо простіше. [QUOTE=TRam_;229482]Краматорск [/QUOTE] 253км от меня)). Я с Марганца, Днепропетровская область. |
[QUOTE=TRam_;229482]automat1.GetValue()==0[QUOTE]
Стоп, стоп, стоп!! Почему ноль? Должно ж быть один! Тоесть он должен работать! И почему два знака уравнения!?? |
1) потому что на это условие вызывается return; - если автомат выключен (== 0), то прекратить выполнение функции
2) два знака уравнения ищи в описании C# или Java . Так как trainz script является калькой с Java. |
[QUOTE=TRam_;229604]1) потому что на это условие вызывается return; - если автомат выключен (== 0), то прекратить выполнение функции[/QUOTE]
А, а я то думал, зачем оно там)) [QUOTE=TRam_;229604]2) два знака уравнения ищи в описании C# или Java . Так как trainz script является калькой с Java.[/QUOTE] Вот, нашол: [/QUOTE]оператор == (два знака равенства) — это проверка на равенство двух выражений[/QUOTE] Тоесть, один знак равно-ето присвоение значения тегу/обьекту, а два знака равно- ето проверка равенства значений обьекта и числа которое стоит после знака. Верно? |
да, всё верно.
|
Вот ёсчё вопросик: как ввести в скрипт тег и переменную, значение которой етот тег будет изменять. И можно ли задать еффективность любому тегу, например Set(имя тега)Efficently= (значение, которое хотим задать).
P.S. Сорри за такое большое количество вопросов. |
нет, нельзя. Надо для этого поток делать. А в кабине - прописывать увеличение в функции Update
|
Тоесть вот так: thread void Set(имя тега)Efficently= (значение, которое хотим задать).
|
[QUOTE]Вот ёсчё вопросик: как ввести в скрипт тег и переменную, значение которой етот тег будет изменять.[/QUOTE] Пришел злой Комбайн.
1. В программировании нет понятия "тег", это не ЖЖ. 2. По программированию на GS, С и Яве, равно как и по программированию в целом существует полно макулатуры в интернетах [QUOTE]И можно ли задать еффективность любому тегу[/QUOTE] Любая программа имеет КПД=100%, т.к. является математической сущностью. [QUOTE]В функции обработки перемещения рычагов и кнопок пользователем void UserSetControl(CabinControl p_control, float p_value)[/QUOTE] Настоятельно не рекомендую использовать его, а проверять значение контрола непосредственно в месте его использования. Есть вероястность того, что между UserSetControl и использованием данные успеют устареть. А еще лучше завести некий монитор, который будет в каждом кадре (по Update()) проверять все контролы и производить соотв. изменения в данных. Так мы отделим модель от реализации, что хорошо. |
[QUOTE]Есть вероястность того, что между UserSetControl и использованием данные успеют устареть.[/QUOTE]в случае "событийной" модели данные не устаревают, т.к. обработчики сообщений срабатывают мгновенно. В данном случае какие бы события не происходили с кабиной 2ТЭ116 после нажатия кнопки запуска, если топливный насос включен, то дизель заведётся.
|
[QUOTE=Combine;229894]
2. По программированию на GS, С и Яве, равно как и по программированию в целом существует полно макулатуры в интернетах[/QUOTE] Понял, сваливаю..... [QUOTE=Combine;229894] Любая программа имеет КПД=100%, т.к. является математической сущностью..[/QUOTE] Я имел ввиду еффективность, с которой "тег" будет повышать/понижать значение некой переменной. |
в C# не бывает эффективности.
|
Как сделать так, чтобы через определённый промежуток времени к переменной прибавлялось некое число?Ничего лучше, чем вот ето
thread void MyFunction { int Voda_temper=0 Nagrevanie=Voda_temper+0.25 Sleep(10) } в голову не пришло. |
А лучше ничего и нет. Только у тебя в коде не хватает точек с запятой. И еще, не знаю, задумано ли так, но поток отработает один раз и закроется, так что Sleep тут не нужен, равно как и ключевое слово thread.
|
Но мне нужно, чтобы ето число прибавлялось постоянно до определённого лимита(условия)!
|
Может, циклом тогда?
|
int Voda_temper=0; //Глобальная
thread void MyFunction(void) { while(condition) //condition — условие, пока верно, цикл выполняется, если нет, выходим { Voda_temper=Voda_temper+0.25; Sleep(10); } } |
Пост ниже
|
[QUOTE=Combine;230911]
{ Voda_temper=Voda_temper+0.25; }[/QUOTE] Может, Nagrevanie=Voda_temper+0.25; Но всё равно. спасибо большое! |
Тогда тебе после этого действия придётся ещё приравнивать Voda_temper к Nagrevanie. Зачем тебе это? У тебя одна переменная изменяется в ходе цикла. Вторая не нужна.
|
Оффтоп: Трам читай личку!!!
|
Подскажите пожалуйста:
Как значение переменной int time=21.05 (время суток) присвоить двум переменным (часы и минуты) чтобы int Hours=21; int Mins=05; :o |
[QUOTE=GSTrainz;238481]int time=21.05[/QUOTE]
Как это?? о_0 Или уж float, или без дробной части. А вообще, Trainz для этих целей использует дробное значение от 0 до 1. И где-то в скриптах даже есть функции перевода. |
функции перевода из минут в аурановские единцы есть в скриптовых библиотеках раскачивания, в ТЭП10, новых локомотивах... Там используются минуты, т.е. 21.05 это 1265 минут.
|
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. Это не та переменная,что присутствует в фрагменте скрипта. |
Так...Ну с этой ерундой вроде разобрался (не знаю,правильно ли)
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; |
логически неверно. Ты скобки неверно поставил.
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)); } |
Спасибо.Теперь ошибка ушла.Но задачка все равно не решена.Получается,что пока поезд не наедет на "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) и остановился-вновь зазвучало сообщение информатора... |
[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] |
[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; } |
Спасибо,genesis!Спасибо TRam!Все заработало!
А можно ли это решение оформить как подпрограмму?Если да,то как это сделать?(ну,чтоб при каждом похожем случае не копипастить в текст программы одно и то-же,за исключением названия триггера) |
наверно как-то так...
[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), а потоки бы обрабатывались не последовательно, а параллельно - следуещее событие прицепки не ждало бы предыдущего) |
Если эта функция вызвана из потока, то проблем не будет.
|
Все ок,спасибо!
Новая задачка: в сценарии грузовые поезда создаются таким образом(упрощенно): 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