Пытался устранить утечку плавающего текста в счётчике урона, но пишет отсутствует оператор кода, делал всё по статье про изучение джасса.

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

Впервой вижу, чтоб так издевались над плавающем текстом...
Как пишет г-н Maniac_91, нет нужды в сохранении texttag, ибо при строчке
call SetTextTagLifespanBJ( GetLastCreatedTextTag(), 0.50 )
или (вариант получше)
call SetTextTagLifespan(GetLastCreatedTextTag(), 0.50)
Ваш texttag, как умненький мальчик, сам уберется, когда он сделал своё дело ;)
Правда есть один нюанс... Если Вы добавили строчку
call SetTextTagPermanent(GetLastCreatedTextTag(),true)
то этот мальчик будет стоять подле Вас до конца сабантуя и ждать команды на уничтожение ;)
0
20
6 лет назад
0
Если не стоит жнгп, локальные переменные объявляются только в начале триггера
перемести "local texttag t" вверх действий
0
17
6 лет назад
0
biridius, Хм незнаю, всё работает, но хендлы растут после атаки, от чего это может быть? Как сделать чтоб текст удалялся вне зависимости от скорости атаки? кидаю карту
Загруженные файлы
0
20
6 лет назад
0
вроде еще надо обнулять локальные переменные объектов (юниты, тексттаги, точки) в конце триггера
set t = null
0
17
6 лет назад
0
biridius, Я не понимаю, даже если без ожидания удалять текст всё равно растёт handle, вот это тайна я понимаю. Может есть что-то другое что надо обнулять, там с гуи связанное, например строка полученного урона, которую передают с одного триггера на другой, или триггерный юнит
0
17
6 лет назад
0
делая так ты только вредишь себе,если хочешь жасс изучить то делай на жассе а не на фракенштейне,и для такий частопереодических вещей лутше использовать глобальные массивы или структуры
0
17
6 лет назад
0
ledoed, Я просто думал что могу пристроить сюда локальные переменные, там же в обучалке показывали как они работают на бесполезной вещи, а тут вроде мне они должны были помочь, а оказалось что они бесполезные( Тоесть нельзя создавать и запоминать несколько последних плавающих текстов и через время удалять их именно как объекты, а не так как их там удаляет?
0
17
6 лет назад
Отредактирован ledoed
0
вот тебе повезло нашел в старой карте код с плавующим текстом
сложная билеберда
//Плавающий текст
scope SetTextTag{

    
    public int count = 0
    private unit this_u[]
    private texttag this_texttag[]
    private int this_time[]

    private int this_tt[]
    
    private bool this_poss[]
    
    private float this_z[]
    
    
    
    
    
    
    
    
        private void RemoveUnitStruct(int i){

          count--
          

        //====================
        this_u[i]=this_u[count]
        this_z[i]=this_z[count]
        this_poss[i]=this_poss[count]
        this_time[i]= this_time[count]
        this_tt[i]=this_tt[count]
        this_texttag[i]=this_texttag[count]
        //======================
		this_u[count]=null
          
        }    
    
        private void Remove(int i){
        DestroyTextTag(this_texttag[i])

        RemoveUnitStruct(i)

        }   
    
    

//    MiniFunc_SetTextTag_AddUnit(unit u,string text,float x,float y,float z,bool poss,float speed,float angle,float size,float time,int R,int G,int B,int A)
    public void AddUnit(unit u,string text,float x,float y,float z,bool poss,float speed,float angle,float size,float time,int R,int G,int B,int A){
    
        this_texttag[count]= CreateTextTag()
        
        SetTextTagText(this_texttag[count], text, TextTagSize2Height(size))
        SetTextTagPos(this_texttag[count],x,y,z)
        SetTextTagColor(this_texttag[count], R, G, B, A)
        
        float vel = TextTagSpeed2Velocity(speed)
        float xvel = vel * Cos(angle * degrad)
        float yvel = vel * Sin(angle * degrad)
        SetTextTagVelocity(this_texttag[count], xvel, yvel)
        this_u[count]=u
        this_poss[count]=poss
        this_time[count]=R2I(time*sek)
        this_tt[count]=0
        this_z[count]=z
        
        count++
    }
    
    
    
    
    void Action(int i){
    
        if(this_poss[i]){
            SetTextTagPos(this_texttag[i],GetUnitX(this_u[i]),GetUnitY(this_u[i]),this_z[i])
        }
        
        if(++this_tt[i]>this_time[i]){
        
        Remove(i)
        
        }
    }
    
    public void Update(){int i = 0 ;while(i<count){Action(i);i++}}
    //таймер на 0.025
    
}
для понимания более упрощённая
//удаление юнита через время
scope UnitRemoveToTime{

        public int count =0
        //============================
        private unit this_u[] 
        private int this_timmer[] 
        private int this_tt[]

        private int Proverka(unit u){int i = 0;while(i<count){if(u==this_u[i]){return i}i++}return -1}


        private void RemoveUnitStruct(int i){

          count--
          

        //====================
        this_u[i]=this_u[count]
        this_timmer[i]= this_timmer[count]
        this_tt[i]=this_tt[count]
        //======================
		this_u[count]=null

          
        }

        private void Remove(int i){
       
       RemoveUnit(this_u[i])

        
        RemoveUnitStruct(i)

        }


        //MiniFunc_UnitRemoveToTime_AddUnit(unit u,float timmer)
        public void AddUnit(unit u,float timmer){

            int i =Proverka(u)
                    if(i!=-1){return}
                    
                        this_u[count]=u
                        this_timmer[count]=R2I(timmer*sek)//sek = 40
                        this_tt[count]=0
                        
                        count++
            

        }


            private void Action(int i){

                this_tt[i]++
                if(this_tt[i]>this_timmer[i] ){

                Remove(i)
                }

            }


            public void Update(){int i = 0 ;while(i<count){Action(i);i++}}
            //поток на 0.025



}
0
17
6 лет назад
Отредактирован Alexey103
0
ledoed, Ну судя по всему можно тут чисто на гуи такое реализовать, так как вижу счётчик и таймер, ну так все могут, а я думал что локальные переменные даже с одинаковым именем могут по нескольку создаватся, типа сколько раз триггер сработал, столько переменных и создалось. и все они как отдельные обьекты потом уничтожат тексты к которым прикреплены. Хм может таймер попробовать приспособить?
ledoed, Так а ты можешь ответить просто, у меня утечка только текста или же текст удаляется, но там что-то другое handle увеличивает?
0
17
6 лет назад
Отредактирован ledoed
0
ну да конечно а в чём проблемма
а зачем в глобалку заносить плавующий текст
0
17
6 лет назад
0
ledoed, Только не пойму, почему дестрой ласт флоатинг текст не устраняет утечку даже без ожидания, это странно, как будто дело не в этом.
2
17
6 лет назад
Отредактирован ledoed
2
ааа ты локалку необнуляешь
короче все локалки кроме типа float и int нужна обнулять типо
unit u = GetTriggerUnit()
u=null
0
17
6 лет назад
Отредактирован Alexey103
0
ledoed, Это правильно, я уже сделал обнуление локалки, поэтому ставлю +, и спасибо за то что сказал какие не нужно обнулять. Но как я сказал проблема уже не в этом, Сначала нужно найти почему растёт handle, а потом уже исходя из причины убирать её, логично? Так вот я уменьшил скорость атаки юнита с 1 сек до 2.20 и всё стало удалятся нормально. Но почему ведь я ставил время жизни текста:
call SetTextTagLifespanBJ( GetLastCreatedTextTag(), 0.50 )
call SetTextTagFadepointBJ( GetLastCreatedTextTag(), 0.30 )
Это если конвертировать гуи.Следовательно если время жизни текста меньше секунды а за этим идёт:
call DestroyTextTagBJ( GetLastCreatedTextTag() )
Утечки должны расти только при скорости атаки 0.80. В чём я ошибаюсь? Мне же нужно понимание чтоб не иметь проблем с этим в будущем.
0
17
6 лет назад
0
Wait он не точный ты можешь поставиь 0.8 а выполниться через 1.2 вариант использовать таймеры для точности
0
32
6 лет назад
0
Что за идиотия? Описано во всех статьях по jass локалки объявляются в начале функции, вейты - зло, и так далее.
0
17
6 лет назад
0
ledoed, Да, да похоже только они, иду читать по ним статью.
quq_CCCP, Ну так я же нуб, в статье ненаглядный пример к тому-же.
quq_CCCP, Не знаешь как удалить все тексты в массиве?
4
18
6 лет назад
4
Если плавающему тексту правильно задать время жизни, то он сам удалится, то есть ожидание и уничтожение тут на фиг не нужно.
Локальная переменная пишется первым действием. Дальше вместо последнего созданного нужно использовать её (придётся перевести в JASS и скопировать в Custom Script, если делать через GUI).
И после всех действий нужно обнулить переменную (set t = null).
4
4
6 лет назад
4
Впервой вижу, чтоб так издевались над плавающем текстом...
Как пишет г-н Maniac_91, нет нужды в сохранении texttag, ибо при строчке
call SetTextTagLifespanBJ( GetLastCreatedTextTag(), 0.50 )
или (вариант получше)
call SetTextTagLifespan(GetLastCreatedTextTag(), 0.50)
Ваш texttag, как умненький мальчик, сам уберется, когда он сделал своё дело ;)
Правда есть один нюанс... Если Вы добавили строчку
call SetTextTagPermanent(GetLastCreatedTextTag(),true)
то этот мальчик будет стоять подле Вас до конца сабантуя и ждать команды на уничтожение ;)
Принятый ответ
0
17
6 лет назад
0
DazzleFirst, Я забил на всё это давно, и пытался убирать текст в попытке убрать утечки, хотя их там и не было, нуб, же, так или иначе держи лайк.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.