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

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

Ответ
 
Vampirrr
O_o
offline
Опыт: 19,286
Активность:
Код с текстагом и утечки
Код:
function TextTag takes nothing returns nothing
local texttag t
call CreateTextTagLocBJ( "LoL", GetUnitLoc(udg_Target), 130, 15.00, 100, 0.00, 0.00, 0 )
set t = GetLastCreatedTextTag()
call SetTextTagPermanent(t, false)
call SetTextTagVelocityBJ(t, 64, 90)
call SetTextTagLifespan(t, 5)
call SetTextTagFadepoint(t, 3)
set t = null
call DestroyTextTag(t)
endfunction

function CheckPawnRed takes nothing returns nothing
local real x = (GetUnitX(udg_Target)) 
local real y = (GetUnitY(udg_Target))
    if IsUnitInRangeLoc(udg_KingBlue, Location(x+192, y+192), 100) or IsUnitInRangeLoc(udg_KingBlue, Location(x-192, y+192), 100)  then 
        call TextTag()
    endif
endfunction 

function CheckChecking takes nothing returns nothing
call CheckPawnRed()
endfunction


есть такой код..подскажите где утечки, как от них избавиться и по возможности подмогите оптимизировать. И кстати, почему если я использую
Код:
call SetTextTagVelocity(t, 64, 90)
вместо
call SetTextTagVelocityBJ(t, 64, 90)

то текст перестает двигаться?
Старый 16.01.2009, 22:53
Scorched

offline
Опыт: 7,912
Активность:
Цитата:
текст перестает двигаться

скорость измеряется в разных единицах. подробнее - в blizzard.j
Старый 17.01.2009, 01:09
Vampirrr
O_o
offline
Опыт: 19,286
Активность:
Scorched, т.е. если я превращаю "call SetTextTagVelocityBJ(t, 64, 90)" в "call SetTextTagVelocity(t, 64, 90)", то данные тоже менять нужно? Кстати, поискал я этот blizzard.j - не нашел..де его взять? (никогда не нужен был..)

Отредактировано Vampirrr, 17.01.2009 в 01:37.
Старый 17.01.2009, 01:25
Scorched

offline
Опыт: 7,912
Активность:
Vampirrr, да. war3patch.mpq/scripts/blizzard.j
Старый 17.01.2009, 01:50
Vampirrr
O_o
offline
Опыт: 19,286
Активность:
Scorched, спс, нашел эти функции в JassAPI =)
если у кого подобный вопрос возникнет - 1 значение: скорость по оси х, 2 значение: скорость по оси у. Значения ставить маленькие (0.03 приблизительно равно начальным значениям в BJ функции(64, 90), т.е. текст движется с такой же скорость)

а что по поводу утечек и т.д.?
Старый 17.01.2009, 02:08
Van Damm
wait... what?
offline
Опыт: 22,268
Активность:
Код:
function CheckChecking takes nothing returns nothing
 local real x = GetUnitX(udg_Target) 
 local real y = GetUnitY(udg_Target)
 local texttag t
 
    if IsUnitInRangeXY(udg_KingBlue, x+192, y+192, 100) or IsUnitInRangeXY(udg_KingBlue, x-192, y+192, 100)  then 
        set t = CreateTextTag()
        call SetTextTagPos(t, x, y, 130)
        call SetTextTagText(t, "LoL", 15*0.0023)
        call SetTextTagColor(t, 255, 0, 0, 255)
        call SetTextTagPermanent(t, false)
        call SetTextTagVelocity(t, 64*0.0005546875, 0)
        call SetTextTagLifespan(t, 5)
        call SetTextTagFadepoint(t, 3)
        set t = null
    endif
endfunction


Van Damm добавил:
а еще лучше
Код:
function CheckChecking takes unit kingblue, unit target returns nothing
вместо глобалок, если это применимо
Старый 17.01.2009, 02:47
Vampirrr
O_o
offline
Опыт: 19,286
Активность:
Van Damm, без глобалок не выйдет =( а не нужно делать call DestroyTextTag(t) ? и кстати, текст таг все тки должен быть отдельной функцией - он у меня будет вызываться из разных триггеров, если проверка = тру..
а за отсутствие BJ - спасибо)
Кстать, если сделать что б брал юнитов, то как будет выглядеть код?
Старый 17.01.2009, 02:56
alexkill

