XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов> Jass
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Ответ
 
Xoniks

offline
Опыт: 1,858
Активность:
Замена Wait таймером
мой первый спелл на джассе но что я полистав форум заметил что все пишут что при использовании wait возможны утечки сделайте пожалуйста мой код без утечек с заменой вайта таймером

Код:
function Trig_Blessing_of_Critical_Conditions takes nothing returns boolean
 return GetSpellAbilityId() == 'Ablo'
endfunction

function Trig_Blessing_of_Critical_Actions takes nothing returns nothing
 local unit u
 local player p
 
 set u = GetSpellTargetUnit( )
 set p = GetTriggerPlayer( )
 
 
 call UnitAddAbilityBJ('A001', u)
 call SetPlayerAbilityAvailableBJ(false, 'A001', p)
 call PolledWait(20.00)
 call UnitRemoveAbilityBJ('A001', u)
endfunction


//===========================================================================
function InitTrig_Blessing_of_Critical takes nothing returns nothing
    set gg_trg_Blessing_of_Critical = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ(gg_trg_Blessing_of_Critical, EVENT_PLAYER_UNIT_SPELL_EFFECT)
    call TriggerAddCondition( gg_trg_Blessing_of_Critical,Condition(function Trig_Blessing_of_Critical_Conditions ) )
    call TriggerAddAction( gg_trg_Blessing_of_Critical, function Trig_Blessing_of_Critical_Actions) 
endfunction
Старый 25.02.2012, 15:27
Hellfim
Новичок
offline
Опыт: 79,707
Активность:
» код
//В редакторе переменных создай переменную хеш-таблица с именем ht!

function Trig_Blessing_of_Critical_Conditions takes nothing returns boolean
 return GetSpellAbilityId() == 'Ablo'
endfunction

function remove_abi takes nothing returns nothing
 local timer tim = GetExpiredTimer( )
 local integer tkey = GetHandleId(tim)
 call UnitRemoveAbility(LoadUnitHandle(udg_ht, tkey, 0), 'A001')
 call FlushChildHashtable(udg_ht, tkey)
 call DestroyTimer(tim)
 set tim=null
endfunction

function Trig_Blessing_of_Critical_Actions takes nothing returns nothing
 local unit u = GetSpellTargetUnit( )
 local player p = GetTriggerPlayer( )
 local timer tim = CreateTimer( )
 
 call UnitAddAbility(u, 'A001')
 call SetPlayerAbilityAvailable(p, 'A001', false)
 call SaveUnitHandle(udg_ht, GetHandleId(tim), 0, u)
 call TimerStart(tim, 20., false, function remove_abi)
 
 set tim = null
 set u = null
endfunction


//===========================================================================
function InitTrig_Blessing_of_Critical takes nothing returns nothing
    set gg_trg_Blessing_of_Critical = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ(gg_trg_Blessing_of_Critical, EVENT_PLAYER_UNIT_SPELL_EFFECT)
    call TriggerAddCondition( gg_trg_Blessing_of_Critical,Condition(function Trig_Blessing_of_Critical_Conditions ) )
    call TriggerAddAction( gg_trg_Blessing_of_Critical, function Trig_Blessing_of_Critical_Actions) 
endfunction
Hellfim добавил:
Xoniks, у тебя не только PolledWait течет, ты ещё и хендлы в конце функции не обнуляешь. Посмотри как это сделал я!

Отредактировано Hellfim, 25.02.2012 в 16:08.
Старый 25.02.2012, 15:46
Xoniks

offline
Опыт: 1,858
Активность:
а обязательно глобалку создавать или можно как-нибудь без нее обойтись?
Старый 25.02.2012, 15:51
Hellfim
Новичок
offline
Опыт: 79,707
Активность:
Xoniks, обязательно. В моей карте это единственная глобалка без которой нельзя обойтись. Все остальные можно заменить, но мне лениво.
Hellfim добавил:
Ну и да, следует заметить, что эту глобалку не нужно создавать для каждой новой способности. Она одна для всех.
Старый 25.02.2012, 15:56
Xoniks

