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

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

Ответ
 
free0n
Бумбарявка
offline
Опыт: 4,736
Активность:
Вопрос про утечки
Уважаемые джасеры! Есть ли в данном триггере хотя бы малейшие утечки? Просто я тренируюсь в данной области и мне интерестно: Правильно ли я делаю?
Код:
function fs_stars takes nothing returns nothing
    local unit u = null
    local location p = null  
    local integer i = 0
   
    set i = 1
    set u = GetSpellAbilityUnit()
    loop
        exitwhen i >= 10
        set p = PolarProjectionBJ(GetUnitLoc( u ), 500.00, ( 36.00 * i ))
        call AddLightningLoc( "AFOD", p, GetUnitLoc(u) )
        call AddSpecialEffectLocBJ( p, "Buildings\\Other\\BarrelsUnit0\\BarrelsUnit0.mdl" )
        set i = i + 1
        set p = null
    endloop
    
    set i = 0
    set u = null
endfunction

//===========================================================================
function InitTrig_qwertr takes nothing returns nothing
    set gg_trg_qwertr = CreateTrigger(  )
    call TriggerRegisterPlayerUnitEventSimple( gg_trg_qwertr, Player(0), EVENT_PLAYER_UNIT_SPELL_CAST )
    call TriggerAddAction( gg_trg_qwertr, function fs_stars )
endfunction
Старый 10.09.2006, 09:02
DioD

offline
Опыт: 45,134
Активность:
local unit u = null
local location p = null
local integer i = 0

set i = 1
set u = GetSpellAbilityUnit()
loop
exitwhen i >= 10
set p = PolarProjectionBJ(GetUnitLoc( u ), 500.00, ( 36.00 * i ))
точка
call AddLightningLoc( "AFOD", p, GetUnitLoc(u) )
молния
call AddSpecialEffectLocBJ( p, "Buildings\\Other\\BarrelsUnit0\\BarrelsUnit0.mdl" )
эффект
set i = i + 1
set p = null
хэндл
endloop

set i = 0
производительность, цифры не обнуляют
set u = null
хэндл
endfunction
Старый 10.09.2006, 10:05
free0n
Бумбарявка
offline
Опыт: 4,736
Активность:
Цитата:
set i = 0
производительность, цифры не обнуляют

Понятно

DioD И это всё что у меня неправельно???

free0n добавил:
Цитата:
хэндл

Что это значит???
Старый 10.09.2006, 10:52
dk

offline
Опыт: 60,293
Активность:
Это значит что ты удалил ссылку! А в памяти обьект остался, тоесть утечка! Юзай Remove
Старый 10.09.2006, 11:40
DioD

offline
Опыт: 45,134
Активность:
да, видимо надо было написать краткий коммент.
  1. хэндл - потеря ссылки на объект
  2. производительность, ненужная операция
  3. точка это объект, собственно это тоже хэндл но уже конкретно точка
  4. молния так-же как точка
  5. эффект так-же как точка и молния
Старый 10.09.2006, 11:58
free0n
Бумбарявка
offline
Опыт: 4,736
Активность:
Пошёл править. Всем спасибо. Тему плиз не закрывайте потому что могут появиться ещё вопросы.

free0n добавил:
Ну в общем вотЪ:
Код:
local location p = null  
    local integer i = 0
    local lightning array l1 
    local lightning array l2
    local effect array e

    set i = 0
    loop
        exitwhen i >= 8
        set p = PolarProjectionBJ(GetUnitLoc( GetSpellAbilityUnit() ), 350.00, ( 45.00 * i ))
        call AddLightningLoc( "FORK", p, GetUnitLoc(GetSpellAbilityUnit()) )
        set l1 = GetLastCreatedLightningBJ()
        call AddLightningLoc( "FORK", p, PolarProjectionBJ(GetUnitLoc(GetSpellAbilityUnit()), 350.00, ( 45.00 * ( i - 1 ) )) )
        set l2[i] = GetLastCreatedLightningBJ()
        call AddSpecialEffectLocBJ( p, "Abilities\\Spells\\Other\\Monsoon\\MonsoonBoltTarget.mdl" )
        set e[i] = GetLastCreatedEffectBJ()
        set i = i + 1
    endloop
    
    call TriggerSleepAction(0.75)
        
    set i = 0
    loop 
        exitwhen i >= 8  
        call DestroyLightningBJ(l1[i])
        call DestroyLightningBJ(l2[i])
        call DestroyEffect(e[i])
        set i = i + 1
    endloop
    
    call RemoveLocation(p)
    set l1[i] = null
    set l2[i] = null
    set e[i] = null
