Информация: Уважаемые посетители! В течение нескольких месяцев на форуме существовала проблема с регистрацией новых пользователей, о которой администрации стало известно недавно. Если вы ранее пытались зарегистрироваться на форуме, но не получили на ваш e-mail письмо с ссылкой для подтверждения регистрации, просим вас зарегистрироваться повторно. Приносим извинения за доставленные неудобства. Если вы все еще испытываете проблемы с регистрацией на форуме, обратитесь за помощью на e-mail: mr.angelo@railroadsim.net

скрипт+сигналка

Обсуждение общих вопросов по игре

скрипт+сигналка

Сообщение oleg68 » 10.05.2008, 23:57

У меня есть задача: переключить в скрипте несколько стрелок, затем прочитать состояние светофора и, в зависимости от него, сделать то или иное действие.

Беда заключается в том, что сигналка срабатывает не сразу на переключение стрелок, а спустя какое-то время (это хорошо видно, если переключать стрелку руками). И если вызывать signal.GetSignalState() сразу же после переключения стрелок, то возвращается такое же состояние, какое было до переключения стрелок.

Как в скрипте дождаться срабатывания сигналки? Можно ли каким-нибудь вызовом заставить сигналку принудительно пересчитать состояние светофора?
Аватара пользователя
oleg68
 
Сообщения: 193
Зарегистрирован: 06.07.2007, 12:36
Откуда: Санкт-Петербург
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.

Re: скрипт+сигналка

Сообщение Combine » 11.05.2008, 12:30

Я думаю, для начала попробовать решить проблему "в лоб", поставить Sleep(0.3); например после перевода стрелки.
Аватара пользователя
Combine
 
Сообщения: 537
Зарегистрирован: 23.10.2006, 09:47
Откуда: Московская область
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
Играю в: Auran Trainz
Роль: Разработчик
Имя: Александр

Re: скрипт+сигналка

Сообщение varz » 11.05.2008, 22:18

повесь на сигнал хандлер AddHadler(сигнал,"Signals","StateChanged", твой_хандлер)

после этого в "твой_хандлер(Message msg)" получишь реальный ((cast<Signal>msg).major).GetSignalState()
***
в z7 можно все, в ТРС не все можно.
Аватара пользователя
varz
 
Сообщения: 907
Зарегистрирован: 03.02.2006, 22:23
Откуда: Липецк
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.

Re: скрипт+сигналка

Сообщение agmike » 12.05.2008, 08:07

varz писал(а): повесь на сигнал хандлер AddHadler(сигнал,"Signals","StateChanged", твой_хандлер)

после этого в "твой_хандлер(Message msg)" получишь реальный ((cast<Signal>msg.src).major).GetSignalState()

А так можно? В аурановских доках написано, что "твой_хандлер" будет вызывацца в "сигнале" и нигде больше.
The Cake is a Lie.
agmike
 
Сообщения: 1025
Зарегистрирован: 26.08.2006, 12:43
Благодарил (а): 0 раз.
Поблагодарили: 3 раз.
Играю в: Пульт ДНЦ

Re: скрипт+сигналка

Сообщение oleg68 » 12.05.2008, 09:33

varz писал(а): повесь на сигнал хандлер AddHadler(сигнал,"Signals","StateChanged", твой_хандлер)

после этого в "твой_хандлер(Message msg)" получишь реальный ((cast<Signal>msg).major).GetSignalState()

Вызовется ли этот handler, если сигнал так и остался красным?

Я хочу реализовать логику: переключили стрелки, смотрим на сигнал. Если он после срабатывания сигналки остался красным, то возвращаем стрелки на место, разблокируем и ждем 10 секунд, затем повторяем попытку. А если стал зеленым или желтым, то поехали. Удастся ли мне с помощью handler'а поймать, что сигналка сработала, но сигнал так и остался красным?
Аватара пользователя
oleg68
 
Сообщения: 193
Зарегистрирован: 06.07.2007, 12:36
Откуда: Санкт-Петербург
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.

Re: скрипт+сигналка

Сообщение varz » 12.05.2008, 19:34

agmike так можно. будет вызываться хандлер твоего скрипта при генерации Мессаги(SIgnal/StateChanged) конкретным сигналом, если подставить вместо "сигнал" свой объект, то будешь ловить Мессаги от ВСЕХ сигналов. Мессадж(Signal/StateChanged) - широковещательный (broadcast) и с ним меньше всего проблем.
Более того можно повесить свой хандлер на "приватные" мессаги типа Train/StoppedMoving - эта массага отправляется поездом самому-себе, но в z7 прекрасно отслеживается и обрабатывается. (обычные hooks в терминах ВинАПИ)

