Ninbous
Jass progress >>>>>35/100
offline
Опыт:
5,674Активность: |
Очередность выполнения функций
Допустим у нас есть вот такй триггер
, то функция Slow выполниться доконца или она дойдет до Таймера и потом начнется функция damage а после нее продолжится выполнение Slow? В общем мне нужно сделать абилку которая в течение 10 сек будет наносить урон раз в секунду. Отредактировано Ninbous, 08.03.2010 в 05:08. |
08.03.2010, 03:55 | #1
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Enein
Silenced by ZlaYa1000
offline
Опыт:
43,583Активность: |
шо за бред
а таймер будет работать параллельно |
08.03.2010, 03:58 | #2
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Ninbous
Jass progress >>>>>35/100
offline
Опыт:
5,674Активность: |
Изучаю таймеры ) Ninbous добавил:
Как ссделать ДОТ? Enein, можно от тебя пример с простейшим кодом? Допустим скилл в течение 10 секунд будет каждую секунду наносить цели урон. Немогу разобраться в очередности выполнения и как вообще это представить себе =/
Ninbous добавил: А если запустить таймер call TimerStart(tm,1,true,function damage) еще раз, когда до этого тот же таймер не успел закончиться, что будет? ТАймер обнавиться или создатся еще один? |
08.03.2010, 04:07 | #3
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Enein
Silenced by ZlaYa1000
offline
Опыт:
43,583Активность: |
перезапустится нельзя. спать. |
08.03.2010, 04:09 | #4
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Ninbous
Jass progress >>>>>35/100
offline
Опыт:
5,674Активность: |
Стой, хотябы проверь мой
Правильно? |
08.03.2010, 04:12 | #5
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Enein
Silenced by ZlaYa1000
offline
Опыт:
43,583Активность: |
нет, неправильно. в корне неправильно |
08.03.2010, 04:19 | #6
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Ninbous
Jass progress >>>>>35/100
offline
Опыт:
5,674Активность: |
>_< Блин снова перечитывать статью, тем более она уже устарела...Пункты 11, 13 и 14 можно выкинуть.
Про таймеры там нислова... Ninbous добавил: Все время слышу что Таймер заменяет вэйт, но тут никак не обойтись без вэйта, вся функция выполянется мгновенно... голова кругом идет уже |
08.03.2010, 04:42 | #7
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
FellGuard
Losyash
offline
Опыт:
39,547Активность: |
FellGuard добавил:
Пример на цинке, вдруг будет более наглядным... Анонимные функции в этом плане добавляют читабельности и понимания.
|
08.03.2010, 09:09 | #8
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
AlexKARASb
Learning cpp
offline
Опыт:
22,103Активность: |
Цитата:
можеш пожалуйста обьяснить где же задержку ты сделал Ну мои представления: после call TmerStart(timer, r_p............) включится другая функция почти мгновенно один раз, или же? она подождет время r_period? и потом начнет действовать |
|
08.03.2010, 11:04 | #9
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
FellGuard
Losyash
offline
Опыт:
39,547Активность: |
|
08.03.2010, 11:10 | #10
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
AlexKARASb
Learning cpp
offline
Опыт:
22,103Активность: |
FellGuard, большое спасибо
|
08.03.2010, 11:12 | #11
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Sebra
offline
Опыт:
5,603Активность: |
Типа так. |
08.03.2010, 12:30 | #12
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Mr_ILYAS
Kicked by XimikS
offline
Опыт:
492Активность: |
лучше вместо категорий ставить ссылку от таймера, так более грамотно, дабы избегать коллизий.
хотя в принципе Sebra написал все правильно, но лучше будет >> так:
function damage takes nothing returns nothing
local timer tm=GetExpiredTimer() истёкший таймер, тот самый который запустили ниже. local unit t=LoadUnitHandle(udg_ht,GetHandleId(tm),1) local unit u=LoadUnitHandle(udg_ht,GetHandleId(tm),2) local integer i=LoadInteger(udg_ht,GetHandleId(tm),3) call UnitDamageTarget(u,t,1,false,false,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_NORMAL,WEAPON_TYPE_WHOKNOWS) set i=i+1 if (i==10) then call PauseTimer(tm) Не забываем его паузить перед уничтожением ! ! ! call DestroyTimer(tm) если то, ради чего мы все затеяли. выполнилось, то таймер можно уничтожать. call FlushChildHashtable(udg_ht,GetHandleId(tm)) очищаем всё, что находилось в хеш-таблице в категории GetHandleId(tm) else call SaveInteger(udg_ht,GetHandleId(tm),3,i) endif set u=null обнуляем абсолютно все переменные (кроме типов real, integer, boolean, player и еще какие-то, не помню . . .) set t=null set tm=null endfunction function Trig_Slow_Actions takes nothing returns nothing
local unit u=GetTriggerUnit() local unit t=GetSpellTargetUnit() local timer tm=CreateTimer() local integer i=1 call SaveUnitHandle(udg_ht,GetHandleId(tm),1,t) call SaveUnitHandle(udg_ht,GetHandleId(tm),2,u) call SaveInteger(udg_ht,GetHandleId(tm),3,i) call TimerStart(tm,1,true,function damage) set u=null set t=null set tm=null endfunction << Пока я исправлял код, заметил несколько недочётов: • Во-первых, не нужно писать SaveIntegerHandle, ибо можно просто SaveInteger (это касается тех типов, что выше перечислял) • Во-вторых, каждая глобальная переменная в коде должна иметь приставку udg_ Так же прошу обратить внимание на то, как сохраняем данные. Ибо этим способом лучше, так как в конце можно разом все данные очистить (то есть очистить целиком категорию без гемороя)
FellGuard зачем ты ему подсказываешь тем, что ему и так не дано понять. Он пока обычный jass не выучил, а ты ему иными формами Jass'a грузишь.
Ninbous, в общем, расскажу полную суть картины: Запускаешь таймер с нужным тебе периодом, и ждать подходящих условий или времени, когда его надо выключать, нужно внутри функции таймера (в нашем случае это функция damage) можно в принципе и отсчитывать каждый тик таймера, как ты и сделал с помощью integer i, и затем отключать его при нужной величине i. Отредактировано Mr_ILYAS, 08.03.2010 в 20:55. |
08.03.2010, 13:41 | #13
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Toadcop
offline
Опыт:
54,313Активность: |
Цитата:
тока все действия выполняютса ТОКА по очереди. т.е. асинхроных выполнений нету. так что вся логика предсказуема. |
|
08.03.2010, 13:51 | #14
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Ninbous
Jass progress >>>>>35/100
offline
Опыт:
5,674Активность: |
Mr_ILYAS, спасибо за подробный ответ, то что нада паузить таймер перед уничтожением этого я не знал, остальное мне извесно, кроме пожалуй того что можно вместо SaveIntegerHandle просто SaveInteger писать, но это не очень важно.
Приставку udg_ надо добавлять если глобал переменая была стоздана через редактор переменных, у меня же она создана просто кодом. Главное что я понял - это когда рабоает таймер с повторением то вызываемая функция не будет переписывать переменные кторые записались перед ней. Пойду проверять... Ninbous добавил:
А зачем? При новом касте там все равно же перезапиштся или останется висеть? |
09.03.2010, 02:49 | #15
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Cheguevara
offline
Опыт:
383Активность: |
Цитата:
останется висеть. ибо при новом касте создастся новый таймер с новым Id =) Cheguevara добавил: вот какбы тоже вариант кода Код:
|
|
09.03.2010, 03:33 | #16
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Ninbous
Jass progress >>>>>35/100
offline
Опыт:
5,674Активность: |
Ясно, спасибо.
Как сделать чтобы при повторном касте на этого же юнита при условии, что старый ДОТ(бафф) еще висит на нем, обновлять таймер? (Тоесть чтобы доты не стакивались на 1 юните, старый таймер уничтожать и создавать при этом новый.) Нужно будет использвать глобальные переменны и массивы... наверно. Я незнаю как сделать.. Если поможете я буду рад, если нет, то все равно спасибо за помощь :) Ninbous добавил: Cheguevara, ужас. Какие то скобочки, функции без названий и непонятные штуки вроде этой "a.inkr()" |
09.03.2010, 03:54 | #17
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Cheguevara
offline
Опыт:
383Активность: |
т.е., старый таймер обнулять и ставить новый? или оставить старый и не ставить новый?
Cheguevara добавил: Цитата:
хз=) это удобне, т.к. не надо писать "call", "func/endfunc" и.т.д.=) |
|
09.03.2010, 03:57 | #18
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Mr_ILYAS
Kicked by XimikS
offline
Опыт:
492Активность: |
в принципе не мойму чем тяжело писать 4 буковки call |
09.03.2010, 04:00 | #19
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Ninbous
Jass progress >>>>>35/100
offline
Опыт:
5,674Активность: |
т.е. старый удалить, новый с начала начать |
09.03.2010, 04:10 | #20
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|