Форум 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)

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 = платформа,то загрузить на этот вагон груз для платформы)Где вообще брать эти грузы?Их куиды то-же надо вносить в конфиг сценария?

kemal 13.02.2011 23:44

Да, каждый груз - строчка в kuid-table конфига.
В качестве примера как я создавал грузовой поезд и заправлял тепловоз:
[CODE]
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);[/CODE]

GSTrainz 14.02.2011 23:53

kemal, а можно по-подробнее относительно этой строки:
Train2.GetFrontmostLocomotive().GetQueue("fuel").CreateProduct(World.FindAsset(self.LookupKUIDTable("fuel")), 3000);
Что должно быть в "шапке" сценария,что бы компилятор на нее не ругался?

TRam_ 15.02.2011 00:10

вот так ничего не будет требовать

[CODE]Train2.GetFrontmostLocomotive().GetQueue("fuel").CreateProduct(World.FindAsset(Train2.GetFrontmostLocomotive().GetAsset().LookupKUIDTable( "fuel")), 3000);[/CODE]

kemal 15.02.2011 00:40

Вроде ведь проверял, всё правильно было. Откуда эти пробелы берутся??? Мистика...

Единственно, что тут можно добавить, так это то, что я обычно делаю глобальную переменную self типа Asset. Ну и строчку в Init:
self=GetAsset();

GSTrainz 15.02.2011 18:24

Понятно.Это относительно заправки локомотива.А вот что до назначения грузов вагону-так ничего не понятно...
Такая еще проблема возникла.Под состав осаживаются вагоны. Надо добавить звуки ,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 объекта(будь то триггер,светофор или деревянный настил)на рельсах.
В чем может быть проблема и как ее решить?


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

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