,

WarCraft 3: Переменные (практика)

Осваиваем World Editor: триггеры

Переменные (практика)

Я не буду описывать здесь, какие есть переменные и как их создавать - это уже было описано в первой части. Рассмотрим переменную как объект.
Что есть переменная? Каждая переменная - что-то вроде листика, на который Вы записываете информацию, чтобы не забыть ее. Можно рассматривать переменную как объект, свойства которого - название и тип данных, которые можно в нее записать и значение, записанное в переменную. Действия, которые можно производить с переменными - создать, присвоить новое значение, прочитать значение переменной.
Начнем с переменных числового (и дробного) типа.
Для работы с числами в WE есть два типа переменных: integer и real.
В переменные типа integer можно записать целые числа (для не математиков напоминаю: это числа без дробной части, но не только положительные, но и отрицательные).
Если Вы попытаетесь записать в переменную целого типа число с дробной частью (это вообще говоря некорректная операция) в WE никаких ошибок не будет. Просто в переменную будет записано значение без дробной части.
Например, если в переменную i целого типа Вы попытаетесь записать дробь 1 / 3, то в результате туда будет записан 0 (1 / 3 округляется, получается 0). Если 5 / 4 - то в i будет записана 1.
Другой тип - real - рациональные числа (дроби). В WE такие числа записываются как десятичные дроби. Хотя при желании Вы можете записать в переменную типа real и целое число (без дробной части).
Посмотрим, какие значения можно помещать в числовые переменные.
Войдите в WE, начните новый сценарий, сотрите все триггеры. Создайте переменную i типа integer и переменную r типа real.
Далее создайте триггер с событием Map Initialization. Создайте действие set variable. В качестве первого параметра нужно указать переменную, значение которой мы изменяем. Укажите переменную i. Второй параметр - какое значение мы хотим установить переменной. Когда Вы нажмете на него, Вам будет выдано окно, где будет предложено выбрать один из трех вариантов:
  • Variable (переменная)
  • Function (функция)
  • Value (значение)
