XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов> Jass
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Закрытая тема
 
яЕвгений

offline
Опыт: 568
Активность:
Вопросы связанные с local trigger
(Скажу заранее, что Jass у меня находиться в стадии сааамого начального изучения)
Вобщем читал я статью и про локальные переменные, и про,собственно говоря, локальный триггер в частности.
Как-то залил по форуму, скачивал разные нароботки(старался скачать по проще, что-бы я смог лучше понять принцип их работы ну и тд.). Короче наткнулся на подобный код:
function InitTrig_TestTrigger takes nothing returns nothing
    local trigger t
        set t = CreateTrigger()
	call TriggerRegisterPlayerChatEvent( gg_trg_sss, Player(0), "TestString01", true )
        call TriggerAddAction(t, function func01)
        set t = CreateTrigger()
	call TriggerRegisterPlayerChatEvent( gg_trg_sss, Player(0), "TestString02", true )
        call TriggerAddAction(t, function func02)
endfunction     
(К события и действия не принципиальны, факт в том, что это работает как 2 разных трига.позже поясню)
На деле его принцип, заключается в том, что если игрок вводит в чат TestString01, то запускается функция func01, а если он вводит TestString02 то,соответственно запускается функция TestString02.
(Мне важно разобраться в триггере,нежели получить этот эффект, так как на данном примере я лишь пытаюсь понять работу локальных триггеров, так что ответы типа "Это всё можно сделать по-другому и гораздо проще" не принимаются)
Щас объясню то, что понял я.
local trigger t
Ну тут я понял,что для функции InitTrig_TestTrigger(дада, я вижу что это инициализация трига) создаёться локальная переменная t типа триггер.
Сразу хочу заметить(мб пригодиться, что бы в случае ошибки меня кто-то поправил), что локальный триггер t
создаёться для функции InitTrig_TestTrigger,которая в свою очередь запускаеться всего один раз за игру(Кэп, но всё же).
set t = CreateTrigger()
"" 
А вот с этого момента у меня начались некоторые непонятки...
1.Как я понял тут мы создаём триггер с названием t
Какой триггер? Т.е. он будет существовать с определённым событием и действием, но из другой(отличной от InitTrig_TestTrigger) функции ему нельзя будет добавить(удаить и тд, не важно что), к примеру, событие или действие, так?
call TriggerRegisterPlayerChatEvent( gg_trg_sss, Player(0), "TestString01", true )
call TriggerAddAction(t, function func01)
Тут в принципе без вопросов.
set t = CreateTrigger()
call TriggerRegisterPlayerChatEvent( gg_trg_sss, Player(0), "TestString02", true )
call TriggerAddAction(t, function func02)
А вот тут то я в конец запутался...
Ведь тут мы создаём ещё один триггер(локальный?) с названием t, так? И он будет самодостаточен от предыдущего трига(локального?) с тем же названием?
Т.е. мы тут, по сути, получаем 2 разных триггера?
Вобщем основной вопрос звучит как-то так...
Вопрос в догоночку. Что будет, если в конце функции InitTrig_TestTrigger мы присвоим локальной переменной t значение null?)
Старый 14.07.2010, 00:09
JassMan
свободен
offline
Опыт: 4,193
Активность:
первая строка мы создали переменную с нужным именем и типом
ниже строкой мы присвоили этой переменной значение (тут надо зайти с задней двери, на самом деле мы создаём триггер и присваиваем ему значение)
кстати эту штуку можно написать одной строкой : local trigger t=CreateTrigger()
То есть можно сразу при создании переменной присваивать её значение, а можно и потом, как это сделано тут ниже строкой. Разницы нет, но не всегда выгодно сразу присваивать значение, можно сделать это потом. . .
Пример:
Допустим у нас есть триггер, который реагирует на событие. . .ну, к примеру, что юнит использовал способность Благодать
и нам нужно чтобы целью была нежить, а не союзники.
Разберём маленький код:
local group g
local unit u=GetSpellTargetUnit() //юнит на которого воздействовали способностью
if IsUnitType(u,UNIT_TYPE_UNDEAD)==true)then
    set g=CreateGroup()
endif
Как видно, мы не стали писать local group g=CreateGroup() — а вдруг целью была бы не нежить, а союзник? — Поэтому мы сначала делаем проверку и только потом если всё как надо, то присваиваем значение, тоесть создаём группу. Это грамотно иначе бы у нас группа создавалась бы в любых случаях. Что приводило бы к лишнему засорению памяти игры.
Ну а если нет таких нюансов то можно и сразу присваивать значение
____________________________________________________________________________________________________​______________
по поводу последнего вопроса:
ничего не будет, ты просто очищаешь переменную — удаляешь ссылку (ярлык удаляешь так сказать)

