Объясните, как одновременно выбрать только юнитов определённого типа у определённого игрока в обределенной области?
Я делаю так:
Отряд выбрать юнитов типа() принадлежащих игроку 6 и делать множество действий.
Отряд выбрать юнитов в области() и делать то, но у меня выбираются все юниты в этой области. Что делать? Как это исправить?

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

function groupCondition takes nothing returns boolean
    return true == true //Здесь пишешь условия используя and или or и сюда передается юнит GetFilterUnit()
endfunction

//Эти действия вставляешь в любую нужную тебе функцию
    local group    g  = CreateGroup()
    local boolexpr bE = Condition( function groupCondition )
    local unit     u
    //Где x и y - это координаты
    //Где r - это радиус
    call GroupEnumUnitsInRange( g, x, y, r, bE )
    call DestroyBoolExpr( bE )
    loop
    set u = FirstOfGroup( g )
    exitwhen u == null
        //Действия над группой
        call BJDebugMsg( GetUnitName( u ) )
        //Конец
        call GroupRemoveUnit( g, u )
        set u = null
    endloop
    call GroupClear( g )
    call DestroyGroup( g )
    
    set g  = null
    set bE = null
    set u  = null
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
12
6 лет назад
0
UrsaBoss:
function groupCondition takes nothing returns boolean
    return true == true //Здесь пишешь условия используя and или or и сюда передается юнит GetFilterUnit()
endfunction

//Эти действия вставляешь в любую нужную тебе функцию
    local group    g  = CreateGroup()
    local boolexpr bE = Condition( function groupCondition )
    local unit     u
    //Где x и y - это координаты
    //Где r - это радиус
    call GroupEnumUnitsInRange( g, x, y, r, bE )
    call DestroyBoolExpr( bE )
    loop
    set u = FirstOfGroup( g )
    exitwhen u == null
        //Действия над группой
        call BJDebugMsg( GetUnitName( u ) )
        //Конец
        call GroupRemoveUnit( g, u )
        set u = null
    endloop
    call GroupClear( g )
    call DestroyGroup( g )
    
    set g  = null
    set bE = null
    set u  = null
Т.е. я создаю функцию, потом вставляю эти действия и после выполнения условий только с выбранными существами будет происходить действие?
0
18
6 лет назад
0
Стас Орлов
Да, функцию groupCondition всегда ставь над той функцией где будешь вставлять действия.
И в том же groupCondition можешь фильтровать юнитов, юнит который туда идет на проверку - это GetFilterUnit()
Стас Орлов
и ещё важное забыл, те три local переменные всегда ставь в самый верх действий функции.
0
12
6 лет назад
0
Спасибо, а если мне допустим нужно в области, которая центрировано вокруг юнита на током радиусе?
0
37
6 лет назад
0
Стас Орлов, берёшь у юнита координаты и помещаешь в x, y
Если надо относительно юнита, смести их на угол полярными координаами
0
23
6 лет назад
0
UrsaBoss, зачем ты обнуляещ boolexp омг его нет нужды обнулять
0
32
6 лет назад
0
pro100master, от глупости, болекспры не утекают никуда, как и геймкешь и кондишены триггеров, каждый новый вызов Condition( function name) будет возвращать один и тот же обьект.
0
23
6 лет назад
0
quq_CCCP, верно я бы его перенес в инициализация и спокойно проверять
0
18
6 лет назад
0
quq_CCCP
я не находил статьи которая объясняла бы что нужно и что не нужно обнулять
quq_CCCP
хотя пришлось порыться, вроде нашел
0
26
6 лет назад
0
true == true
Просто без комментариев
0
32
6 лет назад
0
Объясните, как одновременно выбрать только юнитов определённого типа у определённого игрока в обределенной области?
Это же банально на гуе делается через matching condition. Элементарно я бы даже сказал.
0
26
6 лет назад
Отредактирован Hanabishi
0
Я бы вот так посоветовал сделать:
function UnitFilter takes nothing returns boolean
    //здесь условия фильтрации
    return (GetUnitTypeId(GetFilterUnit())=='hpea' and GetOwningPlayer(GetFilterUnit())==Player(5))
endfunction

function UnitActions takes nothing returns nothing
    //здесь действия с выбранными юнитами
    call KillUnit(GetEnumUnit())
endfunction

function GetUnitsAroundOfUnit takes unit u, real range returns nothing
    local group g = CreateGroup()
    call GroupEnumUnitsInRange(g, GetUnitX(u), GetUnitY(u), range, Condition(function UnitFilter))
    call ForGroup(g, function UnitActions)
    call GroupClear(g)
    call DestroyGroup(g)
    set g = null
endfunction
И можно еще оптимальнее сделать через vJass.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.