Сейчас 21:25:45 Пятница, 22 ноября, 2024 год
[ x ] Главная ⇒ Форум ⇐ RSS Файлы Cтатьи Картинки В о й т и   или   з а р е г и с т р и р о в а т ь с я


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 4
  • 1
  • 2
  • 3
  • 4
  • »
Модератор форума: PUVer, SirNikolas, Ty3uK  
[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,
:D Ты жжошь )

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
Блокировки:
Сорнемус, короче,это действие вешает ссылку на юнита,на "таймер"
и потом считывает с таймера эту ссылку
 

  • Страница 1 из 4
  • 1
  • 2
  • 3
  • 4
  • »
Поиск:

Copyright © 2006 - 2024 Warcraft3FT.info При копировании материалов c сайта ставьте, пожалуйста, активную обратную ссылку на нас • Design by gReeB04ki ©
Хостинг от uCoz