Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скрипты Morrowind.doc
Скачиваний:
91
Добавлен:
29.10.2018
Размер:
2.81 Mб
Скачать

Проверка условий Использование условий if… elseif

If (condition)

Elseif (condition)

Else

Endif

Большинство скриптов в TES основываются на использовании ifelseif и их вариаций. Очень важно полностью понимать эти конструкции, так как условия могут запускать события в игровом мире.

Вообще, условие истинно, если оно имеет значение 1 (или просто “не 0”, то есть –1 также истинно) и ложно, если имеет значение 0. Есть определенные функции в игре, которые возвращают “истину” в определенных условиях. Например, взгляните на функцию GetAIPackageDone ниже. Она возвращает 1 в том фрейме, когда пакет действий для AI завершен. Все строчки кода между if и endif (которые называются if-блоком) будут исполняться только, когда условие истинно.

Так что:

If ( GetAIPackageDone )

;[делать что-то]

endif

будет исполняться только, когда GetAIPackageDone вернет 1.

В дополнение к просто значению, условие может содержать более расширенный набор условий. Условия, такие как “А равно В” или “А больше чем В” будут оценены, и все выражение будет истинно (равно 1), когда условие будет выполнено. Например:

if ( GetAIPackageDone == 1 )

;[делать что-то]

endif

является эквивалентом приведенному выше. Можно проверять следующие условия:

Обозначение

Условный оператор

"равно":

==

"не равно"

!=

"больше чем"

>

"меньше чем"

<

"больше или равно"

>=

"меньше или равно"

<=

Если у вас есть несколько независимых блоков условий, каждый будет оценен отдельно. Например, если у вас в коде такие строки:

if ( timer >= 2 )

;[Блок A,делать что-то]

endif

if ( timer <= 3 )

;[Блок B, делать что-то другое]

endif

Оба условия будут равны единице и код в блоках будет выполнен, когда timer будет между 2 и 3.

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

if ( timer >= 2 )

if ( controlvar == 0 )

;[делать что-то]

endif

endif

Код в внутреннем блоке будет выполнен, когда оба условия (timer >= 2 и controlvar == 0 ) равны истине одновременно.

Для более сложных конструкций используйте Else и Elseif. Elseif проверяет отдельное условие, если предыдущее условие оказалось ложью (если – истиной, то не проверяет)

if ( timer >= 2 )

;[Блок A,что-то делать]

elseif ( timer <= 3 )

; [Блок B, делать что-то еще]

endif

В отличие от вышеприведенного примера, оба блока не могут быть выполнены одновременно. Если timer >= 2, то исполняется блок А или если timer не >= 2, а <= 3, то есть, в данном случае, если timer < 2, то исполняется блок В. Во всех других случаях ни один блок не будет исполнен. Можно поставить несколько elseif один за другим:

if ( counter == 1 )

; [Юлок A,что-то делать]

elseif ( counter == 2 )

; [Юлок B, делать что-то другое]

elseif ( counter == 3 )

; [Юлок C, делать еще что-то]

endif

Else создает условие по умолчанию. Блок else будет выполнен, если только все предыдущие условия оказались ложью:

If ( foo_var == 1 )

[Блок A: делать что-то]

elseif ( foo_var == 2 )

[Блок B: делать что-то еще]

else

[Блок C: делать что-то совершенно другое]

endif

В этом примере блок С будет выполнен, если foo_var не 1 и не 2.

Примечание: Исходя из моего опыта, самый безопасный способ протестировать разные значение одной переменной – использовать elseif вместо многих отдельных if.

Существует максимальное количество возможных условий if-elseif в одном скрипте. Согласно последней информации он равно где-то 127 (а не 256, как упоминалось ранее).

Слишком большое расстояние между if и endif может также вызвать проблемы. Они начнутся, если оно (расстояние) будет больше 120-240 строк. (Информация с форума / MentalElf)