| Категории каталога |
|
|
Doom3
[11]
Статьи о разработке карт к Doom3
|
Общее
[7]
Статьи про общие моменты маппинга
|
| |
|
| |
|
|
|
|
|
Скриптуем #2
теперь займёмся переменными более подробно Для начала
важно заметить, что существует особая разновидность переменных -
константы. Константы обычно задаются прямо в тексте программы и никак
не могут меняться по ходу выполнения скрипта в отличае от переменных.
Как же они выглядят:
154 - константа, число 154 "поэма" - строка, содержит текст: "поэма" С
константами можно делать всё то же, что и с переменными, за исключением
операции = где константа слева. Причиной этому служит невозможность
изменять константы по ходувыполнения скрипта.
Итак, переменные. Что с ними можно делать? В принципе с переменными можно делать только две вещи, а именно изменять и сравнивать. Попробуем и то и другое. Для работы с переменными используются операторы. Вот все операторы, которые встречаются в doom3 скриптах:
+ - сложение, для чисел это обычное сложение, строки соединяются. - - вычитание, только для чисел / - деление, только для чисел * - умножение, тоже только для чисел =
- присвоение, для любых видов переменных. После выполнения этой
операции то, что было слева станет равным тому, что справа. Например x
= x + 1 - х станет равен х+1, то есть станет на 1 больше. == -
сравнение - если то, что слева и то, что справа равно друг другу - само
сравнение считается равным единице, в остальных случаях оно равно нулю.
Соответственно возможна такая странная операция: a = (m == 1) + (n == 1) () - скобки, нужны для группировки операций >=,
<=, >, < - знаки больше или равно, меньше или равно, больше,
меньше. Действуют так же, как и сравнение, но их смысл соответствует их
названию, к примеру t > 5 будет равно 1, если t больше пяти и будет
равно 0 в остальных случаях.
Операции это, конечно, хорошо. Но
что же потом с результатом действий делать? В принципе тут тоже не
слишком много вариантов. Можно отдать это значение какой-нибудь
функции, а можно воспользоваться им для принятия каких либо решений в
скрипте. Для последнего существуют управляющие конструкции. Вот самая
основная из них:
if (переменная) { код1 } else { код2 }
Здесь
код - соответственно текст скрипта, а переменная - любая подходящая
переменная. Как оно работает? А работает оно довольно просто: если
переменная имеет значение 0 - выполняется код2, если не ноль - код1. И
код2 и код1 - абсолютно полноправный код скрипта и в нём так же может
встречаться свой if. Самый простой пример if:
if (расстояние_до_противника < 50) {атаковать} else {подходить ближе}
для сокращения кода скрипта else вместе с {код2} можно пропустить. Если же вы вдруг встретите вот такую конструкцию:
if (условие) код;
не
пугайтесь, это сокращённая запись. Если после if не идут объединяющие
скобки - выполняется только одна строка кода - соответственно от конца
if до ; (помним, что в скриптах строки разделяются с помощью знака ";" )
Ну а теперь немного практики: Попробуем сделать скрипт для открывания двери только в случае, если у некоторого монстра жизней меньше, чем 50 Для
этого нужно иметь возможность собственно открыть дверь (причём вполне
определённую) а так же нужно узнать, сколько жизней у монстра.
Собственно, одно из самых важных действий, которые делает игра при
загрузке карты - создание констант для всех объектов на карте. Выглядят
они так: $имя_на_карте, например, дверь с именем func_door_1 будет в
скрипте выглядеть так: $func_door_1. Теперь к вопросу о том, как её открыть. У дверей есть такие методы:
open(); - открывает дверь close(); - закрывает дверь lock(
float locked ); - замыкает или отмыкает дверь (locked имеет такой же
смысл, как и параметр locked для дверей в редакторе карт)
Значит основная часть скрипта будет такой:
if (???) {$func_door_1.lock (0);} else {$func_door_1.lock (1);}
надо только узнать, сколько у монстра жизней и сравнить с числом.
Для нахождения монстра можно использовать функцию sys.getEntity( string name );
Она возвращает переменную типа entity если объект найден и ноль в противном случае
Для выяснения количества жизней у монстров существует такой незатейливый метод:
float getHealth();
float
перед названием сообщает о том, что метод возвращает значение, т.е.
сама конструкция $monster1.getHealth() чему-то будет равна. А именно -
количеству жизней у монстра. После чего условие обретает законченный
вид:
entity mon = sys.getEntity("имя_монстра");
if (mon) {
if (mon.getHealth() < 50) {$func_door_1.lock (0);} else {$func_door_1.lock (1);}
}else{
$func_door_1.lock (0); //В случае смерти монстра дверь открывается.
}
Теперь надо вставить эту проверку в функцию и вызвать эту
функцию из триггера карты. Для таких действий у триггеров есть
специальное поле call, туда нужно вписать название функции. Примерный
вид результата:
void OpenDoor() { entity mon = sys.getEntity("имя_монстра");
if (mon) {
if (mon.getHealth() < 50) {$func_door_1.lock (0);} else {$func_door_1.lock (1);}
}else{
$func_door_1.lock (0); //В случае смерти монстра дверь открывается.
}
}
Особо внимательные читатели найдут, как можно избавиться от if
в этом скрипте без потери функциональности, а если не найдут - увидят
это в следующей части. Всё.
|
Категория: Doom3 | Добавил: c4tnt (07.11.2008)
|
Просмотров: 975
| Рейтинг: 0.0/0 |
Добавлять комментарии могут только зарегистрированные пользователи. [ Регистрация | Вход ]
|
|
|
|
|
|
Вход: |
|
Поиск |
|
Ссылки |
|
Статистика |
Онлайн всего: 1 Гостей: 1 Пользователей: 0 |
|