Добавлен Sergey105
В vjass начал недавно так что мало что понимаю -делаю способность когда метеор падает и его высота ровна 0 то через группу создаются структуры на каждого юнита задетого .Структура сама должна создавать эффект горения и наносить урон с интервалом 1 сек в течении определенного времени по окончанию удалять эффект и структуру. Возникла такая проблема - вроде и работает но бывает остается эффект и после первого применения обычно длительность срезается было 6 сек стало примерно 3сек. В чем проблема скажите пожалуйста
struct DEfD
unit cast
unit targ
real damag
effect eff
real duration
unit cast
unit targ
real damag
effect eff
real duration
method FuncDotUnit takes nothing returns nothing
call UnitDamageTarget(this.cast,this.targ, 50, true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_FIRE, WEAPON_TYPE_WHOKNOWS)
set this.duration=this.duration-1.00
endmethod
call UnitDamageTarget(this.cast,this.targ, 50, true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_FIRE, WEAPON_TYPE_WHOKNOWS)
set this.duration=this.duration-1.00
endmethod
static method UpdateFunc takes nothing returns nothing
integer i=0
loop
set i=i+1
call StructDot[i].FuncDotUnit()
if (StructDot[i].duration ==0.00) then
call BJDebugMsg("dd")
set StructDot[i].duration=0
set StructDot[i].targ=null
set StructDot[i].cast=null
call DestroyEffect(StructDot[i].eff)
set StructDot[i].eff=null
set count=count-1
call StructDot[i].destroy()
endif
exitwhen i==count
endloop
set i=0
integer i=0
loop
set i=i+1
call StructDot[i].FuncDotUnit()
if (StructDot[i].duration ==0.00) then
call BJDebugMsg("dd")
set StructDot[i].duration=0
set StructDot[i].targ=null
set StructDot[i].cast=null
call DestroyEffect(StructDot[i].eff)
set StructDot[i].eff=null
set count=count-1
call StructDot[i].destroy()
endif
exitwhen i==count
endloop
set i=0
endmethod
static timer TimerDot=null
static integer count=0
static DEfD StructDot[]
static integer count=0
static DEfD StructDot[]
static method AddUnitDot takes unit ca, unit ta, string ef returns nothing
set count=count+1
set StructDot[count]=DEfD.create()
set StructDot[count].cast=ca
set StructDot[count].targ=ta
set StructDot[count].eff = AddSpecialEffectTarget(ef,ta,"origin")
set StructDot[count].duration=6.00
if (TimerDot==null)then
set TimerDot=CreateTimer()
call TimerStart(TimerDot,1.00,true,function DEfD.UpdateFunc)
endif
endmethod
set count=count+1
set StructDot[count]=DEfD.create()
set StructDot[count].cast=ca
set StructDot[count].targ=ta
set StructDot[count].eff = AddSpecialEffectTarget(ef,ta,"origin")
set StructDot[count].duration=6.00
if (TimerDot==null)then
set TimerDot=CreateTimer()
call TimerStart(TimerDot,1.00,true,function DEfD.UpdateFunc)
endif
endmethod
endstruct
Принятый ответ
Sergey105, проблема в способе хранения а не в вджасс
цикл бегает от 1 до count включительно
первый объект будет в 1 ячейке
второй во 2
третий в третьей
count равен 3
раз время везде 6 секунд то первой освободиться первая ячейка
count станет равен 2
и цикл будет обрабатывать ячейки 1(пустая) и 2
но объект в 3 ячейке всё ещё остался так как время для него не закончилось
а так как мы его не удалили а просто потеряли то и эффект и экземпляр структуры остаются
и того утечка памяти
вот статья которую можно юзать как пример
цикл бегает от 1 до count включительно
первый объект будет в 1 ячейке
второй во 2
третий в третьей
count равен 3
раз время везде 6 секунд то первой освободиться первая ячейка
count станет равен 2
и цикл будет обрабатывать ячейки 1(пустая) и 2
но объект в 3 ячейке всё ещё остался так как время для него не закончилось
а так как мы его не удалили а просто потеряли то и эффект и экземпляр структуры остаются
и того утечка памяти
вот статья которую можно юзать как пример
и на будущее
для кода используй форматирование код
а большие куски кода вноси под кат
вот статья про форматирование
для кода используй форматирование код
а большие куски кода вноси под кат
вот статья про форматирование
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Отредактирован Пушистый
цикл бегает от 1 до count включительно
первый объект будет в 1 ячейке
второй во 2
третий в третьей
count равен 3
раз время везде 6 секунд то первой освободиться первая ячейка
count станет равен 2
и цикл будет обрабатывать ячейки 1(пустая) и 2
но объект в 3 ячейке всё ещё остался так как время для него не закончилось
а так как мы его не удалили а просто потеряли то и эффект и экземпляр структуры остаются
и того утечка памяти
вот статья которую можно юзать как пример
для кода используй форматирование код
а большие куски кода вноси под кат
вот статья про форматирование