Форум Trainsim  

Вернуться   Форум Trainsim > Auran TrainZ > TrainZ - Звуки

Ответ
 
Опции темы Опции просмотра
Старый 03.02.2011, 17:02   #31
GSTrainz
Опытный
 
Регистрация: 14.09.2007
Сообщений: 110
Вы сказали Спасибо: 6
Поблагодарили 1 раз в 1 сообщении
GSTrainz стоит на развилке (репутация по умолчанию)
По умолчанию

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.
GSTrainz вне форума   Ответить с цитированием
Старый 01.01.2007, 12:00  
Яndex
Спонсор
 
 
Регистрация: 01.01.2007
Сообщения: 500


Реклама показывается изредка по случайному принципу
По умолчанию РЕКЛАМА

 
Старый 11.02.2011, 00:43   #32
GSTrainz
Опытный
 
Регистрация: 14.09.2007
Сообщений: 110
Вы сказали Спасибо: 6
Поблагодарили 1 раз в 1 сообщении
GSTrainz стоит на развилке (репутация по умолчанию)
По умолчанию

Так...Ну с этой ерундой вроде разобрался (не знаю,правильно ли)
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;
GSTrainz вне форума   Ответить с цитированием
Старый 11.02.2011, 12:23   #33
TRam_
Матёрый пользователь
 
Аватар для TRam_
 
Регистрация: 18.02.2008
Сообщений: 8,703
Вы сказали Спасибо: 1,424
Поблагодарили 2,365 раз(а) в 1,319 сообщениях
TRam_ стоит на развилке (репутация по умолчанию)
По умолчанию

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

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));
}
__________________
местный зомбяк
TRam_ вне форума   Ответить с цитированием
Этот пользователь сказал Спасибо TRam_ за это полезное сообщение:
Старый 11.02.2011, 14:44   #34
GSTrainz
Опытный
 
Регистрация: 14.09.2007
Сообщений: 110
Вы сказали Спасибо: 6
Поблагодарили 1 раз в 1 сообщении
GSTrainz стоит на развилке (репутация по умолчанию)
По умолчанию

Спасибо.Теперь ошибка ушла.Но задачка все равно не решена.Получается,что пока поезд не наедет на "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.
GSTrainz вне форума   Ответить с цитированием
Старый 11.02.2011, 20:30   #35
genesis
Матёрый пользователь
 
Регистрация: 31.07.2007
Адрес: Ульяновск
Сообщений: 2,570
Вы сказали Спасибо: 245
Поблагодарили 174 раз(а) в 76 сообщениях
genesis стоит на развилке (репутация по умолчанию)
Отправить сообщение для genesis с помощью ICQ Отправить сообщение для genesis с помощью Skype™
По умолчанию

Цитата:
Сообщение от GSTrainz Посмотреть сообщение
Задача:пасс из 5 вагонов прибывает на 1 путь.В хвост-прицепка 10 вагонов.Остановиться надо ближе к выходному светофору на триггере "TE2C"
Остановка раньше этого момента должна сопровождаться периодически повторяющимся сообщением информатора (у первой платформы протягивают пассажирский состав),чтобы подсказать игроку,что надо двигаться к светофору.
Код:
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 вне форума   Ответить с цитированием
Этот пользователь сказал Спасибо genesis за это полезное сообщение:
Старый 12.02.2011, 00:36   #36
TRam_
Матёрый пользователь
 
Аватар для TRam_
 
Регистрация: 18.02.2008
Сообщений: 8,703
Вы сказали Спасибо: 1,424
Поблагодарили 2,365 раз(а) в 1,319 сообщениях
TRam_ стоит на развилке (репутация по умолчанию)
По умолчанию

Цитата:
on "TimerTick", "":
{
while (train1.IsStopped())
World.Play2DSound(SCN_dir, "ob_na_vokz_118"+".mp3");
PostMessage(me, "TimerTick", "", Math.Rand(5.0, 10.0));
continue;
}
on "TimerTick", "":
{
if (train1.IsStopped())
World.Play2DSound(SCN_dir, "ob_na_vokz_118"+".mp3");
PostMessage(me, "TimerTick", "", Math.Rand(5.0, 10.0));
continue;
}
__________________
местный зомбяк
TRam_ вне форума   Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо TRam_ за это полезное сообщение:
Старый 12.02.2011, 02:50   #37
GSTrainz
Опытный
 
Регистрация: 14.09.2007
Сообщений: 110
Вы сказали Спасибо: 6
Поблагодарили 1 раз в 1 сообщении
GSTrainz стоит на развилке (репутация по умолчанию)
По умолчанию

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

Последний раз редактировалось GSTrainz; 12.02.2011 в 03:02.
GSTrainz вне форума   Ответить с цитированием
Старый 12.02.2011, 12:13   #38
TRam_
Матёрый пользователь
 
