[san9], От глобалок нет утечек, т.к. они переписываются, а локал - висят
А если у него тригер 2 срабатывает не сразу как вкл 1 тригер? То в переменную udg_unit запишется последний юнит,каторый был записан в 1 тригере.И во 2ом обратится не все а 1 последний.
[san9], От глобалок нет утечек, т.к. они переписываются, а локал - висят
Если глобалки не обнулять то есть утечки! А "локал висят" это где-то на уровне "а деревья летают". Глобалки и локалки нужно обнулять и удалять одинаково. Не стоит удалять и обнулять - строки(string), игроков(players), реальные(real), целочисленные(integer), логические (boolean).
Примеры
юниты локалка
Code
local unit u=bj_lastCreatedUnit используем юнита как хотим set u=null //удаляем его хендл из локалки, сама локалка удаляется
глобалка
Code
set udg_u=null
Точки локалка
Code
local location a=Location(GetRectCenterX(udg_Creeps),GetRectCenterY(udg_Creeps)) используем точку как нам надо call RemoveLocation(a) //удаляем саму точку set a=null //и ссылку на неё
глобалка
Code
set udg_a=Location(GetRectCenterX(udg_Creeps),GetRectCenterY(udg_Creeps)) используем точку как нам надо call RemoveLocation(udg_a) //удаляем саму точку set udg_a=null //и ссылку на неё
Группа игроков локалка
Code
local force a=CreateForce() используем как нам надо call DestroyForce(a) set a=null
глобалка
Code
set udg_a=CreateForce() используем как нам надо call DestroyForce(udg_a) set udg_a=null
и так далее...
Code
function Trig_Cast_Actions takes nothing returns nothing local unit u=GetSpellAbilityUnit() call UnitAddAbility(u,'Amrf') call EnableTrigger(gg_trg_Podnyatie) call TriggerSleepAction(3) call DisableTrigger(gg_trg_Podnyatie) call UnitRemoveAbility(u,'Amrf') call SetUnitFlyHeight(u,0,0) set udg_u=u set u=null endfunction function PodAct takes nothing returns nothing call SetUnitFlyHeight(udg_u,400,100) endfunction function InitTrig_Podnyatie takes nothing returns nothing set gg_trg_Podnyatie=CreateTrigger() local timer t=CreateTimer() call TimerStart(t,0.07,true,function PodAct) call DisableTrigger(gg_trg_Podnyatie) call TriggerAddAction(gg_trg_Podnyatie,function PodAct) endfunction
Местами здесь.
Сообщение отредактировал EdiTTORR - Суббота, 25 Сентября 2010, 15:29:12
EdiTTORR, Нет, обнулять глобалки не надо, если ты их call RemoveLocation - они не обнуляються - а просто удаляются типо сведения о точке
Я не собираюсь ничего тебе доказывать иди спроси у Дуоса или у драгона 93 или почитай статьи, факт его не оспоришь и я ответил на вопрос Kr0nus.
Полярки это корявая полярка близзардов(см.ниже) function PolarProjectionBJ takes location source, real dist, real angle returns location local real x = GetLocationX(source) + dist * Cos(angle * bj_DEGTORAD) local real y = GetLocationY(source) + dist * Sin(angle * bj_DEGTORAD) return Location(x, y) endfunction
Вот как они работают Новая координата Х = старая Х + дистанция от старой Х до новой*Cos(угол*0,0174532777777778) Новая координата Y = старая Y + дистанция от старой Y до новой*Sin(угол*0,0174532777777778)
Конечно уже никто не использует точки, это геморно. Две функции работают с координатами(можешь сделать даже сам это легко)
function GetPolarX takes real aX, real dist, real ang returns real local real X=aX+dist*Cos(ang*0,0174532777777778) return X endfunction function GetPolarY takes real aY, real dist, real ang returns real local real Y=aY+dist*Sin(ang*0,0174532777777778) return Y endfunction
Скопируй эти две функции в код карты и юзай наздоровье Можно с помощью них сделать полярную точку Прим: допустим у тебя есть юнит тебе надо создать точку на расстоянии 60 под углом 45 от этого юнита, это буде выглядеть так: local location loc=Location(GetPolarX(GetUnitX(unit),60,45),GetPolarY(GetUnitY(unit),60,45)) так ты создашь точку с названием loc которая буде на расстоянии 60 и под углом 45 градусов от юнита(имя локалки этого юнита - unit) Усё юзай наздароуе!
Местами здесь.
Сообщение отредактировал EdiTTORR - Суббота, 25 Сентября 2010, 16:03:40
У меня возник еще один вопрос.Я знаю что полярки вызывают утечки.Я почитал статью.И если я правильно понял использовать без утечек полярки можно таким образом:
Code
function Trig_P_Conditions takes nothing returns boolean if ( not ( GetSpellAbilityId() == 'AHtc' ) ) then return false endif return true endfunction
function Trig_P_Actions takes nothing returns nothing local unit u set u = GetSpellAbilityUnit() set udg_point1 = GetUnitLoc( u ) set udg_point2 = PolarProjectionBJ ( udg_point1 , 500 , GetUnitFacing ( u ) ) call SetUnitPositionLoc ( u , udg_point2 ) call RemoveLocation(udg_point1) call RemoveLocation(udg_point2) set u = null set udg_point1 = null set udg_point2 = null endfunction
//=========================================================================== function InitTrig_P takes nothing returns nothing set gg_trg_P = CreateTrigger( ) call TriggerRegisterAnyUnitEventBJ( gg_trg_P, EVENT_PLAYER_UNIT_SPELL_CAST ) call TriggerAddCondition( gg_trg_P, Condition( function Trig_P_Conditions ) ) call TriggerAddAction( gg_trg_P, function Trig_P_Actions ) endfunction
Вроде бы так.И еще,я использовал глобальные переменные типа точек,потому что локальные не получились.я писал local location p1 - мне выдало ошибку ( пробовал local point p1,та же фигня)
local unit u = GetSpellAbilityUnit() local real a = GetUnitFacing(u)*0.01745 local real x = GetUnitX(u)+500.*Cos(a) local real y = GetUnitY(u)+500.*Sin(a)
.И еще,я использовал глобальные переменные типа точек,потому что локальные не получились.я писал local location p1 - мне выдало ошибку ( пробовал local point p1,та же фигня)
Ты оброщаешся к local location p1 как к области,не как к точке.Вот он и выдаёт ошибки.
set udg_point1 = GetUnitLoc( u ) set udg_point2 = PolarProjectionBJ ( udg_point1 , 500 , GetUnitFacing ( u ) ) call SetUnitPositionLoc ( u , udg_point2 ) call RemoveLocation(udg_point1) call RemoveLocation(udg_point2) set u = null set udg_point1 = null set udg_point2 = null endfunction
//=========================================================================== function InitTrig_P takes nothing returns nothing set gg_trg_P = CreateTrigger( ) call TriggerRegisterAnyUnitEventBJ( gg_trg_P, EVENT_PLAYER_UNIT_SPELL_CAST ) call TriggerAddCondition( gg_trg_P, Condition( function Trig_P_Conditions ) ) call TriggerAddAction( gg_trg_P, function Trig_P_Actions ) endfunction
Повторюсь
Quote (EdiTTORR)
function PolarProjectionBJ takes location source, real dist, real angle returns location local real x = GetLocationX(source) + dist * Cos(angle * bj_DEGTORAD) local real y = GetLocationY(source) + dist * Sin(angle * bj_DEGTORAD) return Location(x, y) endfunction
Хоть ты и занусишь в переменную одну точку(1/2) Но другая остаётся в необнулённой переменной Она возвращает точку, но она создаёт ее в процессе возвращения и в итоге возвращает одну а в памяти остаётся побочный продукт этого действия Это замкнутый цикл и я неуверен что функция возвращающая точку не такого типа:
Code
function Sample takes nothing returns nothing local location a=Location(0,0) //создаёт переменную и присваивает ей точку(вообще-то две координаты) return a //возвращает значение переменной call RemoveLocation(a)//удаляет точку set a=null//удаляет ссылку endfunction
может быть неутечна при правильном использовании. Kr0nus, я не совсем понял смысл последнего поста т.к. в первой цитате San9 объясняет тебе что ты точку неправильно используешь а во второй цитате изображено неправильная инициализация переменной, правильное действительно: local location p1
Вот самый хороший вариант твоего триггера без точек, и глобальных переменных выполняющий те-же действия:
Code
function Trig_P_Cond takes nothing returns boolean if(not(GetSpellAbilityId()=='AHtc'))then return false endif return true endfunction function Trig_P_Actions takes nothing returns nothing local unit a=GetSpellAbilityUnit() local real X=GetUnitX(a)+500*Cos(GetUnitFacing(a)*0,0174532777777778) local real Y=GetUnitY(a)+500*Sin(GetUnitFacing(a)*0,0174532777777778) call SetUnitPosition (a,X,Y) set a=null endfunction function InitTrig_P takes nothing returns nothing set gg_trg_P=CreateTrigger() call TriggerRegisterAnyUnitEventBJ(gg_trg_P,EVENT_PLAYER_UNIT_SPELL_CAST) call TriggerAddCondition(gg_trg_P,Condition(function Trig_P_Cond)) call TriggerAddAction(gg_trg_P,function Trig_P_Actions) endfunction
Местами здесь.
Сообщение отредактировал EdiTTORR - Понедельник, 27 Сентября 2010, 00:10:52
Добавлено (27-09-2010, 00:09) --------------------------------------------- з.ы. ты ещё попробуй доказать, что драгон и дуос лучше мну шарят в части кодинга(ничё против парней не имею, отличные ребята
Pa3apT, что такого смешного в обнулении глобалок? это тоже переменные содержащие указатели и они отличаются от локалок лишь" продолжительностью жизни " или "локальностью дейсвия".