Приветствую, я не так давно начал изучать JASS. Я Столкнулся с проблемой разницы Rect и Region
Мне надо заставить разных юнитов в hashtable играть анимацию в зависимости от того какой из регионов (rect) стригерился
я кое что уже пробовал, например пытался преобразовывать rect в region и сравнивать с GetTriggeringRegion(), что очевидно не сработало ибо там я получал просто другой объект типа region(то как я это понял).
В общем, очень прошу помочь.

Deepire,
В той теме есть все необходимые ответы, просто нужно немного технической подкованности.
Если ты конвертнешь свой триггер в текст то увидишь следующую функцию регистрации события TriggerRegisterEnterRectSimple(gg_trg_EnterRegion1,gg_rct_CastRegion1) , которая является бж-функцией (кастом функцией написанной близами) и на самом деле она выглядит так:
function TriggerRegisterEnterRectSimple takes trigger trig, rect r returns event
    local region rectRegion = CreateRegion()
    call RegionAddRect(rectRegion, r)
    return TriggerRegisterEnterRegion(trig, rectRegion, null)
endfunction
То есть функция конвертирует rect gg_rct_CastRegion1 в локально созданный регион и вешает на этот регион событие входа, таким образом твой изначальный рект никак не связан с самим триггером, а регион оказывается потерянным, так как на него не сохранятся ссылок (да и функции GetTriggerRegion() не существует все равно).
В твоем случае, для проигрывания нужной анимации будет достаточно проверить лежит ли координата вошедшего юнита внутри каждого из изначальных ректов:
local real x = GetUnitX(GetTriggerUnit())
local real y = GetUnitY(GetTriggerUnit())
if RectContainsCoords(gg_rct_CastRegion1,x,y) then
	// bla bla
elseif RectContainsCoords(gg_rct_CastRegion2,x,y) then
	// bla bla bla 
elseif ...
Стоит отметить что плодить много elseif-ов это моветон.
И в сразу советую называть "Регионы" которые ты создаешь в редакторе Rect-ами, которыми они являются на самом деле.
`
ОЖИДАНИЕ РЕКЛАМЫ...
23
Вот похожая история с поиском области триггера, посмотри тут)
И начало топика тоже. В таких событиях по факту идёт привязка события именно к региону, а не области, а область задаёт региону форму.
Ответы (4)
7
Deepire,
В той теме есть все необходимые ответы, просто нужно немного технической подкованности.
Если ты конвертнешь свой триггер в текст то увидишь следующую функцию регистрации события TriggerRegisterEnterRectSimple(gg_trg_EnterRegion1,gg_rct_CastRegion1) , которая является бж-функцией (кастом функцией написанной близами) и на самом деле она выглядит так:
function TriggerRegisterEnterRectSimple takes trigger trig, rect r returns event
    local region rectRegion = CreateRegion()
    call RegionAddRect(rectRegion, r)
    return TriggerRegisterEnterRegion(trig, rectRegion, null)
endfunction
То есть функция конвертирует rect gg_rct_CastRegion1 в локально созданный регион и вешает на этот регион событие входа, таким образом твой изначальный рект никак не связан с самим триггером, а регион оказывается потерянным, так как на него не сохранятся ссылок (да и функции GetTriggerRegion() не существует все равно).
В твоем случае, для проигрывания нужной анимации будет достаточно проверить лежит ли координата вошедшего юнита внутри каждого из изначальных ректов:
local real x = GetUnitX(GetTriggerUnit())
local real y = GetUnitY(GetTriggerUnit())
if RectContainsCoords(gg_rct_CastRegion1,x,y) then
	// bla bla
elseif RectContainsCoords(gg_rct_CastRegion2,x,y) then
	// bla bla bla 
elseif ...
Стоит отметить что плодить много elseif-ов это моветон.
И в сразу советую называть "Регионы" которые ты создаешь в редакторе Rect-ами, которыми они являются на самом деле.
Принятый ответ
7
Deepire, ошибся, не существует GetTriggeringRect(), а не GetTriggeringRegion()
Чтобы оставить комментарий, пожалуйста, войдите на сайт.