Вы наверное знаете что такое переменные, как с ними работать и так далее. Я делю все переменные на 4 вида по мере уязвимости: 1.Уязвимые переменные Как вы поняли этот вид переменных наиболее уязвим в игре, так как вероятность утечки информации больше всего. К ним относятся те юниты, здания, декорации, всё что вы создали в WE во время создания карты. Они уязвимы так как в игре с ними может случиться что угодно, в частности они могут умереть/уничтожиться. 2.Переменные зависяшие от событий и действий в триггере. Например: Действия: Боевая еденица убить Переключающий юнит. Щёлкнув на строчке вы сможете выбрать и другие переменные, к примеруумирающий юнит, юнит цель заклинания, но по умолчанию стоит переключающий юнит. Итак вы заметили что перед всеми этими переменными припасанно "Реакция на событие"? Это значит что эти виды переменных зависят от события триггера, то есть если выбрать Убивающий юнит то событие должно быть Юнит умирает. Но в этом списке не каждая строка имеет эту приставку, так например строчка Последний созданный юнит, не зависит от события, она зависит от предыдущего действия триггера типа боевая еденица создать юнит.... Эти переменные так же практически никак незащищенны от утечек. 3.Глобальные переменные Это переменные которыми вы можете воспользоваться путём создания их в окне переменных, которое находится на панели инструментовРТ(редактор триггеров), или нажав горячие клавиши cntrl + B. Они предназначены для хранения информации, путём приравнивания действием Установить переменную *** = "Переменная 3-его вида" . Но даже они не достаточно защищенны от утечек информации. 4.Локальные переменные Это переменные созданные jass строчками, путём перевода всего триггера на jass или же действием Личный сценарий, этот вид новичкам особенно трудно понять, но всё не так уж и сложно. Именно локальыне переменные ПРАКТИЧЕСКИ полностью защищенны от утечек информации. В последнее время я, как спеллмейкер стал сталкиваться с утечками информации, которые возникают при триггерном осуществлении какого либо спелла. Чаще всего это спеллы которые дают какие либо эффекты через какой - либо промежуток времени. К примеру вам захочется сделать скилл который полностью останавливает юнита на определённое время: Итак в этом триггере ясно дано понять, что юнит абсолютно обездвиживается на 3 секунды реального времени. Триггер довольно прост, но всё ли сделанно в этом триггере верно? НЕТ! Потому что промежуток времени - 3 секунды, которое наш юнит проведёт неподвижно, довольно уязвим утечкой информации, так как в промежуток 3 секунд есть вероятность что второй юнит с таким же скиллом может использовать этот скилл, и тогда значение (Юнит - цель заклинания) будет перезаписанно, и первая цель останется в паузе навсегда Это и называется утечкой информации. Что же делать, как избежать этого багга? Есть способ. Итак рассмотрим поближе 2 последних вида переменных. [color=orange]Глабальные переменные, локальные переменные.[/color] Само слово глобальные, вам не о чём не говорит? Слово глобальный ассоциируется с чём то большим, влияющим на всё, распространнёным. Этот вид переменных можно задействовать во всём редакторе, скажем если необходимо создать скилл который каждую 1 секунду отнимал 20 жизни юнита, то нужно создать 2 триггера: А вот локальные переменные, могут использоваться только в одном триггере, и то их нельзя создавать путём создания глобальных переменных. Для того чтобы создать локальную переменную нужно сделать вот такое действие: Личный сценарий - в появившемся окне вбиваем: local "ТИП ПЕРЕМЕННОЙ" "НАЗВАНИЕ ПЕРЕМЕННОЙ" ОЧЕНЬ ВАЖНО!Все локальные переменные можно создать только в начале триггера, ПОВЕРХ всех остальных действий, иначе редактор выдаст ошибку и заблокирует ваш триггер. В разных триггерах можно создавать переменные с одинаковыми именами, это не влияет на работу остальных локальных переменых и не выдаёт ошибки. При каждом запуске триггера создастся свой набор локальных переменых, никак несвязанный с предыдущим набором. При завершении всех действий триггера, локальные переменные удаляются. Кроме переменной типа unit, чтобы удалить эту переменную во избежания утечек памяти, после использования этой переменной следует сделать такое действие: Личный сценарий - set "НАЗВАНИЕ ПЕРЕМЕННОЙ ТИПА unit" = null Итак, вернёмся к нашему примеру: Так как локальные переменные создаются при каждом запуске триггера и удаляются после завершения действий и никак не связаны с другими наборами локальных переменных в этом случае именно они станут решением нашей проблемы. Для начала запишем требуемого юнита в глобальную переменную: Итак наш юнит занесён в глобальную переменную, теперь мы можем прировнять какую либо локальную переменную к ней. Добавлю в триггер несколько действий "Личный сценарий". Пока что почти ничего не ясно, но мы быстро это исправим. В начале триггера написана строчка "local unit u", как вы уже догадываетесь, я создал локальную переменную типа unit с названием u. Идём далее, следующая строчка это "set udg_unit = u" - слово с английского переводится как равно, прировнять, сравнить, значит только что в переменную u был записан наш юнит, и значит он полностью в безопасности, и не произойдёт никаких утечек, так как действия локальных переменных в одном запуске триггера никак не связанно с другими действиями переменных в этом же триггере при вторичном запуске. Но что же значит то что написанно перед названием переменной unit? Дело в том что в jass'e принято перед всеми глобальными переменными приписывать приставку "udg_", что не очень удобно, ну что делать, таковы правила. далее идёт отсчёт 5 секунд, после этого сново одна jass строчка! set udg_unit = u, догадываетесь что это значит? Мы записали в глобальную переменную unit значение переменной u, тем самым позволяя себе продолжать запланированные действия, а далее мы освобождаем нашего юнита из оков. И последняя строчка нашего триггера это: set u = null, как вы догодались, мы удаляем локальную переменную, а точнее обнуляем. Это был довольно простой пример использования локальных переменных, если вы его освоите, то вы сможете уйти намного дальше. Сможете юзать их в самых затруднительных обстоятельствах, когда казалось бы это невозможно. Но, не путайтесь, локальные переменные не могут защитить против событий времяожидания! Только против действий типа "ждать". Статья написанна не для специалистов, а для триггерщиков, что освоили основы ГУИ и глобальные переменные. Вопросы что возникнут, спрашивать в этой теме. Спасибо за внимание.
Типы локальных переменных. Часть типов локальных переменных _____________________________________________________________________________________________ Боевая еденица - unit _____________________________________________________________________________________________ Способность - integer _____________________________________________________________________________________________ Декорация - destructable _____________________________________________________________________________________________ Разрушаемый обьект - integer _____________________________________________________________________________________________ Диалог - dialog _____________________________________________________________________________________________ Кнопка диалога - button _____________________________________________________________________________________________ Плавающий текст - texttag _____________________________________________________________________________________________ Картинка - image _____________________________________________________________________________________________ Целочисленная - integer _____________________________________________________________________________________________ Тип предмета - integer _____________________________________________________________________________________________ Предмет - item _____________________________________________________________________________________________ Лидерборд - leaderboard _____________________________________________________________________________________________ Игрок - player _____________________________________________________________________________________________ Точка - location _____________________________________________________________________________________________ Реальная - real _____________________________________________________________________________________________ Область - rect _____________________________________________________________________________________________ Cпецэфект - effect _____________________________________________________________________________________________ Cтрока - string _____________________________________________________________________________________________ Таймер - timer _____________________________________________________________________________________________ Отряд - group _____________________________________________________________________________________________ Погодный эффект - weathereffect _____________________________________________________________________________________________ ______________________________ _______________________________________________________________
Про шанс что юнит подохнет я ничего не говорил, я к тому, что утечек при выборе существующего юнита не бывает, ну или почти не бывает (у меня ещё ни разу не было).
Я уверен, что те кто в редакторе 2 неделю, не станут даже в азы jass'a не станут лезть. А когда уже начнут осваивать они сами допрут до более рационального способа.
омг напали. Статья норм и всё тут правильно. Не 1 норм скилл если он не у 1го героя на карте не обойдётся без локальных переменных. И локальные переменные можно юзать не только для юнита.
Дата: Понедельник, 30.08.2010, 11:44 | Сообщение # 14
Ветеран сайта.
Группа: CуперМодераторы
Сообщений: 231
Статус: Отсутсвует
Quote (|san9|)
омг напали. Статья норм и всё тут правильно. Не 1 норм скилл если он не у 1го героя на карте не обойдётся без локальных переменных. И локальные переменные можно юзать не только для юнита.