offline
Опыт: 19,072
Активность:
Цитата:
Сообщение от Vampirrr
а не нужно делать call DestroyTextTag(t) ?

Нужно
Старый 17.01.2009, 11:31
Van Damm
wait... what?
offline
Опыт: 22,268
Активность:
Цитата:
Сообщение от alexkill
Цитата:
Сообщение от Vampirrr
а не нужно делать call DestroyTextTag(t) ?
Нужно
не нужно. Он вызывает SetTextTagLifespan, после которого тт умрет сам по себе



Цитата:
Сообщение от Vampirrr
текст таг все тки должен быть отдельной функцией
Код:
function CreateTextTagEx takes string text, real x, real y, real z, real size, integer r, integer g, integer b, real vx, real vy, real life, real fade returns texttag
 local texttag t = CreateTextTag()
 
        call SetTextTagPos(t, x, y, z)
        call SetTextTagText(t, text, size*0.0023)
        call SetTextTagColor(t, r, g, b, 255)
        call SetTextTagPermanent(t, false)
        call SetTextTagVelocity(t, vx*0.0005546875, vy*0.0005546875)
        call SetTextTagLifespan(t, life)
        call SetTextTagFadepoint(t, fade)
        return t
endfunction

и вызывать
Код:
function CheckChecking takes unit target returns nothing
 local real x = GetUnitX(target) 
 local real y = GetUnitY(target)
 
    if IsUnitInRangeXY(udg_KingBlue, x+192, y+192, 100) or IsUnitInRangeXY(udg_KingBlue, x-192, y+192, 100)  then 
        call CreateTextTagEx(x, y, 130"LoL", 15, 255, 0, 0, 64, 0, 5, 3)
    endif
endfunction

Параметров многовато, так что это - не идеальный вариант. Подстраивать можно под твой конкретный случай.

В случае если эта функция является действием триггера, то естественно параметров передавать нельзя, но наверное можно тоже обойтись без глобалки udg_Target
Старый 17.01.2009, 13:04
Vampirrr
O_o
offline
Опыт: 19,286
Активность:
Van Damm, в Таргет записывается выбранный юнит, в совершенно левом триггере) на сколько я знаю, локальные только по 1 триггеру работают..

Код:
function TextTag takes real x, real y returns nothing
local texttag t = CreateTextTag()
        call SetTextTagPosUnit(t, udg_Traget, 130)
        call SetTextTagText(t, "LoL", 15*0.0023)
        call SetTextTagColor(t, 255, 0, 0, 255)
        call SetTextTagPermanent(t, false)
        call SetTextTagVelocity(t, 64*0.0005546875, 0)
        call SetTextTagLifespan(t, 5)
        call SetTextTagFadepoint(t, 3)
        set t = null
endfunction

function CheckPawnRed takes nothing returns nothing
local real x = (GetUnitX(udg_Target)) 
local real y = (GetUnitY(udg_Target))
    if IsUnitInRangeLoc(udg_KingBlue, Location(x+192, y+192), 100) or IsUnitInRangeLoc(udg_KingBlue, Location(x-192, y+192), 100)  then 
        call TextTag()
    endif
endfunction


а если сделать так, хуже не будет?

Отредактировано Vampirrr, 17.01.2009 в 18:05.
Старый 17.01.2009, 17:05
Van Damm
wait... what?
offline
Опыт: 22,268
Активность:
тогда
Код:
call TextTag(x,y)



просто в моем случае ты можешь вызывать эту функцию с любыми другими параметрами, но если тебе что-то не надо менять, конечно убирай это в константы + все что можно просчитать заранее, пиши цифрами
Старый 17.01.2009, 19:26
Vampirrr
O_o
offline
Опыт: 19,286
Активность:
Van Damm, спасибо, так и сделаю)
Старый 17.01.2009, 20:24
Ответ

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

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

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

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



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