Этот пользователь сказал Спасибо TRam_ за это полезное сообщение: |
|
Сайт | ПРАВИЛА ФОРУМА | FAQ | Регистрация | Справка | Пользователи | Социальные группы | Календарь | Поиск | Сообщения за день | Все разделы прочитаны |
|
Опции темы | Опции просмотра |
03.02.2011, 17:02 | #31 |
Опытный
Регистрация: 14.09.2007
Сообщений: 110
Вы сказали Спасибо: 6
Поблагодарили 1 раз в 1 сообщении
|
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; 03.02.2011 в 17:04. |
01.01.2007, 12:00 | |
Яndex
Спонсор
Регистрация: 01.01.2007
Сообщения: 500
Реклама показывается изредка по случайному принципу |
РЕКЛАМА
|
11.02.2011, 00:43 | #32 |
Опытный
Регистрация: 14.09.2007
Сообщений: 110
Вы сказали Спасибо: 6
Поблагодарили 1 раз в 1 сообщении
|
Так...Ну с этой ерундой вроде разобрался (не знаю,правильно ли)
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.TRIGG ER_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; |
11.02.2011, 12:23 | #33 |
Матёрый пользователь
Регистрация: 18.02.2008
Сообщений: 8,728
Вы сказали Спасибо: 1,426
Поблагодарили 2,388 раз(а) в 1,339 сообщениях
|
логически неверно. Ты скобки неверно поставил.
int n=0; while(n<2) { while (train1.IsStopped()==false) {if ( Navigate.OnTrigger(me,train1,"TE2C",Navigate.TRIGG ER_ENTER)) n=3;if (n==1) Sleep (World.Play2DSound(SCN_dir, "ob_na_vokz_118"+".mp3"));Sleep (Math.Rand(5,10)); }
__________________
местный зомбяк |
Этот пользователь сказал Спасибо TRam_ за это полезное сообщение: |
11.02.2011, 14:44 | #34 |
Опытный
Регистрация: 14.09.2007
Сообщений: 110
Вы сказали Спасибо: 6
Поблагодарили 1 раз в 1 сообщении
|
Спасибо.Теперь ошибка ушла.Но задачка все равно не решена.Получается,что пока поезд не наедет на "TE2C"-ничего не происходит сколько не останавливайся.А потом,при наезде на триггер сразу идет продолжение программы.Попробовал по другому:поставил триггер "TE1C" с зоной действия на участке,где останавливаться рано.
while(n<2) { while (train1.IsStopped()==false) { n=1; Sleep (Math.Rand(2,5)); } if ( Navigate.OnTrigger(me,train1,"TE1C",Navigate.TRIGG ER_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) и остановился-вновь зазвучало сообщение информатора... Последний раз редактировалось GSTrainz; 11.02.2011 в 14:46. |
11.02.2011, 20:30 | #35 | |
Матёрый пользователь
|
Цитата:
Код:
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); Последний раз редактировалось genesis; 11.02.2011 в 20:33. |
|
Этот пользователь сказал Спасибо genesis за это полезное сообщение: |
12.02.2011, 00:36 | #36 | |
Матёрый пользователь
Регистрация: 18.02.2008
Сообщений: 8,728
Вы сказали Спасибо: 1,426
Поблагодарили 2,388 раз(а) в 1,339 сообщениях
|
Цитата:
{ if (train1.IsStopped()) World.Play2DSound(SCN_dir, "ob_na_vokz_118"+".mp3"); PostMessage(me, "TimerTick", "", Math.Rand(5.0, 10.0)); continue; }
__________________
местный зомбяк |
|
12.02.2011, 02:50 | #37 |
Опытный
Регистрация: 14.09.2007
Сообщений: 110
Вы сказали Спасибо: 6
Поблагодарили 1 раз в 1 сообщении
|
Спасибо,genesis!Спасибо TRam!Все заработало!
А можно ли это решение оформить как подпрограмму?Если да,то как это сделать?(ну,чтоб при каждом похожем случае не копипастить в текст программы одно и то-же,за исключением названия триггера) Последний раз редактировалось GSTrainz; 12.02.2011 в 03:02. |
12.02.2011, 12:13 | #38 |
Матёрый пользователь
Регистрация: 18.02.2008
Сообщений: 8,728
Вы сказали Спасибо: 1,426
Поблагодарили 2,388 раз(а) в 1,339 сообщениях
|
наверно как-то так...
Код:
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); }
__________________
местный зомбяк |
Этот пользователь сказал Спасибо TRam_ за это полезное сообщение: |
12.02.2011, 19:01 | #39 |
Матёрый пользователь
|
Если эта функция вызвана из потока, то проблем не будет.
|
13.02.2011, 20:57 | #40 |
Опытный
Регистрация: 14.09.2007
Сообщений: 110
Вы сказали Спасибо: 6
Поблагодарили 1 раз в 1 сообщении
|
Все ок,спасибо!
Новая задачка: в сценарии грузовые поезда создаются таким образом(упрощенно): 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 = платформа,то загрузить на этот вагон груз для платформы)Где вообще брать эти грузы?Их куиды то-же надо вносить в конфиг сценария? |
13.02.2011, 23:44 | #41 |
Пользователь
|
Да, каждый груз - строчка в kuid-table конфига.
В качестве примера как я создавал грузовой поезд и заправлял тепловоз: Код:
kuids=new KUID[0]; kuids[0]=self.LookupKUIDTable("2te116"); k=new KUID[0]; for(i=0;i<3;i++)k[i]=self.LookupKUIDTable("tank"+i); for(i=1;i<6;i++)kuids[i]=k[Math.Rand(0,2)]; Train2=World.CreateTrain(kuids,"c_4ch",true); for(i=1;i<6;i++)if(Math.Rand(0,1))Train2.GetVehicles()[i].Reverse(); Train2.GetFrontmostLocomotive().GetQueue("fuel").CreateProduct(World.FindAsset(self.LookupKUIDTable("fuel")), 3000); d=World.AddDriverCharacter(World.FindAsset(self.LookupKUIDTable("driver2"))); d.SetLocation(Train2.GetFrontmostLocomotive()); d.SetLocalisedName("Driver2"); Train2.SetTrainPriorityNumber(2);
__________________
<kuid:216981:******> |
Этот пользователь сказал Спасибо kemal за это полезное сообщение: |
14.02.2011, 23:53 | #42 |
Опытный
Регистрация: 14.09.2007
Сообщений: 110
Вы сказали Спасибо: 6
Поблагодарили 1 раз в 1 сообщении
|
kemal, а можно по-подробнее относительно этой строки:
Train2.GetFrontmostLocomotive().GetQueue("fuel").C reateProduct(World.FindAsset(self.LookupKUIDTable( "fuel")), 3000); Что должно быть в "шапке" сценария,что бы компилятор на нее не ругался? |
15.02.2011, 00:10 | #43 |
Матёрый пользователь
Регистрация: 18.02.2008
Сообщений: 8,728
Вы сказали Спасибо: 1,426
Поблагодарили 2,388 раз(а) в 1,339 сообщениях
|
вот так ничего не будет требовать
Код:
Train2.GetFrontmostLocomotive().GetQueue("fuel").CreateProduct(World.FindAsset(Train2.GetFrontmostLocomotive().GetAsset().LookupKUIDTable( "fuel")), 3000);
__________________
местный зомбяк |
Этот пользователь сказал Спасибо TRam_ за это полезное сообщение: |
15.02.2011, 00:40 | #44 |
Пользователь
|
Вроде ведь проверял, всё правильно было. Откуда эти пробелы берутся??? Мистика...
Единственно, что тут можно добавить, так это то, что я обычно делаю глобальную переменную self типа Asset. Ну и строчку в Init: self=GetAsset();
__________________
<kuid:216981:******> |
15.02.2011, 18:24 | #45 |
Опытный
Регистрация: 14.09.2007
Сообщений: 110
Вы сказали Спасибо: 6
Поблагодарили 1 раз в 1 сообщении
|
Понятно.Это относительно заправки локомотива.А вот что до назначения грузов вагону-так ничего не понятно...
Такая еще проблема возникла.Под состав осаживаются вагоны. Надо добавить звуки ,cогласно регламенту переговоров составителя с машинистом. на расстоянии между составами примерно 250м ( "места на 10 вагонов") на расстоянии 125м - "места на 5 вагонов,тише") на расстоянии 3м-"остановка" Осаживаемый состав-train1.Состав,к которому прицепка-train2. bool a=false; Vehicle one2; one2=train2.GetVehicles()[0]; while(!(a)) a=train1.TracksideIsInFront(one2,250),Sleep(1); a=false; World.Play2DSound(SCN_dir, "m_na_10_vag"+".mp3");//10 вагонов while(!(a)) a=train1.TracksideIsInFront(one2,125),Sleep(1); a=false; World.Play2DSound(SCN_dir, "m_na_5_vag"+".mp3");//5 вагонов while(!(a)) a=train1.TracksideIsInFront(one2,3),Sleep(1); a=false; World.Play2DSound(SCN_dir, "ostanovka"+".mp3");//остановка На тестовой карте все идеально работает,но вот на основной...Расстояние измеряется до первого от train2 Track объекта(будь то триггер,светофор или деревянный настил)на рельсах. В чем может быть проблема и как ее решить? |
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1) | |
Опции темы | |
Опции просмотра | |
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Регистрация на AURAN | ALFMASTER | TrainZ — Об игре | 32 | 31.08.2012 21:12 |
Помогите разобраться с правилами с сайта Auran! | NickLon | TrainZ - Маршруты и сценарии | 4 | 25.12.2008 04:20 |
Как заполучить оригинальный диск с сайта Auran? | VicNik | TrainZ — Об игре | 2 | 17.03.2008 16:19 |
О стрелках в TrainZ Auran | Диспетчер-регулятор | TrainZ — Об игре | 2 | 10.07.2007 21:26 |
Что это? |