Форум Trainsim  

Вернуться   Форум Trainsim > Auran TrainZ > TrainZ — Об игре

Ответ
 
Опции темы Опции просмотра
Старый 07.08.2009, 14:42   #1
TRam_
Матёрый пользователь
 
Аватар для TRam_
 
Регистрация: 18.02.2008
Сообщений: 8,703
Вы сказали Спасибо: 1,424
Поблагодарили 2,365 раз(а) в 1,319 сообщениях
TRam_ стоит на развилке (репутация по умолчанию)
По умолчанию Система сообщений

Сделал перевод статьи о message'ах с http://www.trainzdev.com/components/...sage_Reference

Можно будет включить её в мануалы, но охота получить рецензию от varz'a, нашего самого самого первого скриптёра...


Код:
TrainzScript Message Reference - документация по системе сообщений в trainz

Описание TrainzScript Message Reference

1)Что такое сообщения сообщения и для чего они используются
2) Как принимать сообщения
3)Когда и как посылать сообщения
4)Как не принимать ничего
5)Пример
6) кроме того...

Что такое сообщения сообщения и для чего они используются


Сообщения

являются внутернними связями между объектами в trainz
полностью скрыты от обычного пользователя, который и не догадается об их существовании
обеспечивают уведомления о событиях в мире trainz
позволяют открытия прямых каналов взаимодействия между объектами
позволяют отправку инстукций от одного скрипта к другому
позволяют создание временной задержки скриптованных действий

Сообщения управляются Router'ом(Маршрутизатором), своего рода внутренним 
почтовым отделением, и могут быть обменены между любыми объектами, 
которые являются наследниками класса GameObject, 
включая driver commands, rules и libraries, а так же как почти все скритптуемые объекты, 
основанные на мешах.

Скрипты могут:

получать сообщения и использовать их для осуществления соответствующих
действий в соответствии с событиями и инструкциями.
использовать сообщение для получения информации о объекте, пославшем либо
отправившим это сообщение
задавать и отправлять свои собственные сообщения
подслушивать сообщения, отправляемые к другим объектам
отправлять сообщения самим себе, которые вернутся через заданный промежуток
времени, как "напоминание" сделать что-то

Сообщения являются малыми по размеру объектами, содержащими всего 4 поля информации
msg.major:  тип string (строка), называющая тип сообщения
msg.minor: тип string (строка) содержащая подтип сообщения или в некоторых случаях дополнительную информацию.
(дополнительную информацию можно помещать в оба эти поля, но отличать 
такие сообщения будет очень тяжело) 
msg.src: объект, пославший это сообщение (он не является из какого-нибудь специального типа,
хотя класс его типа является наследником класса GameObject. Используйте cast<  > 
для преобразования типа)
msg.dst: объект - получатель сообщения.
Некторые сообщения являются broadcast ("по радио"), т.е. отправлятся всем инициализироанным объектам мира, 
в этом случае msg.dst будет null . ( null - идентификатор неинициализированного объекта)

Как принимать сообщения

Существует три метода, которые Вы можете использовать
1) AddHandler() ("добавить обработчик"). Это простейший принимающий "прибор" наиболее удобен, 
когда Вам всегда требуются сообщения определённого типа. 
AddHandler() ("добавление обработчика") обычно осуществляется в функции Init() скрипта.

2) цикл wait() . Он должен находиться в отдельном thread (потоке) и обеспечивает временную договорённость 
в которой Вы хотите знать о сообщениях только за некоторый короткий период или при определённых условиях.
(Выход из цикла обеспечивает команды break и goto)

3) Sniff() . Позволяет Вам перенаправить сообщения, принимаемые одним объектом, другому объекту.

(Замечания. 
Если Вы получаете инструкции в msg.minor, то аргументами "string minor"
этих функций должны быть пустые строки, а именно "" .
Хотя msg.minor имеет тип string, перед её обработкой для определения инструкций 
желательно дополнительно явно преобразовать её тип в string, а именно
(string)msg.minor  )

