Вход

Просмотр полной версии : Вопросы по Auran GameScript


Prince
03.01.2011, 19:39
Ну, раз на Трейнзапе есть такая тема(кста, ето я ёё там создал: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".

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);
}
а именно automat1.GetValue()==0

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

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

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

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

TRam_
03.01.2011, 22:05
А вы с какого города?Краматорск, Донецкой области.

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

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


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

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
1) потому что на это условие вызывается return; - если автомат выключен (== 0), то прекратить выполнение функции
А, а я то думал, зачем оно там))

2) два знака уравнения ищи в описании C# или Java . Так как trainz script является калькой с Java.

Вот, нашол:

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

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

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

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

Prince
05.01.2011, 14:52
2. По программированию на GS, С и Яве, равно как и по программированию в целом существует полно макулатуры в интернетах

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


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

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

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
{
Voda_temper=Voda_temper+0.25;
}

Может, 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
int time=21.05

Как это?? о_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)
{
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));
}

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
Задача:пасс из 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);

TRam_
12.02.2011, 00:36
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;
}

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

TRam_
12.02.2011, 12:13
наверно как-то так...



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), а потоки бы обрабатывались не последовательно, а параллельно - следуещее событие прицепки не ждало бы предыдущего)

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 конфига.
В качестве примера как я создавал грузовой поезд и заправлял тепловоз:

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.LookupKUIDTab le("fuel")), 3000);
d=World.AddDriverCharacter(World.FindAsset(self.Lo okupKUIDTable("driver2")));
d.SetLocation(Train2.GetFrontmostLocomotive());
d.SetLocalisedName("Driver2");
Train2.SetTrainPriorityNumber(2);

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

TRam_
15.02.2011, 00:10
вот так ничего не будет требовать

Train2.GetFrontmostLocomotive().GetQueue("fuel").CreateProduct(World.FindAsset(Train2.GetFrontmos tLocomotive().GetAsset().LookupKUIDTable( "fuel")), 3000);

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

