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

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

Закрытая тема
 
Myth
The Temple
offline
Опыт: 19,141
Активность:
действия с группой юнитов
вот фрагмент триггера:
function SpiritWolf_Follow_Move takes nothing returns nothing
    local location hp = GetUnitLoc(udg_Hero)
    local location up = GetUnitLoc(GetEnumUnit())
    local location mp
    
    if ( SpiritWolf_Follow_CondTarget() and DistanceBetweenPoints(hp, up) > 500.00 ) then
        set mp = GetRandomLocInCircle(hp, 180)
        call IssuePointOrderLocBJ( GetEnumUnit(), "move", mp )
    endif
    
    call RemoveLocation(hp)
    call RemoveLocation(up)
    call RemoveLocation(mp)
    set hp = null
    set up = null
    set mp = null
endfunction

function Trig_SpiritWolf_Follow_Actions takes nothing returns nothing
    local location hp = GetUnitLoc(udg_Hero)
    set bj_wantDestroyGroup = true
    call ForGroupBJ( GetUnitsInRangeOfLocAll(1500.00, hp), function SpiritWolf_Follow_Move )
    call RemoveLocation(hp)
    set hp = null
endfunction
несколько вопросов:
  1. почему возникают утечки?
  2. функция ForGroup совершает для каждого юнита в группе описанные дейсвия?
  3. как избежать повтора инициализации переменных? пробовал передать через takes: говорит что нельзя с параметром.
Старый 07.04.2011, 16:50
Doc

offline
Опыт: 63,163
Активность:
  1. Раской бж и посмотри. Да и вообще зачем локи и бж?
  2. Да.
  3. Не понел.
Старый 07.04.2011, 16:57
spellwerk

offline
Опыт: 4,869
Активность:
не юзай локации, не будет утечек
избавься от бж
  1. да
  2. глобалки, или без ForGroup пройтись loop'ом
Старый 07.04.2011, 16:58
Myth
The Temple
offline
Опыт: 19,141
Активность:
Doc,
  1. глобалки?
  1. ну то есть локалка hp используется и в Trig_SpiritWolf_Follow_Actions и в вызываемом действии с группой SpiritWolf_Follow_Move. при попытке передать переменную (SpiritWolf_Follow_Move takes location point) выдаёт что нельзя в данном случае.
Myth добавил:
Spy_,
  1. я же удаляю локации
  1. то есть локалка только через цикл?
Myth добавил:
кому не лень, перепишите плиз этот код для наглядности на нормальный лад.
Старый 07.04.2011, 17:07
Lobster

offline
Опыт: 2,043
Активность:
Myth, 1. Используй вместо точек координаты
Возможно DistanceBetweenPoints дает утечку, раскрой ее в программе
Spy_, xgm.ru/forum/showthread.php?t=18742 - статья Адольфа о твоей функции.
Старый 07.04.2011, 18:16
Hanabishi
COOL STATUS
offline
Опыт: отключен
Myth, дай код GetRandomLocInCircle
Hanabishi добавил:
хотя не надо, я понял что она должна делать
держи код
function SpiritWolf_Follow_Move takes nothing returns nothing
    local real x1 = GetUnitX(udg_hero)
    local real y1 = GetUnitY(udg_hero)
    local real x2 = GetUnitX(GetEnumUnit())
    local real y2 = GetUnitY(GetEnumUnit())
    local real dx = x1-x2
    local real dy = y1-y2
    local real angle = GetRandomReal(0.0,bj_PI*2.0)
    local real dist = GetRandomReal(0.0,180.0)
    
    if SpiritWolf_Follow_CondTarget() and (SquareRoot(dx*dx+dy*dy)>500.0) then
        call IssuePointOrder(GetEnumUnit(),"move",dist*Cos(angle),dist*Sin(angle))
    endif
endfunction

function Trig_SpiritWolf_Follow_Actions takes nothing returns nothing
    local real x = GetUnitX(udg_hero)
    local real y = GetUnitY(udg_hero)
    local group g = CreateGroup()
    call GroupEnumUnitsInRange(g,x,y,1500,null)
    call ForGroup(g,function SpiritWolf_Follow_Move)
    call GroupClear(g)
    call DestroyGroup(g)
    set g = null
endfunction
Старый 07.04.2011, 18:26
JimALIEN
вдупляет sc2 editor
offline
Опыт: 7,176
Активность:
local location hp = GetUnitLoc(udg_Hero)
local location up
local group g = GetUnitsInRangeOfLocAll(1500,hp)
local unit u
loop
set u = FirstOfGroup(g)
exitwhen u = null
If SpiritWolf_Follow_CondTarget and SquareRoot((GetUnitX(udg_Hero)-GetUnitX(u))*(GetUnitX(udg_Hero)-GetUnitX(u))+(GetUnitY(udg_Hero)-Get​UnitY(u))*(GetUnitY(udg_Hero)-GetUnitY(u)))>500 then
set up=Location(GetUnitX(udg_Hero)+180*CosBJ(a),GetUnitY(udg_Hero)+180*SinBJ(a))
call IssuePointOrderLocBj(u,"move",up)
endif
call GroupRemoveUnitSimple(g,u)
endloop
call RemoveLocation(hp)
call RemoveLocation(up)
call DestroyGroup(g)
set hp=null
set up=null
set g=null
Както так
Старый 07.04.2011, 20:17
Myth
The Temple
offline
Опыт: 19,141
Активность:
Lobster,
Используй вместо точек координаты
использую локации и удалаю их как не нужными становятся.
Возможно DistanceBetweenPoints дает утечку
function DistanceBetweenPoints takes location locA, location locB returns real
возвращает реал. обнулять не надо.

Hanabishi,
дай код GetRandomLocInCircle
function GetRandomLocInCircle takes location center, real radius returns location
    local real a = GetRandomReal(0, 6.2832)
    local real r = GetRandomReal(0, radius)
    return Location(GetLocationX(center)+r*Cos(a), GetLocationY(center)+r*Sin(a))
endfunction
возвращает точку, которой присваивается переменная mp, используется и также удаляется.
Myth добавил:
Спасибо. )
Старый 07.04.2011, 22:52
Закрытая тема

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

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

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

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



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