endfunction

Что опять забылЪ??? Вроде всё.
Кстати: Как обнулять массивы???
Пробовал:
Код:
set i = 0
    loop 
        exitwhen i >= 8  
        set l1[i] = null
        set l2[i] = null
        set e[i] = null
        set i = i + 1
    endloop


Не пашет почемуто? :)

[i]free0n добавил:

Как определить Находится ли юнит в радиусе 350 от применяющего заклинания героя и нанести ему 100 урона? Я ни как не могу это придумать.

P.S. Плиз переименуйте тему в что-нибудь подобное: Мои вопросы по Jass. или как там правильнее будет.

Отредактировано free0n, 10.09.2006 в 17:30.
Старый 10.09.2006, 18:24
FoK_KruGer
<3 Vocal Trance
offline
Опыт: 19,940
Активность:
free0n - слушай а ты код пишешь в ВЕ?
Старый 10.09.2006, 19:45
free0n
Бумбарявка
offline
Опыт: 4,736
Активность:
FoK_KruGer нет в "JassShopPro".
Старый 10.09.2006, 20:28
FoK_KruGer
<3 Vocal Trance
offline
Опыт: 19,940
Активность:
free0n
Цитата:
FoK_KruGer нет в "JassShopPro

у меня он есть.
А как им ползоватся?
Напиши статью.
Старый 10.09.2006, 20:57
FoK_KruGer
<3 Vocal Trance
offline
Опыт: 19,940
Активность:
ну я хоть и не понимаю толком но может это тру:
Цитата:
returns location

2 раза.
Цитата:
function PolarProjectionBJ takes location Unit, real dist, real Face returns location

и тут
Цитата:
return Location(x, y)
Старый 10.09.2006, 21:03
free0n
Бумбарявка
offline
Опыт: 4,736
Активность:
Вопросы:
1)Как обнулять локальные массивы?
2)Как сделать чтобы когда мой герой применяет способность, то в радиусе 350 вокруг него , войска противника получили, скажем, 50 урона? Помогите а то ни как не могу решить!
3)war3map.j - это код карты который можно экспортировать, А как его обратно засунуть, чтобы все функции сами вписались в триги которые я в нём укажу? Оъясните это подробнее. А то я через МПКуМастер вставляю этот код в свою карту. В игре всё работает, а в редакторе всё пусто? Я в недоумении!
Старый 11.09.2006, 02:16
dk

offline
Опыт: 60,293
Активность:
1) Вручную! Циклом как ты и делал, хз почему не пашет!
2)Читай тут
3)Просто для обычных триггеров тоже есть свой файл war3map.wtg(если я правильно помню). Так вот не war3map.wtg генерируется по war3map.j, а наоборот! Тоесть по .wtg генерится .j
Поэтому у тебя и пусто, т.к. ты сделал .j

А по тому кучку кода: практически все в порядке кроме
Цитата:
(GetUnitLoc( GetSpellAbilityUnit))

Утечка точки. Лучше сначало вычисляй координаты точки, т.к. они не создают утечек, а потом call MoveLocation по этим координатам, подробнее в статье про джасс сергея.

Отредактировано Dead_knight, 11.09.2006 в 14:57.
Старый 11.09.2006, 09:46
DotA_DR