Отредактировано JassMan, 14.07.2010 в 01:22.
Старый 14.07.2010, 00:28
Alex_Hell
Mapmaker 'N' Programmer
offline
Опыт: 6,885
Активность:
function InitTrig_TestTrigger скорее всего вызывается у тебя при инициализации карты.. когда на GUI создаеш триггер и переводиш его в текст получается почти тоже самое, но переменная типа "триггер" уже создана и является глобальной с именем gg_trg_<NAME>... а в функции InitTrig_<NAME> присваивается значение этой глобалке-триггеру и добавляются события, условия, действия этой переменной.. по-сути функция InitTrig_TestTrigger является только обычной функцией инициализации, она не является триггером как таковым, поэтому внутри нее можно создать сколько угодно глобальных, локальных триггеров и добавить им события и тд.
Если внутри этой же функции написать
set udg_MyTrig = t
последней строкой (при этом нужна глобалка udg_MyTrig типа "триггер") то из любого другого места скрипта ты сможеш обращаться к триггеру
set t = CreateTrigger()
call TriggerRegisterPlayerChatEvent( gg_trg_sss, Player(0), "TestString02", true )
call TriggerAddAction(t, function func02)
Если t присвоить null ниче не измениться ведь t - это только ссылка на реальный триггер в памяти вара..
Старый 14.07.2010, 01:06
Master_chan
Полуночный командир
offline
Опыт: 15,660
Активность:
Alex_Hell правильно говорит. Забудь про переменную, это всеголишь ссылка. Функция CreateTrigger() создает пустой триггер, тоесть в нем еще нету ни действий ни событий. Две следующие фунции добавляют в этот пустой триггер собственно событие (реагирование на введенную строку) и действие (вызов функции func02). Дальше мы создаем еще один пустой триггер, при этом ссылка на старый триггер теряется, НО сам он остается и продолжает работать.
Старый 14.07.2010, 01:17
яЕвгений

offline
Опыт: 568
Активность:
Такс. Либо вы недопоняли вопрос, либо я недопонял ответ. Темнемение из ваших слов я всёравно черпнул то,что раньше не знал =)
Начнём по порядку. На этот раз я подготовился по серьёзней. Т.е. у меня на руках(на всякий случай) есть код,который и работает(только что написал) и подчёркивает то, что я имел в виду.
function func01 takes nothing returns nothing
call DisplayTextToPlayer(Player(0), 0, 0, "Hello1")
endfunction

function func02 takes nothing returns nothing
call DisplayTextToPlayer(Player(0), 0, 0, "Hello2")
endfunction


function InitTrig_qqq takes nothing returns nothing
    local trigger t
        set t = CreateTrigger()
	call TriggerRegisterPlayerChatEvent( t, Player(0), "01", true )
        call TriggerAddAction(t, function func01)
        set t = CreateTrigger()
	call TriggerRegisterPlayerChatEvent( t, Player(0), "02", true )
        call TriggerAddAction(t, function func02)
endfunction     
Комментирую.
Эффект:
Если игрок вводит в чат "01" то появляеться "Hello1" с "02" соответсвенно появляется "Hello2".
Это я к тому,что кто-то писал что будет реагировать на любой текст("01" или "02").Правда щас вот перечитываю, и не вижу такого ответа...
"Отвечаю на ответы":
function InitTrig_TestTrigger скорее всего вызывается у тебя при инициализации карты..
  1. Это не инициализация карты. (галочки на "Продолжить инициализацию карты" нету. Да и как заготовку я брал абсолютно пустой триггер)
Если t присвоить null ниче не измениться ведь t - это только ссылка на реальный триггер в памяти вара..
  1. хмм...ссылка говорите? Спасибо, не знал)
А с точки зрения утечек\оптимизации её стоит обнулять(нулл) в конце функции?(Изначально я подразумивалл именно этот вопрос,когда спрашивал про нулл)
  1. Я хоть и начинаю изучать жасс, темнемение как добавить к тому или иному тригу события,условия , или в чём отличие локальных переменных от глобальных и тд я в курсе(таки внимательно читал гайды для нубов) =)
Выводы которые я сделал для себя(Правильные или нет?):
  1. Всётаки создаются 2 разных триггера!
  2. Локальному триггеру t в конце кода надо присвоить нулл, так как ссылаться я на неё больше не буду,а своё дело(создание триггов) она выполнила.(Я читал,что желательно обнулять локальные переменные в конце функции)
Старый 14.07.2010, 02:53
ScorpioT1000
Работаем
offline
Опыт: отключен
никогда не рекомендую так делать, т.е. если триггер у тебя есть в памяти, то и ссылка на него должна быть (в данном случае глобальная). Теоретически это считается утечкой, ведь доступа к триггеру после выполнения функции мы уже фактически не имеем, хотя на практике это не принесёт никакого вреда. Т.е. "хороши тон" не терять управление объектами в памяти.
Старый 14.07.2010, 05:10
JassMan
свободен
offline
Опыт: 4,193
Активность:
Если локальная то обнулять надо обязательно в конце функции все переменные кроме типов: boolean, integer, real, player, string — ибо по завершению функции всё само сделается.
Старый 14.07.2010, 09:54
Sergarr

offline
Опыт: 4,677
Активность:
А лучше обнулять все, на всякий случай...
Старый 14.07.2010, 10:29
SRes
1110101000
offline
Опыт: 9,997
Активность:
яЕвгений, Обнулять или не обнулять ссылку на триггер - это крупица на пляже, утечка от этого призрачная.
Триггера нет, ты имеешь только ссылку на него, т.е. ты знаешь что он по адресу (например) 3001, но сам этого не видишь, а когда передаешь в нативки ссылку на него - вар к нему обращается. Когда ты делаешь переменную типа триггер - ты делаешь ссылку на триггер, но изначально она пуста, создаешь новый триггер - в переменной ссылка на него.
Если обнулить ссылку то с триггером ничего не станет, абсолютно. Ибо это всего-лишь ссылка.
ScorpioT1002, Да, хороший тон, но учитывая что вар сам по себе удаляет этот триггер, а автору темы не надо его удалять самому - это нонсенс.
Sergarr, Бред, все типы кроме handle (и всех кто от него происходит) обнулять не надо.
Старый 14.07.2010, 11:14
яЕвгений

offline
Опыт: 568
Активность:
Про "хороший тон" - запомню =)
Такс.Ладно. Разобрался. Всем спасибо!
Старый 14.07.2010, 11:45
Закрытая тема

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 13:25.