GSTrainz
15.02.2011, 20:24
Нашел ,почему на тестовой и основной карте по разному получается.
На тестовой первый вагон train2 обращен к train1.На основной-последний.
Создал на тестовой карте train2 хвостом к train1 - вообще все 3 проверки расстояния выполнились сразу (a==true в этом случае получается всегда)
Пробовал от последнего вагона train2 измерять расстояние
( one2=train2.GetVehicles()[4];// 5 вагон состава из 5 вагонов) и все равно a==true получается всегда.
train2.Turnaround(); тоже ничего не дало...
А вот когда ставишь на рельсы между составами какой-нибудь Track объект,расстояние измеряется до него(как и на основной карте).

TRam_
15.02.2011, 20:29
train2.Turnaround(); тоже ничего не дало...если сидишь в кабине и лок однокабинный, то оно ничего не даст. Только если снаружи сидеть либо лок типа ЧМЭ3 нового.

GSTrainz
15.02.2011, 20:38
Да в составe train2 вообще нет локомотива.Просто хотел его логически развернуть,что бы последний вагон стал первым.

GSTrainz
16.02.2011, 02:16
Короче,может кому пригодится:методом "научного тыка" проблему решил.
train2.Turnaround();
one2=train2.GetVehicles()[1];
и дальше,ко всем измеряемым расстояниям,надо прибавлять длину 1 пассажирского (в данном случае) вагона ( + 23 )
Нулевой вагон почему-то не работает.

Combine
17.02.2011, 12:16
и дальше,ко всем измеряемым расстояниям,надо прибавлять длину 1 пассажирского (в данном случае) вагона ( + 23 ) Не длину вагона, а половины длин вагонов составов. Расстояние измеряется между геометрическими центрами (0,0,0 моделей вагонов).

GSTrainz
19.02.2011, 21:42
Combine,да нет.В этом случае-расстояние как раз-таки до сцепки Vehicles()[1](Vehicles()[0] почему-то в упор не видит).Поэтому надо плюсовать длину невидимого для команды вагона.Получается,что Turnaround() логически разворачивает состав,но не вагон в нем.И нулевой вагон является тем последним триггером перед составом.
У меня сейчас такая проблема возникла:наконец дошло до меня,что в kuid-table сценария не обязательно ставить вагоны.Можно указывать куид состава(который создается в редакторе сессии) и из kuid-table этого состава брать вагоны в сценарий.
Но...Создал я составы из одинаковых по типу вагонов(платформы-один состав,полувагоны-другой и т.д.) и настроил сценарий так,что бы эти вагоны из составов создавались в сценарии.Все отлично.Все работает.Но...Для чего я это все делал?Для того,что бы каждый желающий мог поставить в составы свои вагоны.Для этого я создал составы из 30 одинаковых по типу вагонов(думал,что и в kuid-table этих составов будет по 30 вагонов)Но такой обломс.В kuid-table состава-всего один куид(куид-то у всех 30 вагонов одинаковый...)И менять вагоны в составе невозможно(чтоб при выходе эти изменения сохранялись).И что делать...

Добрый
10.08.2011, 10:34
Неожиданно столкнулся с такой проблемой - заполнение массива. В Java это выглядит так: int [] st; st= new int []{1,2,3,4,5};
Однако в трайнзе int [] st; компилятор пропускает, а вот st= new int []{1,2,3,4,5}; - нет. Если заполнять ячейки по одной st [0] = 1; то работает, а сразу все - ругается. Не могу понять, какие знаки препинания тут требуются.:confused:

TRam_
10.08.2011, 10:44
Не могу понять, какие знаки препинания тут требуются.просто трейнз не поддерживает всего того синтаксиса, который реализуется в Си. Потому заполнять надо только по 1 элементу.Вообще надо так:

int[] st= new int [5];

st[0]=1;
st[1]=2;
st[2]=3;
st[3]=4;
st[4]=5;

genesis
10.08.2011, 15:15
public int[] NewIntArray(string numbers)
{
string[] tokens = Str.Tokens(numbers, ",");
int[] ret = new int[tokens.size()];
int i;
for (i = 0; i < tokens.size(); ++i)
ret[i] = Str.ToInt(tokens[i]);
return ret;
}
int[] st = NewIntArray("1,2,3,4,5");
Си, джава, шарп, GS похожи, но не перестают от этого быть разными языками.

Добрый
11.08.2011, 12:50
Вот спасибо! А то я не мог понять, как упростить ввод данных:drinks:
И ещё один глупый вопрос - можно ли в трайнзе создавать массивы программно, т. е. название массива не прописывается в ручную, а задаётся переменной? Интуитивно понимаю, что нет, но знаний маловато:o

TRam_
11.08.2011, 13:34
Делать массив объектов, содержащих массивы. Обычные двумерные массивы трейнз не поддерживает.

Добрый
11.08.2011, 14:05
Нет, такое решение мне не подходит. Вот я знаю, что можно выяснить длину массива, скажем, так: int аа = а.size(). А как можно выяснить название массива? Есть формула?

TRam_
11.08.2011, 15:31
Нет, название ты вычислить не можешь.

В крайнем случае объяви объект

class NamedArray
{
public string name;
public int[] arr;
};

организуй массив таких объектов

NamedArray[] main_arrays=new NamedArray[5];
for(i=0;i<5;i++)
{
main_arrays[i]=new NamedArray();
main_arrays[i].arr=new int[10];
}

и затем именуешь

main_arrays[0].name="hren1";
main_arrays[2].name="korova";


и затем в коде, когда тебе понадобится массив с нужным именем, делай перебор

int i=0;
int j=-1;
while(i<main_arrays.size() and j<0)
{
if(main_arrays[i].name=="dispetcher")
j=i;

i++
}

if(j>=0)
{
next_array=main_arrays[j].arr;
}

Добрый
12.08.2011, 16:45
Вот Combine посоветовал не использовать goto в скрипте, ибо вызывает ошибки. Посоветуйте, как более корректно осуществлять переход от одной строки к другой, если речь не идёт о выходе из цикла. С выходом из цикла вопросов нет.

genesis
12.08.2011, 19:51
Безусловный переход от одной строки другой уже некорректен и свидетельствует о неверном подходе к решению задачи. Гоуту лишь следствие.
Расскажи, в чем проблема.

Добрый
12.08.2011, 21:16
Проблем нет - всё работает. Просто долгое время в трайнзе существовала проблема открытия светофора на путь, который хоть и свободен, но на него уже собран встречный маршрут. Трёхдневный мозговой штурм позволил найти некое решение. Теперь жду varza, когда у него появится время заняться z7, возможно эта схема будет реализована. Может, кто-то уже давно решил эту проблему, но самому тоже приятно мозгами пораскинуть.
Единственное, что волнует - это goto, к которой я привык ещё лет 20 назад, программируя на дедуле (теперь уже) Бейсике.
Если использовать различные функции - конечно, она не требуется, но я имею дело с одной. Давно думал поработать с thread. Программа исполняется не последовательно, а имеет блоки, обрабатывающие данные. Даже если их написать последовательно, всё равно в какой-то момент необходимо передать управление предыдущему или перескочить через несколько.:o

Combine
13.08.2011, 02:47
Единственное, что волнует - это goto, к которой я привык ещё лет 20 назад, программируя на дедуле (теперь уже) Бейсике. Студентов, ранее изучавших Бейсик, практически невозможно обучить хорошему программированию. Как потенциальные программисты они подверглись необратимой умственной деградации. © Эдсгер Вибе Дейкстра :)

Добрый
13.08.2011, 08:36
Согласен с критикой;) На ночь глядя пересмотрев скрипт понял, что вполне можно обойтись без нескольких блоков, оставить один, который варианты работы будет выбирать через банальное if.
P.S. Эх, поздно мне быть студентом...

Добрый
22.08.2011, 10:21
Нигде не смог найти пример работы public bool Train.IsStillInJunction ( JunctionBase jn ). Насколько понимаю, эта функция возвращает true, если определённый поезд проследовал определённую стрелку. Не соображу, что писать в скобках. Просто название стрелки, в том числе в кавычках, выдаёт ошибку. Кто-нибудь в курсе, что с этим делать?

TRam_
22.08.2011, 10:56
эта функция возвращает true, если определённый поезд проследовал определённую стрелкунет, она возращает true, если поезд в зоне действия стрелки
Просто название стрелки, в том числе в кавычках, выдаёт ошибку.надо не имя, а объект стрелки. Например так

bool is_on_junction=train12.IsStillInJunction( cast<JunctionBase>Router.GetGameObject("Junction 12") );