Итак, Вы можете присвоить одной переменной значение другой переменной (ну скажем set a = b - в переменной a будет записано такое же значение, как в b).
Другой вариант - написать конкретное значение, которое Вы хотели бы присвоить переменной - введите его в пункте Value.
И, наконец, третий пункт - функции. В списке функций будут все функции Варкрафта, которые возвращают integer. Как работают функции и выражение уже было описано в это статье.
Однако один момент надо все-таки рассказать... Поясню на примере. Например, мы решили переменной i присвоить значение равное 12 - 5. Для этого надо воспользоваться функцией (а не написать в поле Value!) Arithmetic!
Примечание: хотя Arithmetic по синтаксису триггеров - функция, на самом деле это не так. В JASS скрипте будет написано по-нормальному, т. е. само выражение. Поэтому "функция" Arithmetic "нормальна" с точки зрения оптимизации.
Реально у Blizzard не было другого выхода - не заставлять же писать выражения на JASS'е, учитывая что знать его будет не больше 2% всех мапперов?
Если все было сделано правильно, то действие будет выглядеть так:
Set i = (12 - 5)
Вопрос: как нам установить значение переменной i, чтобы она была равна 12 - 5 + 3, т. е. не два, а три слагаемых? Для этого снова пользуемся функцией Arithmetic: в качестве первого параметра выбираете снова функцию Arithmetic, и как её параметры ставим 12 - 5. В качестве второго параметра вводим 3. Не забудьте про знаки, конечно. Если все сделано верно, действие будет выглядеть так:
Set i = ((12 - 5) + 3)
Такой способ ввода значений весьма неудобен. Но что поделать, приходится пользоваться тем, что есть.
Достаточно часто используется такой прием:
Set i = (i + 1)
Что произойдет после выполнения этого действия? Значение переменной i увеличится на единицу, каким бы оно не было раньше. Это нам говорит о том, что можно использовать значение самой переменной (которой присваивается значение) в выражении.
Когда Вы создадите действие set variable, но в качестве первого параметра выберете переменную r (типа real), Вам будет предоставлен другой набор функций, уже не будет тех, что возвращают integer (хотя я и говорил, что значение автоматически конвертируется - функций в списке нет). Но есть функция конверции из integer'а в real.
Как видите всяких действий с числами в WE можно производить предостаточно. Можно было бы даже использовать его как калькулятор :)
В обычных сценариях не так уж часто приходится пользоваться всеми этими функциями, но на самом деле они открывают картостроителю многие возможности. Поэтому нужно уметь с ними работать.
Давайте решим такую задачу: поместим в переменную r значение 100 + ((случайное число от 1 до 10) / 5).
Set i = (100 + ((Random integer number between 1 and 10) / 5))
Допустим, перед нами стоит задача: задать переменной i значение 1 + 2 + 3 + 4 + 5 + ... + 10, т. е. слагаемых много. Если каждый раз делать арифметическую функцию - потратите много времени и сил, чтобы все сделать правильно и нигде случайно не ошибиться. Можно схитрить: записать действие не в одну, а в несколько строк.
Set i = (i + 1)
Set i = (i + 2)
Set i = (i + 3)
Set i = (i + 4)
Set i = (i + 5)
Set i = (i + 6)
Set i = (i + 7)
Set i = (i + 8)
Set i = (i + 9)
Set i = (i + 10)
В итоге в переменной i будет записано нужное нам значение, но каждую строку не обязательно переписывать - можно просто скопировать и немного изменить ее (или воспользоваться циклом, о чем чуть позже).
А можем ли мы просмотреть, какое значение у какой-нибудь числовой переменной? Можем. Вы уже знакомы (я надеюсь) с действием game - text message. Она позволяет выводить текстовые строки. Но мы не можем просто взять и вывести число, потому что у него нету такого действия (как у объекта, помните), такое действие есть только у строк. Есть функции перевода числа в строку, которая берет как аргумент число, а возвращает строку с этим числом.
Примечание: важно понимать, что вроде бы очевидные вещи иногда нельзя сделать. Пример с числом идеально это показывает. С точки зрения компьютера строка - набор символов. Но мы обозначаем числа символами (поэтому иногда не сразу ясно - компьютер, в своем внутреннем представлении ничего ничем не обозначает - там другая логика), и называем это цифрами. Для строки не имеет никакого значения, есть ли в ней цифры или нет - для неё это такие же символы, как и остальные. Поэтому и надо сначала сконвертировать число в цифры - набор символов.
Выберите фукнцию convertion - convert real to string (перевести рациональное число в строку) - и в качестве числа укажите переменную r. Если же хотите посмотреть переменную i, выберете функцию convertion - convert integer to string и в качестве числа аргумента укажите переменную i.
Объяснять все эти вещи непросто, хоть они и являются достаточно простыми. Нужно просто понять, самому поработать с переменными. Поэтому даю задание (делать только тем, кто не умеет работать с переменными):
  • Создать минисценарий с переменными a, b, d типа real, c типа integer
  • В переменную a поместить ((случайное число от 1 до 10) + 5 / 2).
  • В переменную b поместить 2^4 (два в четвертой степени).
  • В переменную c поместить 1 - 2 - 3.
  • В переменную d поместить наибольшее из чисел a и b.
  • Вывести значение всех переменных на экран.

Просмотров: 17 451

» Лучшие комментарии


FlamedragoN #1 - 7 лет назад 3
Set i = (i + 1) - при систематическом действие (смерть героя). значение переменной постоянно будет увеличиваться на 1, или так и останется 1?
bonifaciy #2 - 7 лет назад 4
если бы еще и перевод был для тех у кого русский редактор, цены бы не было.
Orses #3 - 6 лет назад 1
Спасибо хорошая статья. Переменные - это нужная вещь.
ReDUnicorn #4 - 5 лет назад 1
Спасибо за статью. . .
Witcher_2 #5 - 5 лет назад 1
Норм статья.
Технико #6 - 4 года назад 0
Как в последнем задании вывести на экран значения??? продублируйте мне в ЛС ответ плиз!
Babay4ik #7 - 4 года назад 2
Доброго времени суток. С другом решили сделать свою карту, есть много интересных идей. Только есть проблема.... мы без понятия как их осуществить. Я пытался разобраться в тригерах, ничего не вышло.... Будьте добры, кто сможет помочь свяжитесь со мной в скайпе babay1921 . Спасибо.
Это сообщение удалено
Bariy vad #9 - 2 года назад 0
А где узнать все функции целочисленной переменной?
Описание подробней пожалуйста.
Это сообщение удалено