Добавлен
На этот раз моей задачей стало сравнение региона с коллекцией регионов (которая перебирается циклом), пока не найду нужный, НО в триггерах естественно нет сравнения по регионам.
Я использовал GetTriggeringRegion(), однако сравнивая регион, который был инициатором (Unit enter Region) с этим же регионом из массива я получаю false. Подскажите что не так?
Вот простой пример в котором также не работает это:
События:
  • Unit enter region1
Условия
Действия
  • (CS) if (GetTriggeringRegion() == region1) then
  • Вывести сообщение всем игрокам: "Работает"
  • (CS) endif
P.S. Сообщение не выводится когда юнит входит в регион

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

Никак. Регионы и области не сравниваются параметрически, то есть координатами, которые покрывают. Но можно узнать, находится ли точка в том или ином регионе. То есть, в твоем примере, проверить, находится ли юнит одновременно и в tempReg и в tempReg2.
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
21
5 лет назад
0
По идее, карта вообще не должна сохранятся. Потому что вы сравниваете rect ==region.
0
8
5 лет назад
Отредактирован pAxsIs
0
ScopteRectuS:
По идее, карта вообще не должна сохранятся. Потому что вы сравниваете rect ==region.
Как привести один тип к другому?
Это тоже не работает
Ущербно, что на гуи регион это ректангл, в результате путаница такая..
Загруженные файлы
1
17
5 лет назад
1
Никак. Регионы и области не сравниваются параметрически, то есть координатами, которые покрывают. Но можно узнать, находится ли точка в том или ином регионе. То есть, в твоем примере, проверить, находится ли юнит одновременно и в tempReg и в tempReg2.
Принятый ответ
3
28
5 лет назад
Отредактирован PT153
3
ScopteRectuS:
По идее, карта вообще не должна сохранятся. Потому что вы сравниваете rect ==region.
У него странный редактор, возможно, что у него либо нет JassHelper, либо он отключён. А при сравнении rect и region поток, скорее всего, обрубается.
pAxsIs:
Подскажите что не так?
Потому что ты регистрируешь событие на вход в rect. А оно работает так: создаётся новый регион, в который добавляется указанный rect. Переменной, в которой хранится ссылка на этот регион, нет, но GetTriggeringRegion() возвращает именно этот регион. Не говоря уже о том, что ты сравниваешь разные типы.
GetLocalPlayer:
Никак. Регионы и области не сравниваются параметрически
Ему нужно выяснить, какая ячейка массива содержит сработанный регион (если ему это действительно нужно). А это как раз и делается параметрически, ведь нужно сравнить ссылки.
Но можно узнать, находится ли точка в том или ином регионе.
native IsUnitInRegion               takes region whichRegion, unit whichUnit returns boolean
native IsPointInRegion              takes region whichRegion, real x, real y returns boolean
native IsLocationInRegion           takes region whichRegion, location whichLocation returns boolean
pAxsIs, если тебе нужно событие на вход или выход из region, то тебе нужны следующие функции.
native TriggerRegisterEnterRegion takes trigger whichTrigger, region whichRegion, boolexpr filter returns event
native TriggerRegisterLeaveRegion takes trigger whichTrigger, region whichRegion, boolexpr filter returns event
Тебе также пригодятся такие функции.
native CreateRegion             takes nothing returns region
native RemoveRegion             takes region whichRegion returns nothing

native RegionAddCell           takes region whichRegion, real x, real y returns nothing
native RegionAddCellAtLoc      takes region whichRegion, location whichLocation returns nothing
native RegionAddRect            takes region whichRegion, rect r returns nothing

