Skyrim CK:Состояния

Материал из Tiarum
Перейти к: навигация, поиск

Содержание

Обзор

Скрипты работают в разных состояниях, но в каждый момент времени скрипт может быть только в одном состоянии. Какой код выполняется при вызове функции или события зависит от состояния, в котором находится скрипт.

Объявление состояний

Объявить состояние в скрипте очень просто, достаточно написать нечто такое:

state MyState
  ; Различные функции
endState

Если вы хотите, что бы ваш скрипт запускался в определенном состоянии, достаточно добавить операторное слово "auto" в начале объявления блока состояния:

auto state StartHere
  ; тут функции
endState

Отсутствие состояния

'Пустое состояние' - это особое состояние, означающее, что в нем находятся все функции, находящиеся вне других блоков состояний.

function MyFunction()
  ; Эта функция в  'пустом состоянии'
endFunction
 
state MyState
  function MyFunction()
    ; Эта функция в состоянии MyState
  endFunction
endState

Объявление функций\событий внутри состояний

Для объявления функции или события внутри состояния, просто поместите функцию(событие) в блок состояния.

state MyState
  function SpecialFunction()
    ; This function is in the MyState state
  endFunction
endState

Обратите внимание: функция или событие должны быть объявлены в 'пустом состоянии' с тем же типом и параметром возвращаемого значения или компилятор выдаст ошибку. Это связано с тем, что игра обрабатывает функции и события в реальном времени.

function SampleFunction(int myParameter)
  ; тут код
endFunction
 
state SampleState
  function SampleFunction(int aParameter)
    ; С этой функцией все в порядке - тип параметра такой же как в 'пустом состоянии'
  endFunction
 
  function OtherFunction()
    ; Ошибка! OtherFunction не существует в 'пустом состоянии'
  endFunction
endState
 
state OtherState
  int function SampleFunction(int myParameter)
    ; Ошибка! SampleFunction возвращает тип, не соответствующий типу функции в 'пустом состоянии'
  endFunction
endState
 
state YetAnotherState
  function SampleFunction(int myParameter, float parameter2)
    ; Ошибка! Параметры функции SampleFunction не соответствуют параметру в 'пустом состоянии'
  endFunction
endState

Для вашего удобства, события в различных типах скриптов уже объявлены для вас внутри пустого состояния скрипта, который вы расширяете (т.е. ObjectReference, Actor, др). Таким образом, вы не должны объявлять события в пустом состоянии, когда все, что вам нужно сделать, это изменить события в одном конкретном случае.

Как выбирать функции

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

  1. Если сценарий имеет функцию в ее нынешнем состоянии, вызывает функцию
  2. Если скрипт расширяет другой скрипт, который имеет функцию в ее нынешнем состоянии, вызывает функцию
  3. Если сценарий имеет функцию в 'пустом состоянии', вызывает функцию
  4. Если скрипт расширяет другой скрипт, который имеет функцию в 'пустом состоянии', вызывает функцию

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

Как установить состояние скрипта

Установить состояние скрипта просто, достаточно вызвать функцию GotoState(string asStateName) с именем состояния в которое вы хотите перевести скрипт, в виде строки. Следующая последовательность событий будет иметь место:

  1. OnEndState передает скрипту окончание предыдущего состояния.
  2. Состояние переключается на текущее.
  3. OnBeginState передает скрипту состояние в которое он только что попал.

Название состояния может быть любым. К примеру, если вы хотите перейти в 'пустое состояние', просто наберите пустую строку : "".

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

function MyFunction()
  GotoState("TurnOffActivate")
  ; сделать что-нибудь
  GotoState("")
endFunction
 
state TurnOffActivate
  event OnActivate(ObjectReference akTriggerRef)
    ; Ничего не делать
  endEvent
endState

Как получить состояние скрипта

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

Советы и хитрости

  • Если вы хотите отключить событие или функцию в каком-либо из состояний, просто определите это событие или функцию в этом состоянии и оставьте его пустым. Это особенно полезно, если в конкретном состоянии не нужно использовать некоторые свойства или функции.
  • Если выполнение программных действий только в одном состоянии ограничивает вас, запомните, что вы всегда можете назначить несколько скриптов одному объекту, каждый из которых может иметь свои собственное состояния. Это может вам пригодиться в сложных операциях. Конечно вы также можете опираться только на использование собственных переменных состояния.
  • Т.к. имена состояний - простые строки, вы можете собирать их в реальном времени при помощи оператора "+". Это наглядно демонстрирует следующий пример.
Function GotoNumberedState(int number)
  GotoState("State" + number)
EndFunction

Заключение

Состояния достаточно мощный и простой способ изменить действия вашего скрипта, без необходимости писать слишком большой и сложный код. Иногда проблемы, кажущиеся сложными становятся простыми при использовании состояний!

Личные инструменты
Пространства имён
Варианты
Действия
Навигация
Разделы TES
Разделы Fallout
Модмейкерам
Инструменты