Перейти к содержанию

Класс Thinker

Класс Thinker (буквально: "Мыслящий" или "Тот, кто может думать") — класс, который связан с обработкой во внутриигровом мире, однако полноценным актором ещё не является. К объектами этого класса принадлежат, к примеру, обработчики действий ботов (их "души"), движущиеся поверхности вроде лифтов и дверей, пометки на автокарте и событие молнии из Hexen.

Важно отметить, что класс актора также наследуется от класса Thinker, но со значительно расширенными возможностями. То есть всё, доступное Thinker, доступно и акторам, но не наоборот.

Методы

В классе, помимо всех наследованных от Object, есть следующие методы:

virtual native void PostBeginPlay();

Переопределяемый метод, вызываемый сразу после создания объекта. В нём, к примеру, удобно инициализировать переменные.

virtual native void Tick();

Переопределяемый метод, вызывающийся практически для всех объектов класса Thinker каждый игровой такт (каждую 1/35 секунды). Исключения описаны в подразделе "Принадлежность множествам".

native void ChangeStatNum( int stat );

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

Принадлежность множествам

У каждого экземляра Thinker есть скрытая переменная, которая определяет, внутри какого логически выделенного множества объектов он будет обрабатываться — обычно её называют StatNum, по названию изменяющего её метода.

Далее приведены основные из множеств, те, которыми есть смысл пользоваться в модификациях:

  • STAT_STATIC: Thinker, используемый, например, для хранения данных вроде глобальных переменных (см. 3.10). У него каждый игровой такт не вызывается метод "Tick()" (собственно, поэтому и назван "статическим").
  • STAT_MAPMARKER: (уточнить).
  • От STAT_USER до STAT_USER_MAX: номера множеств, выделенных под пользовательские модификации (например, для быстрого поиска через ThinkerIterator).
  • STAT_DEFAULT: если не указано обратного, то Thinker принимает это множество. Например, все акторы по умолчанию попадают в него.

Полный список всегда можно посмотреть в перечислении Thinker.EStatnums.

Устанавливать принадлежность имеет смысл лишь при инициализации, в противном случае может произойти прерывание работы движка из-за попытки двойной обработки объекта за один такт (см. раздел "Странные ошибки и способы их решения"). Простой пример вызова сбоя:

// Внутри объекта:
class NewThinker1: Thinker {
    override void PostBeginPlay() {
        ChangeStatNum( STAT_USER );
        Super.PostBeginPlay();
    }
}


// Вне него:
class NewThinker2: Thinker {
}

// <...>
Thinker th = new( 'NewThinker2' );
th.ChangeStatNum( STAT_USER );