Внимание! конструкцией "wait() on" - приватные мессаги поймать невозможно!

oleg68 не совсем правильный алгоритм, но оптимальный подсказать сейчас не смогу. получается сложная схема с двумя хандлерами (для стрелок и для сигналов) и общим thread-арбитром, проверяющим "флаговые" переменные скрипта (1й флаг - переключение стрелки, 2й флаг - изменение состояния сигнала), да и еще не слабая таблица увязки сигналов и стрелок.
***
в z7 можно все, в ТРС не все можно.
Аватара пользователя
varz
 
Сообщения: 907
Зарегистрирован: 03.02.2006, 22:23
Откуда: Липецк
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.

Re: скрипт+сигналка

Сообщение oleg68 » 13.05.2008, 00:00

Combine писал(а): Я думаю, для начала попробовать решить проблему "в лоб", поставить Sleep(0.3); например после перевода стрелки.

А как мне найти GameObject, у которого вызвать Sleep?
Аватара пользователя
oleg68
 
Сообщения: 193
Зарегистрирован: 06.07.2007, 12:36
Откуда: Санкт-Петербург
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.

Re: скрипт+сигналка

Сообщение TRam_ » 13.05.2008, 01:25

не поверишь <ugagaga> - в config.txt <ugagaga> :lool: !!!!

в разделе mesh-table все "default", "kran1", и все остальные "меши" - и являются GameObject ами !!!

(не путать с эффектами, которые находятся внутри GameObject ов )!!!

А вообще Sleep() лучше вызывать у всего скрипта (точнее у всей процедуры обозванной "threat"- она при "сне" ресурсов не забирает, остальные функции работают, а эту пропускают, и остановлена она полностью) :vah:
в z7 всё можно, а что нельзя - можно в sU
Аватара пользователя
TRam_
 
Сообщения: 1925
Зарегистрирован: 30.11.2007, 20:14
Благодарил (а): 2 раз.
Поблагодарили: 66 раз.
Играю в: Auran Trainz
Роль: Разработчик
Имя: Владимир

Re: скрипт+сигналка

Сообщение agmike » 13.05.2008, 14:31

TRam_ писал(а):не поверишь  <ugagaga>  - в config.txt  <ugagaga>  :lool: !!!!

в разделе mesh-table все "default", "kran1", и все остальные "меши" - и являются GameObject ами !!!

(не путать с эффектами, которые находятся внутри GameObject ов )!!!

А вообще Sleep() лучше вызывать у всего скрипта (точнее у всей процедуры обозванной "threat"- она при "сне" ресурсов не забирает, остальные функции работают, а эту пропускают, и остановлена она полностью) :vah:

Объект скрипта - это весь ассетный объект. Если ассет вагон - то весь вагон, если сценарий - то сам сценарий. А меши никак не объекты скрипта, это то, чем он управляет
The Cake is a Lie.
agmike
 
Сообщения: 1025
Зарегистрирован: 26.08.2006, 12:43
Благодарил (а): 0 раз.
Поблагодарили: 3 раз.
Играю в: Пульт ДНЦ

Re: скрипт+сигналка

Сообщение varz » 13.05.2008, 18:57

не путайте понятия :botan:
скриптом можно условно обозвать файл с набором классов GameObject
в одном скрипте может быть одновременно и класс-вагона и класс-сигнала, но
ассетом обзаводиться только тот класс, на который ссылается конфиг!

к стати класс вагона (Vehicle) прямой потомок (в третьем поколении) класса Mesh, так что Vehicle является мешем :)

метод Sleep есть практически во всех классах, но работает он действительно только в thread-методах
***
в z7 можно все, в ТРС не все можно.
Аватара пользователя
varz
 
Сообщения: 907
Зарегистрирован: 03.02.2006, 22:23
Откуда: Липецк
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.

Re: скрипт+сигналка

Сообщение oleg68 » 13.05.2008, 22:21

Я - новичок в GSScript, поэтому ничего не понял. Непонятно, есть ли у меня thread-методы или нет.

