Хочу оптимизировать области и перемещение между ними, что бы было всё в 1 триггере
я сделал, но мне кажется что это плохой вариант, можно сделать лучше?

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

Desgul, сейчас пытаюсь с помощью джасса и команды IsPointInRegion(R,x,y) реализовать

Ору, не понимал почему игра крашилась, оказывается инициализировать глобалку региона и сразу же присваивать ей значение нельзя)
код
globals
    region TR
    rect lastRect = null
endglobals
function Trig_ddd_Conditions takes nothing returns boolean
    return IsUnitType(GetTriggerUnit(), UNIT_TYPE_HERO)
endfunction

function IsPointInRect takes rect a, real x, real y returns boolean
    call RegionClearRect(TR,lastRect)
    call RegionAddRect(TR,a)
    set lastRect = a
    return IsPointInRegion(TR,x,y)
endfunction

function Trig_ddd_Actions takes nothing returns nothing
    local real x = GetUnitX(GetTriggerUnit())
    local real y = GetUnitY(GetTriggerUnit())
    call DisableTrigger(GetTriggeringTrigger())
    if IsPointInRect(gg_rct_rect_000,x,y) then
        set udg_Point[0] = GetRectCenter(gg_rct_rect_002)
    elseif IsPointInRect(gg_rct_rect_001,x,y) then
        set udg_Point[0] = GetRectCenter(gg_rct_rect_003)
    elseif IsPointInRect(gg_rct_rect_002,x,y) then
        set udg_Point[0] = GetRectCenter(gg_rct_rect_000)
    elseif IsPointInRect(gg_rct_rect_003,x,y) then
        set udg_Point[0] = GetRectCenter(gg_rct_rect_001)
    endif
    call SetUnitPositionLoc( GetTriggerUnit(), udg_Point[0] )
    call RemoveLocation(udg_Point[0])
    set udg_Point[0] = null
    call TriggerSleepAction(0.)
    call EnableTrigger(GetTriggeringTrigger())
endfunction

//===========================================================================
function InitTrig_ddd takes nothing returns nothing
    set gg_trg_ddd = CreateTrigger(  )
    call TriggerRegisterEnterRectSimple( gg_trg_ddd, gg_rct_rect_000 )
    call TriggerRegisterEnterRectSimple( gg_trg_ddd, gg_rct_rect_001 )
    call TriggerRegisterEnterRectSimple( gg_trg_ddd, gg_rct_rect_002 )
    call TriggerRegisterEnterRectSimple( gg_trg_ddd, gg_rct_rect_003 )
    call TriggerAddCondition( gg_trg_ddd, Condition( function Trig_ddd_Conditions ) )
    call TriggerAddAction( gg_trg_ddd, function Trig_ddd_Actions )
    set TR = CreateRegion()
endfunction

Бтв, Region Comprasion не помог бы

Единственное, что из-за микрозадержки могут быть случаи, когда некоторых юнитов не телепотирует и им ещё раз в область зайти нужно. Задержка нужна чтобы не вызвать бесконечный цикл, к сожалению, таймером в 0.00 сек тоже нельзя воспользоваться, он слишком быстрый для вара

хотя я вижу в твоём триггере, что юнит не может вернуться обратно через ту же область, поэтому тебе даже задержка не нужна
Загруженные файлы
`
ОЖИДАНИЕ РЕКЛАМЫ...
3
9
3 года назад
3
Desgul:
map_maiker, Я не селен в этом, пример надо хотя бы
Прикрепляю.
Там используется немного костыльная функция, чтобы нормально юнитов в области детектить.
function RectContainsUnitEPS takes rect r, unit u, real max_size returns boolean
    local real x = GetUnitX(u)
    local real y = GetUnitY(u)
    return (GetRectMinX(r)-max_size <= x) and (x <= GetRectMaxX(r)+max_size) and (GetRectMinY(r)-max_size <= y) and (y <= GetRectMaxY(r)+max_size)
endfunction
Ну и хеш-таблица, чтобы отслеживать телепортировавшихся юнитов.
В общем, если что не ясно - всегда можно спросить)

Кто бы мог подумать, что нет возможности узнать в какую область вошёл юнит... Это в чём-то логично, но я почему-то ожидал что такой способ есть...

И ради интереса, на сколько долей процента отличается время поиска юнита в группе от времени поиска юнита в хеш-таблице?
Загруженные файлы
Чтобы оставить комментарий, пожалуйста, войдите на сайт.