Аватар для TRam_
 
Регистрация: 18.02.2008
Сообщений: 8,703
Вы сказали Спасибо: 1,424
Поблагодарили 2,365 раз(а) в 1,319 сообщениях
TRam_ стоит на развилке (репутация по умолчанию)
По умолчанию

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



Код:
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);
}
правда не совсем уверен что заработает (wait() может потребовать наличие потока (т.е. не void WaitForTrain а thread void WaitForTrain), а потоки бы обрабатывались не последовательно, а параллельно - следуещее событие прицепки не ждало бы предыдущего)
__________________
местный зомбяк
TRam_ вне форума   Ответить с цитированием
Этот пользователь сказал Спасибо TRam_ за это полезное сообщение:
Старый 12.02.2011, 19:01   #39
genesis
Матёрый пользователь
 
Регистрация: 31.07.2007
Адрес: Ульяновск
Сообщений: 2,570
Вы сказали Спасибо: 245
Поблагодарили 174 раз(а) в 76 сообщениях
genesis стоит на развилке (репутация по умолчанию)
Отправить сообщение для genesis с помощью ICQ Отправить сообщение для genesis с помощью Skype™
По умолчанию

Если эта функция вызвана из потока, то проблем не будет.
genesis вне форума   Ответить с цитированием
Старый 13.02.2011, 20:57   #40
GSTrainz
Опытный
 
Регистрация: 14.09.2007
Сообщений: 110
Вы сказали Спасибо: 6
Поблагодарили 1 раз в 1 сообщении
GSTrainz стоит на развилке (репутация по умолчанию)
По умолчанию

Все ок,спасибо!
Новая задачка: в сценарии грузовые поезда создаются таким образом(упрощенно):
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 = платформа,то загрузить на этот вагон груз для платформы)Где вообще брать эти грузы?Их куиды то-же надо вносить в конфиг сценария?
GSTrainz вне форума   Ответить с цитированием
Старый 13.02.2011, 23:44   #41
kemal
Пользователь
 
Регистрация: 22.06.2007
Адрес: Казань
Сообщений: 37
Вы сказали Спасибо: 10
Поблагодарили 1 раз в 1 сообщении
kemal стоит на развилке (репутация по умолчанию)
Отправить сообщение для kemal с помощью ICQ
По умолчанию

Да, каждый груз - строчка в 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 вне форума   Ответить с цитированием
Этот пользователь сказал Спасибо kemal за это полезное сообщение:
Старый 14.02.2011, 23:53   #42
GSTrainz
Опытный
 
Регистрация: 14.09.2007
Сообщений: 110
Вы сказали Спасибо: 6
Поблагодарили 1 раз в 1 сообщении
GSTrainz стоит на развилке (репутация по умолчанию)
По умолчанию

kemal, а можно по-подробнее относительно этой строки:
Train2.GetFrontmostLocomotive().GetQueue("fuel").C reateProduct(World.FindAsset(self.LookupKUIDTable( "fuel")), 3000);
Что должно быть в "шапке" сценария,что бы компилятор на нее не ругался?
GSTrainz вне форума   Ответить с цитированием
Старый 15.02.2011, 00:10   #43
TRam_
Матёрый пользователь
 
Аватар для TRam_
 
Регистрация: 18.02.2008
Сообщений: 8,703
Вы сказали Спасибо: 1,424
Поблагодарили 2,365 раз(а) в 1,319 сообщениях
TRam_ стоит на развилке (репутация по умолчанию)
По умолчанию

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

Код:
Train2.GetFrontmostLocomotive().GetQueue("fuel").CreateProduct(World.FindAsset(Train2.GetFrontmostLocomotive().GetAsset().LookupKUIDTable( "fuel")), 3000);
__________________
местный зомбяк
TRam_ вне форума   Ответить с цитированием
Этот пользователь сказал Спасибо TRam_ за это полезное сообщение:
Старый 15.02.2011, 00:40   #44
kemal
Пользователь
 
Регистрация: 22.06.2007
Адрес: Казань
Сообщений: 37
Вы сказали Спасибо: 10
Поблагодарили 1 раз в 1 сообщении
kemal стоит на развилке (репутация по умолчанию)
Отправить сообщение для kemal с помощью ICQ
По умолчанию

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

Единственно, что тут можно добавить, так это то, что я обычно делаю глобальную переменную self типа Asset. Ну и строчку в Init:
self=GetAsset();
__________________
<kuid:216981:******>
kemal вне форума   Ответить с цитированием
Старый 15.02.2011, 18:24   #45
GSTrainz
Опытный
 
Регистрация: 14.09.2007
Сообщений: 110
Вы сказали Спасибо: 6
Поблагодарили 1 раз в 1 сообщении
GSTrainz стоит на развилке (репутация по умолчанию)
По умолчанию

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


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Регистрация на 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


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


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