RailUnion.net


http://railunion.net/blog/index/index_b-95_sid-b241b441658af4fc79e693543c88eefe.html

Автор:  kemal [ 16.01.2011, 18:45 ]
Тема блога:  TargetTrigger

Как известно, в Trainz'е триггеры реагируют на поезд целиком. Однако, не всегда это удобно. Иногда требуется более точное позиционирование. Например, если мы имеем дело с датчиком, висящем на контактной сети и реагирующим на пантограф. Именно эта ситуация и вдохновила меня на создание такого триггера. Я назвал его TargetTrigger. Принцип его действия основан на GSTrackSearch: триггер спрашивает у вагона расположение точек и следит за положением вагона. При пересечении точкой триггера вызывается событие ttOnEvent. Если же на триггер наедет поезд, в котором ни один вагон не поддерживает эту технологию, то вызывается событие ttOnDefaultEvent.

Демонстрациооный триггер и файлы для своих разработок можно скачать здесь: http://trainz.kemal.tu2.ru/file.php?id=5

Рассмотрим подробнее его использование.
  • TargetTriggerDemo.cdp - триггер, который просто сообщает, что на него наехали. Можно использовать как пример.
  • TargetTrigger.gs - собственно, класс, реализующий технологию. Для создания своего триггера этот файл надо положить в папку дополнения и наследовать свой скрипт от него:
    Код: Выделить всё
    include "TargetTrigger.gs"

    class MyTrigger isclass TargetTrigger{

       public void Init(void){
          inherited();
          ttSetType("type");
       }
    };
    Для начала работы нужно вызвать метод void ttSetType(string s), который устанавливает тип точек, на которые будет реагировать триггер.
  • ttVehicle.gse - класс, осуществляющий поддержку со стороны вагонов (так же нужно класть и к тригграм для возможности кастования). Зашифрован специально от шаловливых ручек, т.к. малейшие изменения могут помешать работе. Вот объявление этого класса:
    Код: Выделить всё
    class ttVehicle{
       public float[] ttGetPoints(string type);
       void ttAddPoints(string type, float[] value);
       void ttRemovePoints(string type);
       string[] ttGetTypes();
       public void Init(void);
    };

    Для инициализации нужно назначить точки, например так:
    Код: Выделить всё
    include "Vehicle.gs"
    include "ttVehicle.gs"

    class MyVehicle isclass Vehicle, ttVehicle{
       public void Init(void){
          inherited();
          float[] f=new float[0];
          f[0]=3.675;
          ttAddPoints("pant", f);
       }
    };

upd: обновил интерфейс. Теперь обработчику сообщается ещё и направление вагона относительно триггера.
Скоро опубликую дополнение, в котором это используется.



{ BLOG_REPLIES }

Автор:  Эрендир [ 22.11.2011, 10:14 ]

Не самая лучшая реализация решения. Лучше отказаться от множественого наследования. Да реализовать это можно вообще без скрипта со стороны Vehicle. Лучше пользоваться расширением конфига. И проще, и лучше.

Автор:  kemal [ 02.02.2012, 02:11 ]

За идею с конфигом большое спасибо! Может быть, когда-нибудь вернусь к этим триггерам...

Часовой пояс: UTC + 4 часа

Powered by phpBB © 2002, 2006 phpBB Group
www.phpbb.com

Blogs powered by User Blog Mod © EXreaction
www.lithiumstudios.org