offline
Опыт: 103
Активность:
Код:
local location CasterLoc = GetUnitLoc(GetSpellAbilityUnit())
    // GetUnitLoc создаёт точку которую надо уничтожать
    local location PrevPoint = PolarProjectionBJ(GetUnitLoc( GetSpellAbilityUnit() ), 350.00, -45.0)
    // PolarProjectionBJ тоже создаёт точку
    local location Point = null
    local integer i = 0
    local lightning array l1 
    local lightning array l2
    local effect array e

    set i = 0
    loop
        exitwhen i >= 8
        set Point = PolarProjectionBJ(GetUnitLoc( GetSpellAbilityUnit() ), 350.00, (45.00 * i))
        call AddLightningLoc( "FORK", Point, CasterLoc)
        set l1[i] = GetLastCreatedLightningBJ()
        call AddLightningLoc( "FORK", Point, PrevPoint)
        set l2[i] = GetLastCreatedLightningBJ()
        call AddSpecialEffectLocBJ(Point, "Abilities\\Spells\\Other\\Monsoon\\MonsoonBoltTarget.mdl" )
        set e[i] = GetLastCreatedEffectBJ()
        set i = i + 1
        call RemoveLocation(PrevPoint)
        set PrevPoint = Point
    endloop
    call RemoveLocation(PrevPoint)
    call RemoveLocation(CasterLoc)
    set PrevPoint = null
    set Point = null
    set CasterLoc = null
    // удаляй и обнуляй то что тебе уже ненужно сразу, перед Wait особенно

    call PolledWait(0.75)
    // в спелах используй PolledWait вместо TriggerSleepAction. PolledWait будет ждать пока нажата пауза
        
    set i = 0
    loop 
        exitwhen i >= 8  
        call DestroyLightningBJ(l1[i])
        call DestroyLightningBJ(l2[i])
        call DestroyEffect(e[i])
        set l1[i] = null
        set l2[i] = null
        set e[i] = null
        set i = i + 1
    endloop
endfunction


попробуй такой код.
Старый 11.09.2006, 11:51
Toadcop

offline
Опыт: 54,313
Активность:
вообще узать локации не имеет смысла... лутче напрямую координаты !
Старый 11.09.2006, 14:36
free0n
Бумбарявка
offline
Опыт: 4,736
Активность:
Я только начинающий джасер, а вы меня уже так пугаете. :)
Короче вот пример того что я хочу сделать: Когда юнит caster начинает применять способность, то создаётся звезда из молний(эффект)(луч = 45*), концы этих лучей соединяются ещё молниями(эффект). Заклинание действует всего 0.75 сек. и когда оно работает то юниты находяшиеся в радиусе 350 от caster, должны получить 100 урона. Плиз помогите мне это сделать. Это мой первый код на джасс поэтому не могу сделать такие простые веши. Ниже то что я уже сделал:
Код:
function fs_spell takes nothing returns nothing
    local location p = null  
    local integer i = 0
    local lightning array l1 
    local lightning array l2
    local effect array e
    loc

    set i = 0
    loop
        exitwhen i >= 8
        set p = PolarProjectionBJ(GetUnitLoc(GetSpellAbilityUnit()), 350.00, ( 45.00 * i ))
        call AddLightningLoc( "FORK", p, GetUnitLoc(GetSpellAbilityUnit()) )
        set l1 = GetLastCreatedLightningBJ()
        call AddLightningLoc( "FORK", p, PolarProjectionBJ(GetUnitLoc(GetSpellAbilityUnit()), 350.00, ( 45.00 * ( i - 1 ) )) )
        set l2[i] = GetLastCreatedLightningBJ()
        call AddSpecialEffectLocBJ( p, "Abilities\\Spells\\Other\\Monsoon\\MonsoonBoltTarget.mdl" )
        set e[i] = GetLastCreatedEffectBJ()
        set i = i + 1
    endloop

    call RemoveLocation(p)
    call TriggerSleepAction(0.75)
    
    
    set i = 0
    loop 
        exitwhen i >= 8  
            call DestroyLightningBJ(l1[i])
            call DestroyLightningBJ(l2[i])
            call DestroyEffect(e[i])
            set l1[i] = null
            set l2[i] = null
            set e[i] = null
            set i = i + 1
    endloop
    
