Что такое переменные?
Переменные - это области памяти, которые могут хранить значения. Они играют важную роль в программировании, т.к. позволяют программистам писать программы более удобно. В переменные можно сохранять почти любой вид данных. Они позволяют вам хранить боевых единиц, выигрывающего игрока, тип боевой единицы или даже текстовые строки. Сохранение информации в переменные позволяет вам использовать их позже. Например, вы хотите записать в переменную, сколько боевых единиц убил игрок. Тогда вам понадобится переменная типа "целочисленная". Также можно записать игрока, убившего самое большое количество боевых единиц на протяжении игры, используя переменную типа "игрок".
Создание переменных.
В World Editor переменные создаются при помощи Редактора переменных. Если вы используете Custom Script, вы также можете создать многие типы переменных в триггере.
Чтобы открыть Редактор переменных, щёлкните "Правка -> Переменные" или просто нажмите комбинацию клавиш "Ctrl - B". Появится окошко, где можно добавить любые типы переменных, которые нужны для вашей карты. У всех переменных есть тип, название и значение.
Тип переменной определяет, какой тип данных она может хранить. В WarCraft III использовано множество различных типов данных. При создании переменной вам нужно будет определить тип данных, которые в неё можно будет записать. Например, переменная типа "целочисленная" может содержать только целое число, а переменная типа "боевая единица" может содержать только боевых единиц (героев, воинов, нейтральные войска и.т.д.). Позже мы обсудим разные типы переменных и их использование.
У каждой переменной должно быть уникальное имя. На самом деле для компьютера имя фактически ничего не значит, это просто памятка для вас, определяющая, что это за переменная при создании карты. Можно называть переменные почти так, как вам хочется, но запоминайте, какая переменная для чего предназначена. Ниже дам парочку советов по подбору имени переменной:
- Присваивайте переменной имя, которое что-либо означает. Названия из одной буквы выглядят глуповато. Согласитесь, назвать переменную "index" лучше, чем "i", название "count" лучше, чем "c", а "name" лучше, чем "n".
- Не начинайте имя переменной с числа. Оно может содержать числа, но первым символом должна быть буква.
- Можно использовать в имени переменной нижнее подчёркивание, но никак не пробел. Использование таких подчёркиваний является хорошим разделением слов, но лучше не начинать имя с такого подчёркивания.
- Не давайте имена, которые очень похожи на имена других переменных.
- Не давайте переменным имена, которые похожи на ключевые слова или функции. Например, не называйте переменную типа "целочисленная" именем "int" или переменную типа "строка" именем "string". Это может быть причиной некоторых недоразумений при создании триггеров.
По умолчанию значение переменной равно "0" или "Нет". Позже значение можно менять, используя триггеры или команду "Custom Script". После создания переменной можно всегда вернуться в Редактор переменных и изменить её свойства.
Установка значений переменных.
Значение переменной может быть установлено в любое время игры. Вы можете задать значения важных переменных в начале игры. Позже вы можете задавать другие переменные по мере надобности, например когда происходит какое-либо событие. Повторюсь, значение переменной можно изменить всегда. Задать значение переменной можно триггерным действием "Set Variable".
Переменные-массивы.
Переменные-массивы - это переменные, которые могут содержать несколько значений. Любая переменная, которую вы создаёте, может быть массивом. Для этого поставьте галочку в поле "Массив". Каждое значение такой переменной имеет свой индекс, свой порядковый номер. Минимальный индекс - 0. Индекс используется для обращения к элементам массива. Он позволяет получить доступ к любому значению массива. Приведу пример - у меня есть переменная-массив типа "строка", которую я назвал "Fruits". В триггере инициализации карты я задам различные значения этого массива, чтобы позже их использовать.
Позже, во время игры, если я захочу сказать игроку, чтобы он собирал груши, я буду использовать Fruits[] следующим образом:
Также я могу циклом вывести названия всех фруктов таким образом:
Использование логических переменных.
Логические переменные используются, чтобы найти ответ на одно и более утверждение. Значение таких переменный может быть только одно из двух - "Да" или "Нет". Пример утверждения - "Мой рост - 10 футов или дерево упало". В свою очередь, утверждение может быть истинным ("Да") или ложным ("Нет").
Локальные переменные.
Выше мы рассматривали глобальные переменные. Локальные переменные имеют отличие от них - они могут быть использованы только в функции, в которой они объявлены. К примеру, вам требуется триггер, который бы запускался всякий раз при убийстве боевой единицы. Если вы используете стандартную глобальную переменную, то триггер, возможно, перезапишет переменную с умершей боевой единицей, если он запустится ещё раз при смерти кого-либо ещё. Соответственно, правильно триггер уже не сработает, т.к. значение переменной было изменено.
Или, допустим, у вас есть триггер, который воскрешает героев, в котором умирающий герой записывается в глобальную переменную. Если при воскрешении одного героя погиб второй, то в глобальную переменную занесёт этого героя, а герой, который был перед ним, будет потерян.
Чтобы создать локальную переменную, вам понадобится использовать JASS. Добавьте действие "custom script" в триггер и напишите в нём:
Custom Script: local unit Revive_Hero
Чтобы задать значение этой переменной, снова понадобится Custom Script. Добавьте в свой триггер ещё одно действие "Custom script" и напишите в нём:
Custom script: set Revive_Hero = GetTriggerUnit()
Затем снова понадобится JASS, чтобы воскресить героя. Напишем ещё один Custom Script:
Custom script: call ReviveHeroLoc(Revive_Hero, GetRectCenter(GetPlayableMapRect()), true)
Запомните - локальные переменные не показываются в стандартном интерфейсе и именно поэтому следует использовать JASS для управления этими переменными.
Список типов переменных.
Способность - сохраняет тип способности, например "Стремительность" или "Кровожадность".
Тип атаки - сохраняет тип атаки. (Заклинание, Герой, Сила Тьмы и.т.д.)
Логическая - сохраняет значения "Да" или "Нет".
Заклинание - сохраняет тип заклинания, например "Замедление" или "Яд". Не является способностью.
Объект камеры - сохраняет камеру, которая была поставлена на карте.
Звуки боя - сохраняет тип звуков боя у боевой единицы. (Лёгкий металлический удар (рубящий), тяжёлый металлический удар (режущий) и.т.д.)
Тип урона - сохраняет тип урона боевой единицы. (Огонь, холод, молния, отравление и.т.д.)
Декорация - сохраняет декорацию, которая была поставлена на карту или создана триггерно.
Разрушаемый объект - сохраняет тип декорации.
Условие поражения - сохраняет последнее созданное вами условие поражения.
Диалог - сохраняет последнее созданное вами окно диалога.
Кнопка - сохраняет последнюю созданную вами кнопку для окна диалога.
Тип эффекта - сохраняет тип эффекта. (Графика цели, графика мага, графика выстрела и.т.д.)
Плавающий текст - сохраняет последний созданный вами всплывающий текст.
Буфер игры - сохраняет последний созданный вами кэш.
Скорость игры - сохраняет скорость игры, также текущую скорость игры или похожее значение.
Ссылка - сохраняет ссылку на любой вид данных.
Хэш-таблица - сохраняет последнюю созданную вами хэш-таблицу.
Изображение - сохраняет последнее созданное вами изображение.
Тип изображения - сохраняет тип изображения. (Текстура земли, выбор, индикатор и.т.д.)
Целочисленная - сохраняет целое число. Не поддерживает десятичные дроби.
Предмет - сохраняет предмет, который уже существует в карте.
Класс предмета - сохраняет класс предмета.
Тип предмета - сохраняет тип предмета.
Таблица рекордов - сохраняет последнюю созданную вами таблицу рекордов.
Молния - сохраняет последнюю созданную вами молнию.
Тип молнии - сохраняет тип молнии. (Похищение здоровья, похищение маны, вампиризм и.т.д.)
Меню паузы - сохраняет последний созданный вами мультибоард.
Порядок - сохраняет приказ, который может быть отдан боевой единице. (Атаковать, двигаться, спрятаться и.т.д.)
Игрок - сохраняет любого игрока.
Цвет игрока - сохраняет цвет любого игрока.
Группа игроков - сохраняет группу игроков для дальнейшего использования.
Точка - сохраняет координату Х\Y на карте.
Тип проходимости - сохраняет тип проходимости. (Ходьба, строительство, полёт и.т.д.)
Задание - сохраняет последнее созданное вами задание.
Условия задания - сохраняет последнее созданное вами задание.
Раса - сохраняет расу. (Альянс, орда и.т.д.)
Реальная - сохраняет число. Поддерживает десятичные дроби.
Область - сохраняет регион, который расположен на карте.
Звук - сохраняет звук, который был импортирован или изначально существовал в игре.
Тип звука - сохраняет тип звука.
Спецэффект - сохраняет последний созданный вами спецэффект.
Строка - сохраняет группу символов, число или текст.
Тип технологии - сохраняет тип улушения, которое может быть исследовано.
Деформация рельефа - сохраняет последнюю созданную вами деформацию рельефа.
Рельеф - сохраняет форму кисти рельефа (круг или квадрат).
Тип ландшафта - сохраняет текстуру ландшафта. (Летний лордерон: почва, Ашенваль: трава и.т.д.)
Таймер - используется для создания таймера. Каждыйт таймер имеет переменную.
Окно таймера - сохраняет последнее созданное вами окно таймера.
Триггер - сохраняет любой созданный вами триггер.
Текстура земли - сохраняет последнюю созданную вами текстуру земли.
Тип текстуры земли - сохраняет тип текстуры земли.
Боевая единица - сохраняет боевую единицу.
Отряд - сохраняет группу боевых единиц.
Тип объекта - сохраняет тип объекта.
Модификатор видимости - сохраняет последний созданный вами модификатор видимости.
Погодный эффект - сохраняет последний созданный вами погодный эффект.