Когда и как посылать сообщения

Вы могли бы производить отправку ваших собственных сообщений при следующих обстоятельствах: 

Когда произошло некое событие в Вашем скрипте,а другие объекты, возможно, должны об этом знать. 
Когда Вы хотите сделать свой объект доступным для других скриптов, чтобы позволить им вызывать 
Ваши публичные функции. 

Когда Вам надо отправить инструкции к другому объекту чтобы выполнить специфическую задачу, 
и Вы знаете, что объект-получатель будет способен принять Ваше сообщение. 

Когда Вы хотите, чтобы Ваш собственный скрипт произвёл действие через заданное время в будущем, 
либо производил действие периодически, через заданные интервалы времени. 

Есть три функции, которые Вы можете использовать, чтобы отсылать сообщения: 
SendMessage () немедленно посылает сообщение. (Корректно работет только с объектами класса ScenarioBehavior) 
PostMessage() посылает сообщение через Router с указанной задержкой (который может быть и нулем). 
Сообщение будет выполнено на следующем обновлении Router'а. 
Router.PostMessage() позволяет сообщениям быть посланными, даже если у объекта, которые Вы скриптуете, 
нет своих собственных передающих способностей (либо Вам требуется послать сообщение с ложным msg.src). 

Если объект-получатель сообщения будет введён как me (идентификатор текущего объекта), то сообщение пошлют 
в объект, которому принадлежит этот скрипт. Если объект-получатель будет null или "" (пустая строка), то сообщение будет 
broadcast и поэтому доступное для любого объекта сессии. 