endfunction

не могу приписать туда урон. (точнее не знаю куда и как) Плиз! Помогите кому не влом.

[i]free0n добавил:

Код:
//===================================================
function MyFilter takes nothing returns boolean
return (IsUnitEnemy(GetFilterUnit(), GetOwningPlayer(GetSpellAbilityUnit())) == false )
endfunction
//===================================================
local location loc=GetSpellTargetLoc()
local group g=GetUnitsInRangeOfLocMatching(300, loc, Condition(function MyFilter))
local unit u
loop
set u=FirstOfGroup(g)
exitwhen u==null
call GroupRemoveUnit(g,u)
call SetWidgetLife(u,GetWidgetLife(u)-100)
endloop
call RemoveLocation(loc)
call DestroyGroup(g)
set loc=null
set u=null

Этой функцией я наношу юниту 100 повреждений. Куда это вписать в моём коде??
Старый 11.09.2006, 16:42
J
expert
offline
Опыт: 48,447
Активность:
я щас буду плакатЪ
Код:
function spell takes nothing returns nothing
    local unit u = GetSpellAbilityUnit()
    local real X = GetUnitX        (u)
    local real Y = GetUnitY        (u)
    local real Z = GetUnitFlyHeight(u)
    local real X2
    local real Y2
    local real X3
    local real Y3 
    local lightning array l1 
    local lightning array l2
    local effect    array e
    local integer i = 0                            
    loop
        exitwhen i > 7        
        set X2 = X + 350 * Cos((45*i)*0.0175)
        set Y2 = Y + 350 * Sin((45*i)*0.0175)        
        set l1[i] = AddLightningEx("FORK", true, X2, Y2, 0, X, Y, Z)
        set X3 = X + 350 * Cos((45*(i-1))*0.0175)
        set Y3 = Y + 350 * Sin((45*(i-1))*0.0175)
        set l2[i] = AddLightningEx("FORK", true, X2, Y2, 0, X3, Y3, 0)
        set e[i] = AddSpecialEffect("Abilities\\Spells\\Other\\Monsoon\\MonsoonBoltTarget.mdl", X2, Y2)
        set i = i + 1
    endloop    
    call TriggerSleepAction(0.75)        
    set i = 0
    loop 
        exitwhen i >= 8  
        call DestroyLightning(l1[i])
        call DestroyLightning(l2[i])
        call DestroyEffect(e[i])
        set l1[i] = null
        set l2[i] = null
        set e [i] = null   
        set i = i + 1
    endloop
    set u = null
endfunction


ПОЛНОСТЬЮ без утечек
Старый 11.09.2006, 17:06
exploder
iOS zealot
offline
Опыт: 19,394
Активность:
Jon, проблема уже решена на канале #XGM...
Старый 11.09.2006, 17:15
free0n
Бумбарявка
offline
Опыт: 4,736
Активность:
Всем спасибо за помошь.
Ниже вы найдёте то что я делал! Если хотите можете взглянуть!
P.S. Аттач удалю через день.
Кстати, может это уже все знают но всё же: Когда юнит умирает, то все говорят что нужно его удалять(RemoveUnit).
Я уверен что можно и не удалять, он сам удалиться через время равное времени его анимации разложения(Decay по-моему). Могу доказать...

Отредактировано DioD, 12.09.2006 в 13:24.
Старый 11.09.2006, 18:29
DioD

offline
Опыт: 45,134
Активность:
не ищи умней себя, это доказали в теме выше, НО юниты без модели требуют удаления обязательно, так-же как и юниты без анимации (дами кастеры особенно)
Старый 12.09.2006, 13:22
free0n
Бумбарявка
offline
Опыт: 4,736
Активность:
DioD не видел. Сори. Тему можно закрыть
Старый 12.09.2006, 17:20
Ответ

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

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

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

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



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