local timer t = CreateTimer() call TimerStart(t, период, одноразовый\многоразовый(false\true), функция которую таймер должен исполнять по истечению времени).
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
Сообщение отредактировал lawson - Пятница, 15 Апреля 2011, 20:18:06
lawson к примеру мне надо нанести урон, подаждать 2 сек. и снизить скорость передвижения юнита, то мне придётся создать две функции: в первой снижения скорости юнита, а во второй нанесения урона и запуск таймера с указанием на первую функцию? И что значит "одноразовый\многоразовый"?
Сообщение отредактировал Titans - Пятница, 15 Апреля 2011, 20:51:34
Это значит что функция которую таймер будет выполнять по истечению времения. будет выполняться один раз. В функциии где ты наносишь урон создай таймер по истечению которого будет выполняться функция где юнит замедляется.
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
Сообщение отредактировал lawson - Пятница, 15 Апреля 2011, 21:24:37
А как локальные переменные перенести в другую функцию? Можете показать на примере?
Code
function Move01 takes nothing returns nothing if ( RectContainsUnit(Region_move, Hero) == true ) then call DoNothing( ) else call SetUnitManaBJ( Hero, ( GetUnitStateSwap(UNIT_STATE_MANA, Hero) - 20.00 ) ) endif endfunction
function Move00 takes nothing returns nothing local unit Hero = GetEnumUnit() local rect Region_move = RectFromCenterSizeBJ(GetUnitLoc(Hero), 30.00, 30.00) local timer Wait = CreateTimer() if ( GetUnitStateSwap(UNIT_STATE_MANA, Hero) <= 20.00 ) then call PauseUnitBJ( true, Hero ) else call TimerStart(Wait, 0.80, false, function Move01) endif endfunction
function Trig_Move_Actions takes nothing returns nothing call ForGroupBJ( GetUnitsInRectAll(GetEntireMapRect()), function Move00 ) endfunction
//=========================================================================== function InitTrig_Move takes nothing returns nothing set gg_trg_Move = CreateTrigger( ) call TriggerRegisterTimerEventPeriodic( gg_trg_Move, 0.80 ) call TriggerAddAction( gg_trg_Move, function Trig_Move_Actions ) endfunction
Мне надо чтоб функция Move01 имела переменные Hero, Region_move.
Сообщение отредактировал Titans - Пятница, 15 Апреля 2011, 22:09:46
Вот как должно выглядеть твои функции на норамльном JASS.
Code
function Move00 takes nothing returns nothing local unit Hero = GetEnumUnit() local rect Region_Move = Rect(GetUnitX(Hero) - 30, GetUnitY(Hero) - 30, GetUnitX(Hero) + 30, GetUnitY(Hero) + 30) local timer Wait = CreateTimer() if (GetUnitState(Hero, UNIT_STATE_MANA) <= 20) then call PauseUnit(Hero, true) else call TimerStart(Wait, 0.80, false, function Move01) call SaveRectHandle(Hash, GetHandleId(Wait), 0, Region_Move) - сохранит в хеш область вокруг юнита call SaveUnitHandle(Hash, GetHandleId(Wait), 0, Hero) - сохранит самого юнита в хеш endif call RemoveRect(Region_Move) set Region_Move = null set wait = null set Hero = null endfunction
function Move01 takes nothing returns nothing local timer t = GetExpiredTimer() local unit u = LoadUnitHandle(Hash, GetHandleId(GetExpiredTimer), 0) - загрузит из хеша юнита local rect r = LoadRectHandle(Hash, GetHandleId(GetExpiredTimer), 0) - загрузит из хеша область вокруг юнита local unit d local group g = CreateGroup() call GroupEnumUnitsInRect(g, r, null) set d = FirstOfGroup(g) if (u != d) then call SetUnitState(u, UNIT_STATE_MANA, GetUnitState(u, UNIT_STATE_MANA) - 20) endif call FlushChildHashtable(Hash, GetHandleId(GetExpiredTimer())) call DestroyGroup(g) call RemoveRect(r) set r = null set g = null set d = null set u = null endfunction
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
Сообщение отредактировал lawson - Пятница, 15 Апреля 2011, 23:07:34
Можно ли использовать локальные переменные в других триггерах не создовая их снова, как глобальные?
Что бы передать локальные переменные из 1 функции в другую не объявляя их снова и без использования хэша, достаточно сделать функцию которая берет какие то значения.
Прим:
jass2 simple
Code
function B takes unit u, integer i, angle a returns nothing ... endfunction
function A takes nothong returns nothing local integer i local unit u ... call B(u,i) endfunction
cJass simple
void B(unit u, int i) { ... }
void A() { int i unit u ... b(u,i)
}
Локалки передавать бесконечно невозможно, т.е. вложенных функций в функцию должно быть не более 3-4(не помню), хотя мб ошибаюсь, но как то столкнулся с тем что вложенные функции тупо отказывались работать из за большого кол-ва.
Так же не советую пренебрегать глобалками, если ими грамотно пользоватся, то они лучше локалок. Для примера, в рамках какой то системы с большим кол-вом функций порой приходится в каждой функции многократно объявлять локалки повторно, в то время как можно было бы использовать набор глобалок. Так же отмечу что далеко не во всех языках локалки быстрее глобалок. В жасс хз как дело с этим обстоит.
Хеш юзать не рекомендую, особенно для длительного хранения больших объемов данных, в особенности если они статичны.
О нас думают плохо лишь те, кто хуже нас, а те кто лучше нас... Им просто не до нас. My Project: Nindogatari MAL
lawson, положи руку на сердце и скажи - этот твой пример работает?)) думаю нет. нельзя вызывать функцию стоящую ниже, вызываемая функция должна быть сверху (это я топикстартеру говорю на всякий)
Ещё один вопрос по локальным переменным. Как правильно записат локальную переменную типа "integer array"? Сначала её надо объявить, а потом присваивать где надо? У меня в триггере она не работает, тоесть я сначала объявляю её, потом проверяю что в ней записано, а потом присваиваю.
Сообщение отредактировал Titans - Суббота, 07 Мая 2011, 22:54:30
Titans, Мда тебе еще основы надо читать. Переменные с массивами сначала объявляються а только потом устанавливать в них значения. Такие перменные должны указываться с номером ячейки(целоисчислительная) в которую ты записываешь значение.
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
Сообщение отредактировал lawson - Суббота, 07 Мая 2011, 23:23:44
local integer array A if (A >= 10) call DisableTrigger( GetTriggeringTrigger() ) endif set A[0] = A[0] + 1 set A[1] = A[1] + 1
Добавлено (08-05-2011, 00:09) --------------------------------------------- А всё sorry, забыл "then" дописать и из за этого не работала переменная, хотя при сохранении карты We не выдал ошибки.
Нет так нельзя. У переменной массива всегда должен быть номер ячейки в которую записано знчение. тоесть в твоем случае local array integer i set i[0] = 10 if (i[0] >= 10) then call DisabelTrigger() endif set i[0] = i[0] + 1 set i[1] = i[0] + 1 set i[2] = i[0] + i[1] i - переменная []- здесь указываеться номер ячейки, [1] - 1 - это номер ячейки.
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
Сообщение отредактировал lawson - Воскресенье, 08 Мая 2011, 01:02:27
local integer array A set A[0] = A[0] set A[1] = A[1] set A[2] = A[2] if (A[0] + A[1] + A[2] >= 10) then call DisableTrigger( GetTriggeringTrigger() ) else set A[0] = A[0] + 1 set A[1] = A[1] + 1 set A[2] = A[2] + 1 endif
Сообщение отредактировал Titans - Воскресенье, 08 Мая 2011, 11:41:53