,

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.
  • Вывести значение всех переменных на экран.

Просмотров: 18 405

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


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
А где узнать все функции целочисленной переменной?
Описание подробней пожалуйста.
Это сообщение удалено
Grafinya2 #11 - 4 месяца назад 0
А почему деление с числами не получается
Steal nerves #12 - 4 месяца назад (отредактировано ) 1
Grafinya2, что там у тебя не получается то?
  1. выводи значения переменных на экран, есть такая замечательная функция дебаг BJDebugMsg. хотя это на jass. Попроще на гуи можно просто выводить на экран, в разделе игра там есть эта команда
  2. на ноль делить нельзя (и делитель тоже нулем не должен быть)
  3. может быть так, что переменная не содержит никаких значении. Короче ты не присвоил -ла переменных никаких значении.
  4. у целочисленных переменных значения округляются в меньшую сторону при делении. "6 / 5 = 1,2" или "8 / 5 = 1.6" или "9 / 5 = 1,8", но округляется до 1. Засомневался что-то я в своих словах, поэтому проверил 1-ым способом. Вывел дебагом. В большую сторону не хочет округляться. Покопался по хгм, нашел норм функции округления
  5. и др. неизвестные обстоятельства
все вопросы надо задавать на сайте. не стесняемся и не боимся
прикреплены файлы