Итак, после ознакомления с азами Jass копнём чуть поглубже и разберём два вида переменных. В Jass существует 2 вида переменных - локальные и глобальные. Разберём плюсы и минусы каждого из них.
Локальные: + Сохраняют своё значение после ожиданий. + Создаются уникально при каждом запуске триггера (не перезаписываются после второго запуска триггера). + Легко регулируемы. + MUI.
- Действуют только в пределах функции, где их задали.
Глобальные: + Действуют во всех триггерах карты.
+- MPI (Хоть и массивным способом)
- Есть риск потерять значение после ожидания (Если триггер запустится во время ожидания, переменная перезапишется). - Каждый раз нужно писать приставку udg_ - Немного неудобны по сравнению с локальными.
Лучше по возможности отказываться от глобальных переменных и использовать только локальные (Исключение - хеш-таблицы), т.к. они дают гарантию того, что значение сохранится.
Как объявить локальную переменную? Очень просто:
Code
local <тип> <название>
Пример:
Code
local integer i
Это будет целочисленная под названием i. Вводя название, мы обращаемся к целочисленной переменной. Кое-когда объявляют переменные и тут же задают им значение:
Code
local <тип> <название> = <значение>
Пример:
Code
local integer i = 0
Тогда наша целочисленная будет равна 0.
Можно задать её значение не сразу, а по ходу кода. Делают это так:
Code
set <название> = <значение>
Пример:
Code
set i = 0
Подобным образом задают глобальные переменные, но добавляют приставку udg_
Code
set udg_<название> = <значение>
Пример:
Code
set udg_Integer = 0
. Глобальные переменные создаются в Редакторе переменных, локальные же - только в функциях непосредственно.
Переменные бывают утечные (те, которые наследуются от типа handle), их надо обнулять:
Code
set <название> = null
. Подробнее об этом читаем тут. Неутечные типы переменных: boolean, integer, real. Запомните их.
Д/з: Потренироваться с этими переменными, как глобальными так и локальными, ваши результаты выкладывайте на следующем уроке. Возьмити любой ваш триггер, конвертируйте его в текст и все те глобалки заменить локальными переменными, обнулить их в конце. Непосредственно я дам вам лёгкий пример: до:
//================================ function InitTrig_NewTrigger takes nothing returns nothing set gg_trg_NewTrigger = CreateTrigger() call TriggerAddAction(gg_trg_NewTrigger, function Trig_NewTrigger_Actions) call TriggerRegisterPlayerChatEvent( gg_trg_NewTrigger, Player(0), "", false) //Player(0) это игрок один красный endfunction
после:
Code
function Trig_NewTrigger_Actions takes nothing returns nothing
local player p = GetTriggerPlayer() local string s = GetPlayerName(p)
call DisplayTextToPlayer(p, 0,0, "Привет " + s)
set p = null set s = ""
endfunction
//================================ function InitTrig_NewTrigger takes nothing returns nothing set gg_trg_NewTrigger = CreateTrigger() call TriggerAddAction(gg_trg_NewTrigger, function Trig_NewTrigger_Actions) call TriggerRegisterPlayerChatEvent( gg_trg_NewTrigger, Player(0), "", false) //Player(0) это игрок один красный endfunction
Я думаю, было бы уместно тут же и про массивы упомянуть, хотя бы про объявление локальных. Ах да, насчет этой "д/з". Раз уж я тут, то в каком виде отправлять (через лс/где-то на сайте/через что-то другое?) и кому?
Я знаю, как они объявляются; я имел в виду, что в статье это бы не помешало. Все-таки речь идет об объявлении переменных, почему бы сразу массивы не написать?
Добавлено (21-11-2010, 12:25) --------------------------------------------- Нет, B1nGO, не уместно. В следующих утверждениях идея правильноя, но незнание афтором терминоф искажает или убивает смысл: Легко регулируемы. Каждый раз нужно писать приставку udg_ Переменные бывают утечные (те, которые наследуются от типа handle), их надо обнулять Задаётся каждый элемент массива отдельно
H_A_PK, Скожу тебе так, когда мы присваиваем переменной значение чего либо, к примеру юнита, мы присваиваем не юнита, а его хэндл, и так же когда мы создаём юнита, создаёться новый хэндл, а строка не создаёться через функцию, а мы просто присваиваем ей значение, так же как реальной или целочисленой, но если нет хэндла, то зачем её обнулять,ведь переменные обнуляються только для того что бы не был "висячий" хэндл,обнуление таким способом, это тоже самое что присваивать реальной 0
Сообщение отредактировал rixt7956 - Понедельник, 13 Декабря 2010, 18:02:55
H_A_PK, Скожу тебе так, когда мы присваиваем переменной значение чего либо, к примеру юнита, мы присваиваем не юнита, а его хэндл, и так же когда мы создаём юнита, создаёться новый хэндл, а строка не создаёться через функцию, а мы просто присваиваем ей значение, так же как реальной или целочисленой, но если нет хэндла, то зачем её обнулять,ведь переменные обнуляються только для того что бы не был "висячий" хэндл,обнуление таким способом, это тоже самое что присваивать реальной 0
это я итак знаю -.-
Code
local string s = "buba" set s = "" if GetLocalPlayer() ==Player(0) then set s = "model" endif
имеет смысл я говорю, онулять не нужно всегда ведь, иногда
проклятье ляжет на любого кто дочитает до конца нет не дочитывай не надо остановись ну всё капец