native RegionClearCell         takes region whichRegion, real x, real y returns nothing
native RegionClearCellAtLoc    takes region whichRegion, location whichLocation returns nothing
native RegionClearRect          takes region whichRegion, rect r returns nothing
0
32
5 лет назад
0
Есть ректы а есть регионы, это разные обьекты, рект - это то что ты в редакторе областей рисуешь на карте, области которые имеют координаты макс и мин x\y. На них не существуют событий, можно сказать это такие пассивные хендлы которые тупо хранять в себе координаты, а есть регионы - у них нет координат, но они заполняют ректы, при этом может не 1 а сразу множество ректов заполнять один регион, вот на регион и вешается событие что юнит вошел\или вышел. На гуи сопоставить их невозможно, только на jass, 2 массива, в одном ректы в другом регионы, номера ячеек для пар регион-рект одинаковы, ну а далее перебором по GetTriggeringRegion() находим в массиве тот регион на который сработало событие, а по номеру ячейки массива в котором лежит этот регион находим рект.
Все просто, но на гуи не это у вас не выйдет.
0
8
5 лет назад
0
quq_CCCP:
только на jass, 2 массива, в одном ректы в другом регионы, номера ячеек для пар регион-рект одинаковы, ну а далее перебором по GetTriggeringRegion()
Я тоже сразу об этом подумал, что нужно так сделать, но проблема в том, что я не могу объявить глобальные переменные с регионами, потому что они должны быть перед кодом объявлены, поэтому затея с созданием коллекции регионов у меня провалилась.
PT153:
У него странный редактор, возможно, что у него либо нет JassHelper, либо он отключён.
Стандартный близардовский (работаю с ним, чтобы быть уверенным, что не будет проблем с совместимостью карт и тд).
Не хочу работать месяц над картой, а потом узнать, что навороченный редактор не дал мне запустить ее в варике. В общем такие опасения. Когда один раз врубал WE U, то мне сообщило, что карта типа устарела и предложил обновить ее для этого редактора, вот тогда я отказался и вернулся на стандартный редактор.
Никак. Регионы и области не сравниваются параметрически
Ему нужно выяснить, какая ячейка массива содержит сработанный регион (если ему это действительно нужно). А это как раз и делается параметрически, ведь нужно сравнить ссылки.
Все верно, это мне и нужно, пока регионы у меня не пересекаются, а значит можно проверять находится ли юнит в обоих регионах, как написал:
GetLocalPlayer:
То есть, в твоем примере, проверить, находится ли юнит одновременно и в tempReg и в tempReg2.
А вообще в идеале, нужно делать на будущее с учетом, что они могут пересечься, поэтому тогда лучше всего вариант: quq_CCCP - но я написал выше в чем у меня проблема с этим вариантам.
Пошел пробовать ваши идеи
0
28
5 лет назад
Отредактирован PT153
0
Не хочу работать месяц над картой, а потом узнать, что навороченный редактор не дал мне запустить ее в варике. В общем такие опасения. Когда один раз врубал WE U, то мне сообщило, что карта типа устарела и предложил обновить ее для этого редактора, вот тогда я отказался и вернулся на стандартный редактор.
Редактор никак не влияет на совместимость, влияет только версия игры. Потому установи JNPG и аддон к нему FNWE, если нужна русификация.
А открывать сделанную в JNPG карту в стандартном редакторе нет смысла.
JNPG работает только в версиях до 1.27.
И да, если ты откроешь карту, сделанную в редакторе для предыдущей версии игры, в редакторе для новой версии, то сообщение о "старости" карты высветится в любом случае, а нажатие OK ничего не сломает. Главное не делать наоборот.

На какой версии карту делаешь?
0
8
5 лет назад
Отредактирован pAxsIs
0
PT153:
Редактор никак не влияет на совместимость, влияет только версия игры.
Помню в далеком 2012 году была проблема совместимости (много времени конечно прошло 6 лет не заходил), но помню, как карта не запустилась и пришлось изворачиваться, чтобы ее запустить. Поэтому это осталось в памяти.

а нажатие OK ничего не сломает. Главное не делать наоборот.
Это говорит о том, что если делаешь карту на версии 1.24, то можно потом будет запустить на:
1.24, 1.26, 1.27 и тд - а обратно не получится.

На какой версии карту делаешь?
На версии 1.24е (Еще с 2012 осталась), примерно в том же году вышла 1.26а. Классные времена были, Гарена была переполнена картами из варика.

Кстати вариант со сравнением юнита в регионе мне помог
Картинка с рабочим кодом
Буду думать на счет решения моей проблемы с глобальными переменными.
Всем спасибо!
Загруженные файлы
0
17
5 лет назад
Отредактирован GetLocalPlayer
0
Ну на самом деле для этого не обязательно использовать Jass, в GUI есть проверка, находится ли юнит в области, именно области, а не в регионе, ее должно хватить.
PT153:
А открывать сделанную в JNPG карту в стандартном редакторе нет смысла.
Есть, как его может не быть? Игра обновляется, в новых версиях JNGP больше недоступен, а отказываться от появившихся возможностей как-то кощунственно. Соответственно поработав в JNGP на 1.30 и ниже, в более новых версиях карту уже не откроешь, а там могут появиться очень даже важные функции.
pAxsIs:
Все верно, это мне и нужно, пока регионы у меня не пересекаются, а значит можно проверять находится ли юнит в обоих регионах, как написал:
Ну по ссылке проверить в любом случае не получится. Дело в том, что событие "Юнит входит в регион" скрытно создает новый регион, в который включает указанную область, и получить доступ к этому региону из GUI мы никак не можем.
0
28
5 лет назад
Отредактирован PT153
0
Есть, как его может не быть?
Той же версии смысла нет.
А если делать в JNPG с включённым UMSWE, на версиях выше 1.27, могут быть проблемы.
Дело в том, что событие "Юнит входит в регион" скрытно создает новый регион, в который включает указанную область, и получить доступ к этому региону из GUI мы никак не можем.
Я уже это объяснил выше и сказал, что ему нужно регистрировать свой регион, а не через область в ГУИ.
pAxsIs:
Кстати вариант со сравнением юнита в регионе мне помог
Есть вариант сделать это без создания региона каждый раз при срабатывании триггера.

Триггер инициализации.
CS: local integer a = 0
CS: loop
CS: exitwhen a == RegionAmount
CS: set Regions = CreateRegion()
CS: endloop
CS: call RegionAddRect(Regions[0], <нарисованный тобой rect>)
CS: ...
CS: call RegionAddRect(Regions[RegionAmount - 1], <нарисованный тобой rect>)
CS: call TriggerRegisterEnterRegion(<нужный триггер>, Regions[0], null)
CS: ...
CS: call TriggerRegisterEnterRegion(<нужный триггер>, Regions[RegionAmount - 1], null)

В JNPG + FNWE всё это можно сделать в GUI.

Если у тебя единый триггер для всех регионов, то зарегистрировать их можно также циклом, внутри триггера находить нужный сравнением с GetTriggeringRegion().

Я ректы в ландшафте не рисую, делаю их в коде. Так гораздо удобнее для кода.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.