Класс Thinker¶
Класс Thinker (буквально: "Мыслящий" или "Тот, кто может думать") — класс, который связан с обработкой во внутриигровом мире, однако полноценным актором ещё не является. К объектами этого класса принадлежат, к примеру, обработчики действий ботов (их "души"), движущиеся поверхности вроде лифтов и дверей, пометки на автокарте и событие молнии из Hexen.
Важно отметить, что класс актора также наследуется от класса Thinker, но со значительно расширенными возможностями. То есть всё, доступное Thinker, доступно и акторам, но не наоборот.
Методы¶
В классе, помимо всех наследованных от Object, есть следующие методы:
Переопределяемый метод, вызываемый сразу после создания объекта. В нём, к примеру, удобно инициализировать переменные.
Переопределяемый метод, вызывающийся практически для всех объектов класса Thinker каждый игровой такт (каждую 1/35 секунды). Исключения описаны в подразделе "Принадлежность множествам".
Метод, служащий для изменения принадлежности к тому или иному множеству обработки.
Принадлежность множествам¶
У каждого экземляра Thinker есть скрытая переменная, которая определяет, внутри какого логически выделенного множества объектов он будет обрабатываться — обычно её называют StatNum, по названию изменяющего её метода.
Далее приведены основные из множеств, те, которыми есть смысл пользоваться в модификациях:
STAT_STATIC:Thinker, используемый, например, для хранения данных вроде глобальных переменных (см. 3.10). У него каждый игровой такт не вызывается метод "Tick()" (собственно, поэтому и назван "статическим").STAT_MAPMARKER: (уточнить).- От
STAT_USERдоSTAT_USER_MAX: номера множеств, выделенных под пользовательские модификации (например, для быстрого поиска черезThinkerIterator). STAT_DEFAULT: если не указано обратного, тоThinkerпринимает это множество. Например, все акторы по умолчанию попадают в него.
Полный список всегда можно посмотреть в перечислении Thinker.EStatnums.
Устанавливать принадлежность имеет смысл лишь при инициализации, в противном случае может произойти прерывание работы движка из-за попытки двойной обработки объекта за один такт (см. раздел "Странные ошибки и способы их решения"). Простой пример вызова сбоя: