В vjass начал недавно так что мало что понимаю -делаю способность когда метеор падает и его высота ровна 0 то через группу создаются структуры на каждого юнита задетого .Структура сама должна создавать эффект горения и наносить урон с интервалом 1 сек в течении определенного времени по окончанию удалять эффект и структуру. Возникла такая проблема - вроде и работает но бывает остается эффект и после первого применения обычно длительность срезается было 6 сек стало примерно 3сек. В чем проблема скажите пожалуйста
struct DEfD
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
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
endmethod
static timer TimerDot=null
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
endstruct

Принятый ответ

Sergey105, проблема в способе хранения а не в вджасс
цикл бегает от 1 до count включительно
первый объект будет в 1 ячейке
второй во 2
третий в третьей
count равен 3
раз время везде 6 секунд то первой освободиться первая ячейка
count станет равен 2
и цикл будет обрабатывать ячейки 1(пустая) и 2
но объект в 3 ячейке всё ещё остался так как время для него не закончилось
а так как мы его не удалили а просто потеряли то и эффект и экземпляр структуры остаются
и того утечка памяти
вот статья которую можно юзать как пример
и на будущее
для кода используй форматирование код
а большие куски кода вноси под кат
вот статья про форматирование
`
ОЖИДАНИЕ РЕКЛАМЫ...
1
13
8 лет назад
Отредактирован Пушистый
1
Лучше воздержаться от сравнивания реальных переменных с 0.00. Лучше сделай через больше или меньше. Вынужден сказать, что знаю лишь основы vJass, но то, что сравнение с 0.00 вызывает глюки, узнал на практике.
0
7
8 лет назад
0
Пушистый, Хорошо попробую сделать
3
28
8 лет назад
3
Sergey105, проблема в способе хранения а не в вджасс
цикл бегает от 1 до count включительно
первый объект будет в 1 ячейке
второй во 2
третий в третьей
count равен 3
раз время везде 6 секунд то первой освободиться первая ячейка
count станет равен 2
и цикл будет обрабатывать ячейки 1(пустая) и 2
но объект в 3 ячейке всё ещё остался так как время для него не закончилось
а так как мы его не удалили а просто потеряли то и эффект и экземпляр структуры остаются
и того утечка памяти
вот статья которую можно юзать как пример
и на будущее
для кода используй форматирование код
а большие куски кода вноси под кат
вот статья про форматирование
Принятый ответ
0
7
8 лет назад
0
nvc123, Спасибо , разобрался в ошибке своей
Чтобы оставить комментарий, пожалуйста, войдите на сайт.