Добавлен
как я заметил при функции pick every unit к примеру с радиусом 500, в радиус функции попадают юнит чей физический центр был задет этим радиусом, а не окружность физ. размера юнита. Итак вопрос как задеть этой функцией ОКРУЖНОСТЬ юнита а не его центр? к примеру если нужно пикнуть здание или большого юнита с широким радиусом

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

Просто к радиусу добавляете самый большой физический размер на карте (500 + maxCollizionSize). Но потом нужно сделать проверку IsUnitInRangeXY(enumUnit, x, y, 500).
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
19
4 года назад
0
Похожие вопросы:

ответ
ответ
Pick every unit in range [250] matching condition [бафф спелла]
Всё что находится внутри данного блока произойдёт столько раз, сколько воинов находится внутри выбранной группы. Обратиться к воину можно через Picked Unit ( GetEnumUnit( ) ). Если Вам нужно добавить событие на смерть именно этих воинов, то прямо здесь внутри блока добавляете их в событие триггера, выбрав их через Picked Unit, или сохраняете их в переменные.

Также можно не сохранять каждого воина, а занести их в отдельную группу. А вместо проверки:
Условие: Dying unit = Aim [Integer A]
проверяете, находится ли воин в группе.
ответ
triggering unit - юнит-инициатор, в зависимости от события триггера
измени переменную triggering unit на matching unit. Неудивительно, что оно срабатывает, там фильтр принимает истину для каждого matching unit
matching unit - работает в фильтре, который отсеивает всех выбранных по условию. если условие вернет истину, значит, добавляет в группу. если не подходит, отсеивает.
picked unit - выбранный юнит

даем героям опыт, которые еще живы. +еще какие-то условия

объяснение (если раскрыть обертку)
вот тут выбирает всех юнитов в группу g с необходимым условием f. Внутри фильтра matching unit (на jass GetFilterUnit)
call GroupEnumUnitsInRect(g,bj_mapInitialPlayableArea ,f)
далее перебираете каждого PickedUnit (GetEnumUnit), и что то делаете с ними
call ForGroup(g,function ....)

2
21
4 года назад
2
Просто к радиусу добавляете самый большой физический размер на карте (500 + maxCollizionSize). Но потом нужно сделать проверку IsUnitInRangeXY(enumUnit, x, y, 500).
Принятый ответ
0
27
4 года назад
Отредактирован MpW
0

не знаю будет работать способ предоставленный на киберфоруме, если что стоит лучше поискать в инете. мб есть вариант получше
у здания обычно там не физ размер, у них это прямоугольная (квадратная) текстура пути. диагональ прямоугольника, а точнее квадрата наверн надо принимать за радиус?
0
32
4 года назад
0
Просто добавить к кругу выбора средний размер юнитов., к примеру 32
0
26
4 года назад
Отредактирован Extremator
0
Вообще делается всё через повторную фильтрацию юнитов уже после отбора подходящих целей, при этом нужно брать юнитов в чуть большем радиусе чем нужно (потому что есть косяк с которым ты как раз и столкнулся), например +75 лишних будет достаточно.
С уже отфильтрованными юнитами (без трупов, без зданий, врагов/друзей, невидимых, и прочих) нужно провести пересчёт дистанции от центра области (точка, вокруг которой выбирались юниты) до реального местоположения юнитов, которое будет получаться за счёт изменения их действительных координат в зависимости от их физ.размера.
Тут ещё такой момент, если чуть-чуть увеличить сравниваемую дистанцию, то тогда можно имитировать что отлов происходит не за счёт попадания "подножья" юнита в нужный круг (область поиска), а за счёт заступления одного круга в другой (область выбора в коллюзию юнита).
А вот для определения физ.размера юнита тебе придётся воспользоваться либо филдом, коих сейчас там навалом (хотя наверно как обычно - нужного как раз нет, и не будет). Но это если у тебя не 1.26, а если он самый - то наверно либо БД пилить на размеры и типы юнитов (хотя будет ли оно тут уместно, получать простое число за счёт перебора огромного списка), либо маркеровать юнита через РО (а тут уже либо ascii юнитов подгонять, либо абилки-пустышки выдавать).

*Ну а теперь немножко лично от себя:
Добавить лишние 32 к радиусу выбора - да, можно. Это на много проще чем вообще что либо делать. Это хорошо прокатывает на областях выбора 300-600. Чем больше - тем лучше, хотя разницы уже и не заметишь. А если область небольшая? всего 120-150, вот тут начинается трешачок. Можно сказать что такие числа никто не использует. Да, можно. Но их всё равно кто-то да использует. У меня вот есть голем, который бросаем небольшой камень в указанную область, что бы задеть буквально пару-тройку стоящих рядом врагов. И вот эта область как раз 150. Сказать что это просто дичь в игре - ничего не сказать. Выбираешь область, летит снаряд, падает, выбираются юниты, наносится урон. При этом кого-то явно не зацепило, а должно было. И наоборот - попало тому кто был в стороне. Казалось бы, может где-то сам накосячил, и выбор идёт со смещением - нет, отрисовка области ясно это показывает. И именно в таких ситуациях эти +32 или хотя бы +16 вообще никак не помогают, а лишь вносят больше сумбура в происходящее.
0
17
4 года назад
Отредактирован GetLocalPlayer
0
А вот для определения физ.размера юнита тебе придётся воспользоваться либо филдом, коих сейчас там навалом (хотя наверно как обычно - нужного как раз нет, и не будет).
Если ты про последний патч, то
BlzGetUnitCollisionSize
Но это если у тебя не 1.26, а если он самый - то наверно либо БД пилить на размеры и типы юнитов (хотя будет ли оно тут уместно, получать простое число за счёт перебора огромного списка), либо маркеровать юнита через РО (а тут уже либо ascii юнитов подгонять, либо абилки-пустышки выдавать).
Первый комментатор дал имя нужной функции
IsUnitInRangeXY
Она учитывает физический размер юнита.
2
26
4 года назад
2
GetLocalPlayer:
IsUnitInRangeXY
Она учитывает физический размер юнита.
Ну, если учитывает всё-таки, тогда да.
Можно её первой в фильтре ставить и закончить на этом.
Но вот если нет...
0
26
4 года назад
Отредактирован Extremator
0
GetLocalPlayer:
IsUnitInRangeXY
Она учитывает физический размер юнита.
Нет, всё-таки она не с работает с физ.размерами юнитов.
Для незрячих поясню: Один юнит явно находится в круге, но проверка показывает что юнит в безопасности (зелёный). Другой юнит явно находится вне круга, но проверка показывает что юнит в опасности (красный).
0
16
4 года назад
0
как незрячий отмечу, что работает оно с физ размерами, иначе бы аое скиллы в доте против вышек не работали бы никогда вообще
1
17
4 года назад
Отредактирован GetLocalPlayer
1
Нет, всё-таки она не с работает с физ.размерами юнитов.
Вот более надежный способ проверки
Если способность действует по области, то ее круг выделения всегда учитывает физический размер юнита. Можешь заметить, что достаточно коснуться краешком области действия способности юнита, как тот тут же выделяется зеленым. Здесь видно, проверка IsUnitInRangeXY соответствует физическому выделению юнита способностью.
Загруженные файлы
Чтобы оставить комментарий, пожалуйста, войдите на сайт.