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

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

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

[QUOTE]train2.Turnaround(); тоже ничего не дало...[/QUOTE]если сидишь в кабине и лок однокабинный, то оно ничего не даст. Только если снаружи сидеть либо лок типа ЧМЭ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

[QUOTE]и дальше,ко всем измеряемым расстояниям,надо прибавлять длину 1 пассажирского (в данном случае) вагона ( + 23 )[/QUOTE] Не длину вагона, а половины длин вагонов составов. Расстояние измеряется между геометрическими центрами (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

[QUOTE]Не могу понять, какие знаки препинания тут требуются.[/QUOTE]просто трейнз не поддерживает всего того синтаксиса, который реализуется в Си. Потому заполнять надо только по 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

[code]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;
}[/code]
[code]int[] st = NewIntArray("1,2,3,4,5");[/code]
Си, джава, шарп, 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

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

Добрый 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

[QUOTE]эта функция возвращает true, если определённый поезд проследовал определённую стрелку[/QUOTE]нет, она возращает true, если поезд в зоне действия стрелки
[QUOTE] Просто название стрелки, в том числе в кавычках, выдаёт ошибку.[/QUOTE]надо не имя, а объект стрелки. Например так

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


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

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