offline
Опыт: 1,858
Активность:
Hellfim твой код не работает я скопировал полностью его создал переменую тип Хэш-таблица имя ht карта вообще не запускается теперь
Старый 25.02.2012, 16:05
Hellfim
Новичок
offline
Опыт: 79,707
Активность:
Нашел ошибку. Исправил. Ещё добавь где-нибудь при инициализации карты строчку
set udg_ht=InitHashtable()
Старый 25.02.2012, 16:08
Xoniks

offline
Опыт: 1,858
Активность:
При использовании таймера нужно обязательно использовать Хэш?
Старый 25.02.2012, 16:18
Hellfim
Новичок
offline
Опыт: 79,707
Активность:
Xoniks, для триггерных способностей - да.
Старый 25.02.2012, 16:20
MpW

offline
Опыт: 49,815
Активность:
можно внутри функции-инициализии например в функции InitTrig_Blessing_of_Critical добавить ту строчку из 6 поста
Старый 25.02.2012, 16:36
alpha

offline
Опыт: 7,387
Активность:
Hellfim:
Xoniks, для триггерных способностей - да.
Некоторые переносят данные integer и real типа через время таймера, к примеру, время (1. + GetPlayerId(player) / 100000), в хэндл-функции выводим данные имея пройденное таймеров время, погрешностей нет, я проверял на практике =)
Старый 25.02.2012, 23:54
Hellfim
Новичок
offline
Опыт: 79,707
Активность:
alpha, да, там ещё похитрее можно делать =)
Как-то так
timer tim=CreateTimer()
TimerStart(tim,GetPlayerId(GetOwningPlayer()),false,null)
PauseTimer(tim)
TimerStart(tim,1.,false,function myfunc)
tim=null
В итоге в таймере каким-то образом сохраняется ид игрока (в данном случае). Я на самом деле на 100% этот способ не помню. Там ещё где-то надо реальную прибавлять. Можешь поиск заюзать на хгм J вроде выкладывал.
Старый 25.02.2012, 23:58
Klop
Папа римский
offline
Опыт: 13,006
Активность:
timer можно использовать как замена цикла с периодом времени так и замена вейта
» замена цикла
global
   hashtable h = InitHashtable()
endglobal

function Action takes nothing returns nothing
   local timer t = GetExpiredTimer()
   local integer id = GetHandleId(t)
   local integer i = LoadInteger(t,id,1)
   if i < 10 then
      //Какие-то дейсвия
      set i = i + 1
      call SaveInteger(h,id,1,i)
   else
      call FlushChildHashtable(h,id)
      call DestroyTimer(t)
   endif
   set t = null
endfunction

function Start takes nothing returns nothing
   local timer t = CreateTimer()
   call SaveInteger(h,GetHandleId(t),1,0)
   call TimerStart(t,0.04,true,function Action)
   set t = null
endfunction
» замена Wait
global
   hashtable h = InitHashtable()
endglobal

function Action takes nothing returns nothing
   local timer t = GetExpiredTimer()
   local unit u = LoadInteger(t,id,1)
   call RemoveUnit(u)
   set u = null
   set t = null
endfunction

function Start takes nothing returns nothing
   local timer t = CreateTimer()
   call SaveUnitHandle(h,GetHandleId(t),1,GetTriggerUnit())
   call TimerStart(t,5.,false,function Action)
   set t = null
endfunction
Надеюсь описал доступно и без ошибок ,а то давно использую cJass

Отредактировано Hellfim, 26.02.2012 в 00:34.
Старый 26.02.2012, 00:22
alpha

offline
Опыт: 7,387
Активность:
Klop, Код сокращай, пожалуйста, здесь не приветствуются стометровые сообщения
Используй элементы форматирования типа спойлер
alpha добавил:
Klop, а еще, globals/endglobals
ты видно немного деградировал в плане написания, пожалуйста сверяй данные с действительностью, чтобы не возникало кривых ситуаций, как сейчас
Старый 26.02.2012, 00:26
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 22:37.