Я пытаюсь запатчить стандартный PathLibrary, чтобы команда Path нормально работала с сигналкой (подробности: http://forum.railroadsim.net/index.php?showtopic=6906). Что у меня получилось: если все стрелки свободны, то они переводятся в нужное положение, затем через 10 секунд проверяется сигнал, если он красный, то стрелки возвращаются на место, дждем снова 10 секунд и все повторяется сначала. Глюка, описанного в той теме, больше не наблюдается. Интервал 10 секунд связан с тем, что вызов метода повешен на обработчик события "Timer", которое происходит раз в 10 секунд.

Но держать стрелки в неправильном положении 10 секунд - плохо, это мешает другим поездам. Хотелось бы держать их не 10, а 1 секунду (для срабатывании сигналки этого достаточно). Поэтому и хотел использовать Sleep. Но сам метод переключения стрелок вызывается из обработчика таймерного события (повторять попытки установить маршрут раз в 10 секунд). Можно ли в этом контексте вообще использовать Sleep, и, если можно, то от какого GameObject'а?
Аватара пользователя
oleg68
 
Сообщения: 193
Зарегистрирован: 06.07.2007, 12:36
Откуда: Санкт-Петербург
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.

Re: скрипт+сигналка

Сообщение agmike » 13.05.2008, 22:32

varz писал(а): к стати класс вагона (Vehicle) прямой потомок (в третьем поколении) класса Mesh, так что Vehicle является мешем :)

Имелся ввиду меш в mesh-table или я просто непонял.
И ышо я хотел бы посмотреть как вы внедрите в игру скрипт вне ассета, не вызывая его как раз оттуда :P

oleg68 Если метод вызывается хандлером, то он в своем потоке, а значит можно спать :) Просто в методе пеши sleep(скока надо)
The Cake is a Lie.
agmike
 
Сообщения: 1025
Зарегистрирован: 26.08.2006, 12:43
Благодарил (а): 0 раз.
Поблагодарили: 3 раз.
Играю в: Пульт ДНЦ

Re: скрипт+сигналка

Сообщение oleg68 » 13.05.2008, 23:24

agmike писал(а):
varz писал(а): к стати класс вагона (Vehicle) прямой потомок (в третьем поколении) класса Mesh, так что Vehicle является мешем :)

Имелся ввиду меш в mesh-table или я просто непонял.
И ышо я хотел бы посмотреть как вы внедрите в игру скрипт вне ассета, не вызывая его как раз оттуда :P

oleg68 Если метод вызывается хандлером, то он в своем потоке, а значит можно спать :) Просто в методе пеши sleep(скока надо)

Написал sleep(1); Результат - trainz падает. Если комментирую эту строчку, то работает (но без паузы).

Вот - фрагмент кода класса Path:

public void lock_path(ExtPermit blocking_permit)
{
int i;

...

// set junctions
for(i=0;i<vNumJunctions;i++)
vJunctions[i].get_junction().SetDirection(vDirs[i]); // existence is checked above

/* oleg68: это - работало, но check_path() вызывался через 10 секунд по таймеру. Хочется пораньше.
JunctionsSet_action action=new JunctionsSet_action();
action.init(me);
add_action(action);
*/


sleep(1); // с этой строчкой - все падает. Если ее закомментировать, то check_path вызывается без паузы, но trainz не падает.
check_path();
}


Все-таки sleep(1) или Sleep(1)? Это - метод или глобальная функция? Если метод, то от какого объекта вызывать?
Аватара пользователя
oleg68
 
Сообщения: 193
Зарегистрирован: 06.07.2007, 12:36
Откуда: Санкт-Петербург
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.

Re: скрипт+сигналка

Сообщение TRam_ » 14.05.2008, 01:47

Именно с большой буквы:
Код: Выделить всё
Sleep(1);
- GS -всё-таки наследник СИ, разлечаюшего "заглавность" букв. Не забудь Trainz API посмотреть - там большинство справок присутствует...
можешь считать, что это глобальная функция, имеющая одноимённый метод (т.е. относится ко всей части скрипта, но если надо - то и к его объекту).
в z7 всё можно, а что нельзя - можно в sU
Аватара пользователя
TRam_
 
Сообщения: 1925
Зарегистрирован: 30.11.2007, 20:14
Благодарил (а): 2 раз.
Поблагодарили: 66 раз.
Играю в: Auran Trainz
Роль: Разработчик
Имя: Владимир

Re: скрипт+сигналка

Сообщение agmike » 14.05.2008, 13:51

oleg68 Не забудь, sleep должен вызыватся только в отдельном потоке
Важно! sleep - это метод в GameObject, то есть класс Path должен GameObject наследовать
The Cake is a Lie.
agmike
 
Сообщения: 1025
Зарегистрирован: 26.08.2006, 12:43
Благодарил (а): 0 раз.
Поблагодарили: 3 раз.
Играю в: Пульт ДНЦ

След.

Вернуться в [TZ] Об игре

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3