|
|
|
|
[JASSфак] Лекция 2. Локальные переменные.
|
|
[DUОS] | Дата: Четверг, 19 Ноября 2009, 18:15:34 | Сообщение # 1 |
Группа: Заблокированные
Сообщений: 6279
Награды: 9
Репутация: 1708
Блокировки:
| Теперь я расскажу вам о локальных переменных. Локальные переменные - это переменные, которые могут быть использованы только в функции, в которой они объявлены. Объявлять их нужно в самом начале функции, причём до глобальных переменных. Чтобы объявить локальную переменную (в моём примере строку), нужно написать: local string mystring 'local' говорит игре, что переменная локальная. 'string' сообщает тип переменной, которая объявлена. 'mystring' сообщает имя переменной. Существует много видов локальных переменных, я перечислю только самые распространённые: local string s - строка local integer i - целочисленная local real r - реальная local boolean b - логическая local location l - локация local group g - отряд войск local force f - группа игроков В целях оптимизации можно сразу же задать значение переменной. Для этого после объявления переменной нужно поставить знак '=', а после него задать значение. Присвоим таким образом целочисленной i значение "1". local integer i = 1 Другой пример - объявление строки с последующим заданием её значения: local string s = "Текст" Теперь давайте применим полученные знания. Помните триггер из первой лекции? Мы остановились на таком его виде: function Trig_Untitled_Trigger_001_Actions takes nothing returns nothing call DisplayTimedTextToForce( GetPlayersAll(), 30, "hello" ) endfunction //=========================================================================== function InitTrig_Untitled_Trigger_001 takes nothing returns nothing set gg_trg_Untitled_Trigger_001 = CreateTrigger( ) call TriggerAddAction( gg_trg_Untitled_Trigger_001, function Trig_Untitled_Trigger_001_Actions ) endfunction 1) Сделаем строку локальной переменной. 2) Сделаем целочисленную локальной переменной. 3) (Одно из заданий для вас) function Trig_Untitled_Trigger_001_Actions takes nothing returns nothing local string s = "hello" local integer i = 30 call DisplayTimedTextToForce( GetPlayersAll(), i, s ) endfunction //=========================================================================== function InitTrig_Untitled_Trigger_001 takes nothing returns nothing set gg_trg_Untitled_Trigger_001 = CreateTrigger( ) call TriggerAddAction( gg_trg_Untitled_Trigger_001, function Trig_Untitled_Trigger_001_Actions ) endfunction Задания: 1. Найти то, что можно было сделать локальной переменной (пункт 3) 2. По статье "Как оптимизировать код" догадайтесь, как можно оптимизировать действие. 3. Ну и, конечно же, жду ваших шаржей в JASS.
|
|
|
|
Akvarium | Дата: Четверг, 19 Ноября 2009, 18:20:53 | Сообщение # 2 |
8 уровень
Группа: Проверенные
Сообщений: 581
Награды: 1
Репутация: 87
Блокировки:
| УУРРАААА!!!2 урок!!!!Пошел делать задание!!
|
|
|
|
ShadowDragon | Дата: Четверг, 19 Ноября 2009, 18:39:39 | Сообщение # 3 |
10 уровень
Группа: Проверенные
Сообщений: 1564
Награды: 1
Репутация: 286
Блокировки:
| [DUОS], Quote (|DUОS|) 1. Найти то, что можно было сделать локальной переменной (пункт 3) Вот тут: Quote (|DUОS|) call DisplayTimedTextToForce( GetPlayersAll(), i, s ) "GetPlayersAll()" можно было заменить на: Quote (|DUОS|) local force f - группа игроков Правильно? Quote (|DUОS|) 3. Ну и, конечно же, жду ваших шаржей в JASS. Чего именно?
Человечество так низко пало... Даже я за ним не успеваю © Не помню
Сообщение отредактировал ShadowDragon - Четверг, 19 Ноября 2009, 18:40:34 |
|
|
|
[DUОS] | Дата: Четверг, 19 Ноября 2009, 18:41:23 | Сообщение # 4 |
Группа: Заблокированные
Сообщений: 6279
Награды: 9
Репутация: 1708
Блокировки:
| Quote (ShadowDragon) Чего именно? Как в 1-й лекции, импровизаций. Quote (ShadowDragon) "GetPlayersAll()" можно было заменить на: Quote (|DUОS|) local force f - группа игроков Правильно? Не там ищешь) Quote (|DUОS|) 2. По статье "Как оптимизировать код" догадайтесь, как можно оптимизировать действие.
|
|
|
|
Akvarium | Дата: Четверг, 19 Ноября 2009, 19:02:12 | Сообщение # 5 |
8 уровень
Группа: Проверенные
Сообщений: 581
Награды: 1
Репутация: 87
Блокировки:
| ВОТ Какие ошибки? Можно ли еще оптимизировать? ЗЫ: [DUОS], не пинаться)
Сообщение отредактировал Akvarium - Четверг, 19 Ноября 2009, 19:14:18 |
|
|
|
[DUОS] | Дата: Четверг, 19 Ноября 2009, 20:16:56 | Сообщение # 6 |
Группа: Заблокированные
Сообщений: 6279
Награды: 9
Репутация: 1708
Блокировки:
| Akvarium, Ты жжошь ) 1) Тут ифы не нужны. Ты же берёшь всех игроков Значит, нужно написать: call DisplayTimedTextToPlayer(GetLocalPlayer(), 0, 0, i, "[DUOS]: Нет. Переделай.") Этого достаточно! Перечитай статью и поймёшь, почему так. Переменная прибавляется ПОСЛЕ совершения действий. Вот и всё. Правильный код: Code function Trig_A_Actions takes nothing returns nothing local integer i = 30 local string s = "Привет! Это как бэ ДЗ от akvarium по jass. Итак. Начнёмс...PS: Не пытайтесь досмотреть. Это будет 99999999999999999999999999999999 раз ;)" local force f = GetPlayersAll() local integer q = 0 local integer w = 99999999999999999999999999999999 call ShowInterface(false, 0) call DisplayTimedTextToPlayer(GetLocalPlayer(), 0, 0, i, s) call DisplayTimedTextToPlayer(GetLocalPlayer(), 0, 0, i, "Вот моё ДЗ. Правильно?") call TriggerSleepAction( 2 ) call DisplayTimedTextToPlayer(GetLocalPlayer(), 0, 0, i, "[DUOS]: Нет, переделай.") call TriggerSleepAction( 2 ) loop exitwhen q == w set q = q + 1 call DisplayTimedTextToPlayer(GetLocalPlayer(), 0, 0, i, "А теперь правильно?") call TriggerSleepAction( 2 ) call DisplayTimedTextToPlayer(GetLocalPlayer(), 0, 0, i, "[DUOS]: Нет, переделай") call TriggerSleepAction( 2 ) endloop endfunction
//=========================================================================== function InitTrig_A takes nothing returns nothing local trigger trig = CreateTrigger() call TriggerAddAction(trig,function Trig_A_Actions) set trig = null endfunction
|
|
|
|
Akvarium | Дата: Четверг, 19 Ноября 2009, 20:39:18 | Сообщение # 7 |
8 уровень
Группа: Проверенные
Сообщений: 581
Награды: 1
Репутация: 87
Блокировки:
| [DUОS], ок понял. Про ифы и прибавление тоже. ЗЫ: Оценки по истечению недели выставляются? (дневник)
Сообщение отредактировал Akvarium - Четверг, 19 Ноября 2009, 20:49:33 |
|
|
|
[DUОS] | Дата: Четверг, 19 Ноября 2009, 21:04:16 | Сообщение # 8 |
Группа: Заблокированные
Сообщений: 6279
Награды: 9
Репутация: 1708
Блокировки:
| Akvarium, Да.
|
|
|
|
GooGLe | Дата: Четверг, 19 Ноября 2009, 21:31:21 | Сообщение # 9 |
1 уровень
Группа: Пользователи
Сообщений: 15
Награды: 0
Репутация: 0
Блокировки:
| Quote (|DUОS|) local integer w = 99999999999999999999999999999999
|
|
|
|
[DUОS] | Дата: Четверг, 19 Ноября 2009, 21:36:54 | Сообщение # 10 |
Группа: Заблокированные
Сообщений: 6279
Награды: 9
Репутация: 1708
Блокировки:
| GooGLe, Это прикол, там ролик почти бесконечен ))
|
|
|
|
Akvarium | Дата: Четверг, 19 Ноября 2009, 22:02:41 | Сообщение # 11 |
8 уровень
Группа: Проверенные
Сообщений: 581
Награды: 1
Репутация: 87
Блокировки:
| [DUОS], надеюсь в реале таких учеников нет
|
|
|
|
GooGLe | Дата: Четверг, 19 Ноября 2009, 22:19:04 | Сообщение # 12 |
1 уровень
Группа: Пользователи
Сообщений: 15
Награды: 0
Репутация: 0
Блокировки:
| integer - длинное целое со знаком. В диапазон значений не влезает.
|
|
|
|
Сорнемус | Дата: Четверг, 19 Ноября 2009, 22:42:12 | Сообщение # 13 |
9 уровень
Группа: Проверенные
Сообщений: 854
Награды: 0
Репутация: 120
Блокировки:
| Вот Лень было придумывать что всунуть в триггер. Quote (|DUОS|) Вот и всё. Правильный код: Зачем нужно это если оно не используеться: Code local force f = GetPlayersAll() И зачем сделано так: Code local trigger trig = CreateTrigger() call TriggerAddAction(trig,function Trig_A_Actions) set trig = null а не так: Code set gg_trg_Spell = CreateTrigger( ) call TriggerAddAction( gg_trg_Spell, function Trig_Spell_Actions )
Сообщение отредактировал Сорнемус - Пятница, 20 Ноября 2009, 15:35:30 |
|
|
|
[DUОS] | Дата: Четверг, 19 Ноября 2009, 22:54:18 | Сообщение # 14 |
Группа: Заблокированные
Сообщений: 6279
Награды: 9
Репутация: 1708
Блокировки:
| GooGLe, Скоро переведу статью про I2C, тогда дам почитать любителям "Длинных чисел"
|
|
|
|
Akvarium | Дата: Пятница, 20 Ноября 2009, 11:52:08 | Сообщение # 15 |
8 уровень
Группа: Проверенные
Сообщений: 581
Награды: 1
Репутация: 87
Блокировки:
| А как можно оптимизировать эту строку? Code call ForDroupBJ(GetUnitsInRangeOfLocAll(300.00, GetUnitLoc(GetTriggerUnit())), function Trig_A) И почему он пишет что "отсутствует название функции" когда функция с нужным названием существует?
Сообщение отредактировал Akvarium - Пятница, 20 Ноября 2009, 11:52:44 |
|
|
|
[DUОS] | Дата: Пятница, 20 Ноября 2009, 13:46:25 | Сообщение # 16 |
Группа: Заблокированные
Сообщений: 6279
Награды: 9
Репутация: 1708
Блокировки:
| Quote (Akvarium) call ForDroupBJ call ForGroup(GetUnitsInRangeOfLocAll(300.00, GetUnitLoc(GetTriggerUnit())), function Trig_A) ForDroupBJ не существует...
|
|
|
|
Akvarium | Дата: Пятница, 20 Ноября 2009, 14:23:43 | Сообщение # 17 |
8 уровень
Группа: Проверенные
Сообщений: 581
Награды: 1
Репутация: 87
Блокировки:
| [DUОS], опечатка))) А как обращатья к этой функции? (Get***Unit)
|
|
|
|
0x4453 | Дата: Пятница, 20 Ноября 2009, 15:03:45 | Сообщение # 18 |
3 уровень
Группа: Пользователи
Сообщений: 74
Награды: 0
Репутация: 13
Блокировки:
| GetUnitLoc(GetTriggerUnit()) обязательно занести в локалку и ремувить =\
|
|
|
|
Akvarium | Дата: Пятница, 20 Ноября 2009, 15:38:55 | Сообщение # 19 |
8 уровень
Группа: Проверенные
Сообщений: 581
Награды: 1
Репутация: 87
Блокировки:
| 0x4453, ок спс. Quote (Akvarium) А как обращатья к этой функции? (Get***Unit) В ГУИ это выбранный юнит, а тут как?
|
|
|
|
Сорнемус | Дата: Пятница, 20 Ноября 2009, 15:42:46 | Сообщение # 20 |
9 уровень
Группа: Проверенные
Сообщений: 854
Награды: 0
Репутация: 120
Блокировки:
| [DUОS], обьясни пожалуйста принцип действия хеш-таблиц. Вот я на ХГМ нашёл статью, всё вроде-бы понял, но не могу разобраться с примером показаным там. Вот тот пример: Code function Explode takes nothing returns nothing local timer t=GetExpiredTimer() //Получаем таймер, вызвавший данную ф-цию local unit u=LoadUnitHandle(udg_Hash, GetHandleId(t),1) //Загружаем нужного нам юнита
call ExplodeUnitBJ(u) //И взрываем его <img rel="usm" src="http://warcraft3ft.info/image/smiles/smile.gif" border="0" align="absmiddle" alt=":)"> call FlushChildHashtable(udg_Hash, GetHandleId(t)) //Удаляем записи таймера
call DestroyTimer(t) //Обнуляем переменные и “разрушаем” таймер set t=null set u=null endfunction
function Trig_Explode_Actions takes nothing returns nothing local timer t=CreateTimer() //Создаём новый таймер local unit u=GetSpellAbilityUnit() //Заносим в переменную юнита-кастера
set udg_Hash=InitHashtable() //Инициализируем хеш-таблицу, если ранее это действие не выполнялось call SaveUnitHandle(udg_Hash, GetHandleId(t), 1, u) //Сохраняем ссылку на юнита “внутри” таймера call TimerStart(t, 5.00, false, function Explode) //Запускаем таймер
set t=null //Обнуляем переменные set u=null endfunction
function InitTrig_Explode takes nothing returns nothing local trigger t=CreateTrigger() call TriggerRegisterAnyUnitEventBJ( t, EVENT_PLAYER_UNIT_SPELL_CAST ) call TriggerAddAction( t, function Trig_Explode_Actions ) set t=null endfunction Непонятны 2 вещи: 1. "//Сохраняем ссылку на юнита “внутри” таймера" что это значит и зачем это делать? Оо 2. Зачем вобще таймер в функции Explode?
|
|
|
|
[DUОS] | Дата: Пятница, 20 Ноября 2009, 15:51:33 | Сообщение # 21 |
Группа: Заблокированные
Сообщений: 6279
Награды: 9
Репутация: 1708
Блокировки:
| Quote (Сорнемус) //Сохраняем ссылку на юнита “внутри” таймера" что это значит и зачем это делать? Оо Следуешь вешать юнита на хендл таймера -_- Quote (Сорнемус) Зачем вобще таймер в функции Explode? Нужно, чтобы время прошло!Добавлено (20-11-2009, 15:51) ---------------------------------------------
Quote (Akvarium) В ГУИ это выбранный юнит, а тут как? Akvarium, От события зависит...
|
|
|
|
Akvarium | Дата: Пятница, 20 Ноября 2009, 16:00:56 | Сообщение # 22 |
8 уровень
Группа: Проверенные
Сообщений: 581
Награды: 1
Репутация: 87
Блокировки:
| Событие - юнит умирает (в коде все сделано и опримизировано) У меня идет выделить юнитов в 300 от позиции юнита. и сдать фукцию trig_A в это функции мне надо если у выделеного есть предмет то воскресить если нет то ничек ниделать.
Сообщение отредактировал Akvarium - Пятница, 20 Ноября 2009, 16:02:20 |
|
|
|
0x4453 | Дата: Пятница, 20 Ноября 2009, 16:06:51 | Сообщение # 23 |
3 уровень
Группа: Пользователи
Сообщений: 74
Награды: 0
Репутация: 13
Блокировки:
| Akvarium, если группа,то GetEnumUnit() Quote (|DUОS|) Следуешь вешать юнита на хендл таймера -_- не юнита,а его хэндл -_-"
|
|
|
|
Сорнемус | Дата: Пятница, 20 Ноября 2009, 16:14:50 | Сообщение # 24 |
9 уровень
Группа: Проверенные
Сообщений: 854
Награды: 0
Репутация: 120
Блокировки:
| "Спасибо" за очень понятное разьяснение. -_- Нихрена не понял. Ладно, пойду статьи читать.
|
|
|
|
0x4453 | Дата: Пятница, 20 Ноября 2009, 16:36:59 | Сообщение # 25 |
3 уровень
Группа: Пользователи
Сообщений: 74
Награды: 0
Репутация: 13
Блокировки:
| Сорнемус, короче,это действие вешает ссылку на юнита,на "таймер" и потом считывает с таймера эту ссылку
|
|
|
|
|
|
|
|
|
|
|