RSS
Меню сайта

Категории каталога
Doom3 [11]
Статьи о разработке карт к Doom3
Общее [7]
Статьи про общие моменты маппинга

Наш опрос
Навигация в "Файлах"
Всего ответов: 21

Copyright C4TNT© 2008

Главная » Статьи » Маппинг » Doom3

Скриптуем #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)
Просмотров: 945 | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Вход:

Поиск

Ссылки


Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0


Работаем на керосине