яЕвгений
offline
Опыт:
568Активность: |
Вопросы связанные с local trigger
(Скажу заранее, что Jass у меня находиться в стадии сааамого начального изучения)
Вобщем читал я статью и про локальные переменные, и про,собственно говоря, локальный триггер в частности. Как-то залил по форуму, скачивал разные нароботки(старался скачать по проще, что-бы я смог лучше понять принцип их работы ну и тд.). Короче наткнулся на подобный код:
(К события и действия не принципиальны, факт в том, что это работает как 2 разных трига.позже поясню)
На деле его принцип, заключается в том, что если игрок вводит в чат TestString01, то запускается функция func01, а если он вводит TestString02 то,соответственно запускается функция TestString02. (Мне важно разобраться в триггере,нежели получить этот эффект, так как на данном примере я лишь пытаюсь понять работу локальных триггеров, так что ответы типа "Это всё можно сделать по-другому и гораздо проще" не принимаются) Щас объясню то, что понял я.
Ну тут я понял,что для функции InitTrig_TestTrigger(дада, я вижу что это инициализация трига) создаёться локальная переменная t типа триггер.
Сразу хочу заметить(мб пригодиться, что бы в случае ошибки меня кто-то поправил), что локальный триггер t создаёться для функции InitTrig_TestTrigger,которая в свою очередь запускаеться всего один раз за игру(Кэп, но всё же).
А вот с этого момента у меня начались некоторые непонятки...
1.Как я понял тут мы создаём триггер с названием t Какой триггер? Т.е. он будет существовать с определённым событием и действием, но из другой(отличной от InitTrig_TestTrigger) функции ему нельзя будет добавить(удаить и тд, не важно что), к примеру, событие или действие, так?
Тут в принципе без вопросов.
А вот тут то я в конец запутался...
Ведь тут мы создаём ещё один триггер(локальный?) с названием t, так? И он будет самодостаточен от предыдущего трига(локального?) с тем же названием? Т.е. мы тут, по сути, получаем 2 разных триггера? Вобщем основной вопрос звучит как-то так... Вопрос в догоночку. Что будет, если в конце функции InitTrig_TestTrigger мы присвоим локальной переменной t значение null?) |
14.07.2010, 00:09 | #1
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
JassMan
свободен
offline
Опыт:
4,193Активность: |
первая строка мы создали переменную с нужным именем и типом
ниже строкой мы присвоили этой переменной значение (тут надо зайти с задней двери, на самом деле мы создаём триггер и присваиваем ему значение) кстати эту штуку можно написать одной строкой : local trigger t=CreateTrigger() То есть можно сразу при создании переменной присваивать её значение, а можно и потом, как это сделано тут ниже строкой. Разницы нет, но не всегда выгодно сразу присваивать значение, можно сделать это потом. . . Пример: Допустим у нас есть триггер, который реагирует на событие. . .ну, к примеру, что юнит использовал способность Благодать и нам нужно чтобы целью была нежить, а не союзники. Разберём маленький код:
Как видно, мы не стали писать local group g=CreateGroup() — а вдруг целью была бы не нежить, а союзник? — Поэтому мы сначала делаем проверку и только потом если всё как надо, то присваиваем значение, тоесть создаём группу. Это грамотно иначе бы у нас группа создавалась бы в любых случаях. Что приводило бы к лишнему засорению памяти игры.
Ну а если нет таких нюансов то можно и сразу присваивать значение __________________________________________________________________________________________________________________ по поводу последнего вопроса:
ничего не будет, ты просто очищаешь переменную — удаляешь ссылку (ярлык удаляешь так сказать) Отредактировано JassMan, 14.07.2010 в 01:22. |
14.07.2010, 00:28 | #2
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Alex_Hell
Mapmaker 'N' Programmer
offline
Опыт:
6,885Активность: |
function InitTrig_TestTrigger скорее всего вызывается у тебя при инициализации карты.. когда на GUI создаеш триггер и переводиш его в текст получается почти тоже самое, но переменная типа "триггер" уже создана и является глобальной с именем gg_trg_<NAME>... а в функции InitTrig_<NAME> присваивается значение этой глобалке-триггеру и добавляются события, условия, действия этой переменной.. по-сути функция InitTrig_TestTrigger является только обычной функцией инициализации, она не является триггером как таковым, поэтому внутри нее можно создать сколько угодно глобальных, локальных триггеров и добавить им события и тд.
Если внутри этой же функции написать
последней строкой (при этом нужна глобалка udg_MyTrig типа "триггер") то из любого другого места скрипта ты сможеш обращаться к триггеру
Если t присвоить null ниче не измениться ведь t - это только ссылка на реальный триггер в памяти вара.. |
14.07.2010, 01:06 | #3
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Master_chan
Полуночный командир
offline
Опыт:
15,660Активность: |
Alex_Hell правильно говорит. Забудь про переменную, это всеголишь ссылка. Функция CreateTrigger() создает пустой триггер, тоесть в нем еще нету ни действий ни событий. Две следующие фунции добавляют в этот пустой триггер собственно событие (реагирование на введенную строку) и действие (вызов функции func02). Дальше мы создаем еще один пустой триггер, при этом ссылка на старый триггер теряется, НО сам он остается и продолжает работать. |
14.07.2010, 01:17 | #4
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
яЕвгений
offline
Опыт:
568Активность: |
Такс. Либо вы недопоняли вопрос, либо я недопонял ответ. Темнемение из ваших слов я всёравно черпнул то,что раньше не знал =)
Начнём по порядку. На этот раз я подготовился по серьёзней. Т.е. у меня на руках(на всякий случай) есть код,который и работает(только что написал) и подчёркивает то, что я имел в виду.
Комментирую.
Эффект: Если игрок вводит в чат "01" то появляеться "Hello1" с "02" соответсвенно появляется "Hello2". Это я к тому,что кто-то писал что будет реагировать на любой текст("01" или "02").Правда щас вот перечитываю, и не вижу такого ответа... "Отвечаю на ответы":
Выводы которые я сделал для себя(Правильные или нет?):
|
14.07.2010, 02:53 | #5
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
ScorpioT1000
Работаем
offline
Опыт: отключен
|
никогда не рекомендую так делать, т.е. если триггер у тебя есть в памяти, то и ссылка на него должна быть (в данном случае глобальная). Теоретически это считается утечкой, ведь доступа к триггеру после выполнения функции мы уже фактически не имеем, хотя на практике это не принесёт никакого вреда. Т.е. "хороши тон" не терять управление объектами в памяти. |
14.07.2010, 05:10 | #6
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
JassMan
свободен
offline
Опыт:
4,193Активность: |
Если локальная то обнулять надо обязательно в конце функции все переменные кроме типов: boolean, integer, real, player, string — ибо по завершению функции всё само сделается. |
14.07.2010, 09:54 | #7
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Sergarr
offline
Опыт:
4,677Активность: |
А лучше обнулять все, на всякий случай... |
14.07.2010, 10:29 | #8
+0/−1
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
SRes
1110101000
offline
Опыт:
9,997Активность: |
яЕвгений, Обнулять или не обнулять ссылку на триггер - это крупица на пляже, утечка от этого призрачная.
Триггера нет, ты имеешь только ссылку на него, т.е. ты знаешь что он по адресу (например) 3001, но сам этого не видишь, а когда передаешь в нативки ссылку на него - вар к нему обращается. Когда ты делаешь переменную типа триггер - ты делаешь ссылку на триггер, но изначально она пуста, создаешь новый триггер - в переменной ссылка на него. Если обнулить ссылку то с триггером ничего не станет, абсолютно. Ибо это всего-лишь ссылка. ScorpioT1002, Да, хороший тон, но учитывая что вар сам по себе удаляет этот триггер, а автору темы не надо его удалять самому - это нонсенс. Sergarr, Бред, все типы кроме handle (и всех кто от него происходит) обнулять не надо. |
14.07.2010, 11:14 | #9
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
яЕвгений
offline
Опыт:
568Активность: |
Про "хороший тон" - запомню =)
Такс.Ладно. Разобрался. Всем спасибо! |
14.07.2010, 11:45 | #10
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|