Отправка сообщения вызывает следующее: 
Любое остановленные потоки(thread'ы), ждущие сообщения,возобновятся, хотя кодовое выполнение не начнётся до перехода на этот поток . 
Любые объекты с handler'ами (обработчиками) немедленно выполнят свои handler'ы (handler'ы не являются потоками). 
Любые встоенные handler'ы (в т.ч. код pfx) будут выполнены немедленно. 

Если у Вас есть ссылка на объект-получатель (или если Вы знаете его имя или id), Вы должны знать следующее: 

Если Вы знаете, какие публичные функции имеются у другого скрипта, то вызов этих функций непосредственно будет более подходящим. 
Вы должны всегда избегать broadcast ("радиовещательных") сообщений, если возможно послать их непосредственно объекту-получателю. 

Никогда Ничего Не Принимайте

Передающая система содержит много ловушек для неосторожного. Если Вы будете работать со стрелкой например, то Вы будете получать сообщение Object,Enter всякий раз, когда поезд входит в зону Вашего trigger'a. 
Небезопасно однако предположить, что последующее Object,Leave означает, что поезд пересек стрелку и уехал с другой стороны. Любое из следующего также произвело бы Object,Leave: 

Поезд мог остановиться и изменить направление движения над Вашим объектом. 
Стрелка могла быть переведена так, чтобы поезд больше не был видим к Вашему объекту. 
Поезд сцепился с другим (и поэтому прекратил существование), прежде, чем достигнуть Вашего объекта. 

Обычно необходимо рассматривать сообщение как признак, что событие, которым Вы интересуетесь, уже случилось, 
и использовать другие способы, чтобы проверить достоверность завершения события. (хотя сообщение может нести и всю информацию о событии)

Пример

Получение сообщений и использование обработчиков сообщений (handler'ов)
include "MapObject.gs"

// скрипт можно поставить на любой объект  "scenery"

// позволить выводить сообщения в окно вывода в режиме Машинист
class Messenger isclass MapObject {

   public void Init(void) {
      inherited(); 
      // получаем сообщения от стрелки и сообщения  World,ModuleInit 
      AddHandler(me,"Junction","","ToggleHandler");
      AddHandler(me,"World","ModuleInit","ModuleInitHandler");
   }

   thread void TriggerMonitor(void) {
      //сообщения от trigger'ов будуть приходить к нам в результате вызова 
      //функции Sniff()  в  ModuleInitHandler
      Message msg;
      wait() {
         //ждём сообщений Trigger,Enter, печатаем сообщение в окно вывода,
         //когда принимаем,  затем продолжаем ждать
         on "Trigger","Enter",msg: {
            Interface.Print("A train has entered a trigger"); // "поезд наехал на trigger" 
            continue;
         }
         // ждём Trigger,Stopped, печатаем сообщение в окно, когда это случится и 
         //затем выходим из потока (quit the thread)

         on "Trigger","Stopped",msg: {
            Interface.Print("A train has stopped on a trigger"); //"поезд остановился над триггером"
            Interface.Print("Trigger monitoring discontinued"); //"прекращаем наблюдение за триггером"
            break;
         }
      }
   }

   void ToggleHandler(Message msg) {
      //печатаем сообщение, если принятое сообщение Junction,Toggled является  broadcast

      Interface.Print("A junction has been toggled"); // "стрелку перевели"
   }

   void ModuleInitHandler(Message msg) {
      if (World.GetCurrentModule() == World.DRIVER_MODULE) {

         // устанавливаем handler (j,hf,jnxbr) на первый поезд карты для того,
         // чтобы он передавал все сообщения о триггерах у нам
         Sniff(World.GetTrainList()[0],"Trigger","",true);
         // начинаем следить за сообщениями с msg.major== "Trigger" 
         TriggerMonitor();
      }
   }

};


кроме того
List of Standard Messages 
Animation-Event Message 
Browser Messages 
Camera Messages 
Interface Messages 
MapObject Messages 
ModuleInit Message 
Object Messages 
pfx Message 
Signal Messages 
Train Messages 
Vehicle Messages 
GameObject
__________________
местный зомбяк

Последний раз редактировалось TRam_; 07.08.2009 в 14:46.
TRam_ вне форума   Ответить с цитированием
Старый 01.01.2007, 12:00  
Яndex
Спонсор
 
 
Регистрация: 01.01.2007
Сообщения: 500


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

 
Старый 08.08.2009, 10:53   #2
genesis
Матёрый пользователь
 
Регистрация: 31.07.2007
Адрес: Ульяновск
Сообщений: 2,570
Вы сказали Спасибо: 245
Поблагодарили 174 раз(а) в 76 сообщениях
genesis стоит на развилке (репутация по умолчанию)
Отправить сообщение для genesis с помощью ICQ Отправить сообщение для genesis с помощью Skype™
По умолчанию

Цитата:
Сообщение от TRam_ Посмотреть сообщение
Хотя msg.minor имеет тип string, перед её обработкой для определения инструкций
желательно дополнительно явно преобразовать её тип в string, а именно
(string)msg.minor
Смысель? ВМ, конечно, этого не оценит, но хочется знать к чему такая предусмотрительность
genesis вне форума   Ответить с цитированием
Старый 08.08.2009, 11:17   #3
TRam_
Матёрый пользователь
 
Аватар для TRam_
 
Регистрация: 18.02.2008
Сообщений: 8,703
Вы сказали Спасибо: 1,424
Поблагодарили 2,365 раз(а) в 1,319 сообщениях
TRam_ стоит на развилке (репутация по умолчанию)
По умолчанию

если бы у меня строка без этого работала, я бы этого не писал. Но функции класса Str без этого работать отказываются
__________________
местный зомбяк
TRam_ вне форума   Ответить с цитированием
Старый 09.08.2009, 17:21   #4
genesis
Матёрый пользователь
 
Регистрация: 31.07.2007
Адрес: Ульяновск
Сообщений: 2,570
Вы сказали Спасибо: 245
Поблагодарили 174 раз(а) в 76 сообщениях
genesis стоит на развилке (репутация по умолчанию)
Отправить сообщение для genesis с помощью ICQ Отправить сообщение для genesis с помощью Skype™
По умолчанию

Индивидуальная работа компилятора
genesis вне форума   Ответить с цитированием
Ответ


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

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

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

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


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


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