Добавлен Hodor
Делаю нативный AOE поиск юнитов в JASS
Все юниты на карте находятся в одной общей группе, карта небольшая
Юнитов ищу с помощью ForGroup по такой формуле: если (расстояние между координатами минус физический размер) меньше или равно AOE
Но я решил сделать эксперимент, брал юнита с дальней атакой, отбегал и давал приказ атаковать цель
Потом детектил ивент на атаку и измерял расстояние между координатами юнитов, в первом случае я атаковал слева и показало 830.031, во втором случае я уже атаковал справа и показало другие цифры 829.394
Повторил эксперимент ещё раз, атакуя с разных сторон и цифра получалась плюс-минус ~3 единицы, но не превышало максимальную возможную дальность атаки (физ. размер атакующего + радиус атаки атакующего + физ. размер цели)
И из за этого у меня возникли сомнения что получится сделать нативный AOE поиск, который работал бы точно как AOE из обычных абилок варкрафта
UPD:
GroupEnumUnitsInRange просто тупо по расстоянию между координатами ищет юнитов, это не то
Все юниты на карте находятся в одной общей группе, карта небольшая
Юнитов ищу с помощью ForGroup по такой формуле: если (расстояние между координатами минус физический размер) меньше или равно AOE
Но я решил сделать эксперимент, брал юнита с дальней атакой, отбегал и давал приказ атаковать цель
Потом детектил ивент на атаку и измерял расстояние между координатами юнитов, в первом случае я атаковал слева и показало 830.031, во втором случае я уже атаковал справа и показало другие цифры 829.394
Повторил эксперимент ещё раз, атакуя с разных сторон и цифра получалась плюс-минус ~3 единицы, но не превышало максимальную возможную дальность атаки (физ. размер атакующего + радиус атаки атакующего + физ. размер цели)
И из за этого у меня возникли сомнения что получится сделать нативный AOE поиск, который работал бы точно как AOE из обычных абилок варкрафта
UPD:
GroupEnumUnitsInRange просто тупо по расстоянию между координатами ищет юнитов, это не то
Принятый ответ
C++ тоже показывает 832.0, на С почему-то не смог запустить.
UrsaBoss, вообще, используй нативки, они точнее будут нахождения дистанции "руками" в данном случае. Но не используй Pow(), эта функция очень неточная.
UrsaBoss, вообще, используй нативки, они точнее будут нахождения дистанции "руками" в данном случае. Но не используй Pow(), эта функция очень неточная.
constant native IsUnitInRange takes unit whichUnit, unit otherUnit, real distance returns boolean
constant native IsUnitInRangeXY takes unit whichUnit, real x, real y, real distance returns boolean
constant native IsUnitInRangeLoc takes unit whichUnit, location whichLocation, real distance returns boolean
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
проверял уже
Но я уже сказал) Мне грубо говоря пофиг что там с дальностью атаки у юнитов, главное что она не превышает своего максимума
В данный момент я сомневаюсь в точности вычислений из под JASS
Т.к посчитал через теорему, получил 832.015
Посчитал просто Y2 минус Y1 получил 832.000
А если точность вычислений теоремы в JASS такая же как и в движке, то всё очень хорошо и можно будет закрыть вопрос.
Осталось подождать того кто сможет сказать это с уверенностью)
Ред. Hodor
Беру из координат X2 Y2 вычитаю X1 Y1 и потом полученные dx dy по отдельности возвожу в квадрат и слагаю, в конце из полученного числа вычисляю корень
Ред. PT153
UPD: проверил в JAVA и Python, там вроде выводит 832.0.
Пока с планшета сижу, не могу проверить.
Ред. PT153
Ред. PT153
UrsaBoss, вообще, используй нативки, они точнее будут нахождения дистанции "руками" в данном случае. Но не используй Pow(), эта функция очень неточная.
Ред. Hodor
Это если поставить героя на расстоянии 833.000, то ему придется чуть чуть пройти, короче проехали.
Главное чтобы точность работы с float была такая же как в движке.
IsUnitInRange
Тут тоже считает по расстоянию между координатами)
До завтра подержу вопрос открытым, вдруг кто то ещё знаниями поделится)
UPD:
как я уже определил с помощью BJDebugMsg - вся неточность в SquareRoot, т.е я передаю туда 692224.000 (квадрат 832), а мне возвращает 832.014832
короче, додумался сделать такой тест точности теоремы в движке:
оба юнита стоят в одинаковых X координатах, а атакующий смещен вверх от цели ровно на 832.000
832.000 это максимальный радиус атаки (т.к физ. размер атакующего 32, физ. размер цели 200 и дальность атаки 600)
если я задам атакующему координаты выше 832.000, то атакующий автоматически сдвинется с места и его координаты при атаке уже будут примерно 824 (округляя), а если я задам 832 или ниже, то атакующий никуда не сдвинется
Т.е при событии атаки я вычисляю разницу между Y координатой обоих целей
Это понятно
Я задаю 832 по Y и начинаю измерять расстояние, если я использую SquareRoot((y2-y1)*(y2-y1)) - то получаю 832.014832
делая нехитрые вычисления я нахожу "дальность атаки", т.е 832.014832 минус 200 и минус 32 и получаю 600,014832
Т.е атакующий по мнению SquareRoot "бьет с расстояния 600,014832", а это уже выше 600
А вот если я задам Y координату 832.014 или даже 832.001, то во время начала атаки используя разницу в Y координатах - будет около 824
Т.е получается что с 832.001 расстояния невозможно начать атаку и юнит "идет до цели"
Я ставлю обратно 832 в Y и всё замечательно
Учитывая то что я говорил выше - получается что SquareRoot в движке игре полностью точный, а SquareRoot в JASS нет
Попробовал Pow(dy*dy, .5), там такая же неточность, но уже не выше допустимого значения, а ниже
831.998901
Абсолютный бред
Сделал вот так: SquareRoot(SquareRoot(dy*dy)*SquareRoot(dy*dy))
И всё равно выдало 832.014832
Повторюсь, dy == 832
Столько часов делал бд со всеми физ. размерами и дальностями атаки, а оно вот как
Может быть есть какие нибудь способы сделать чтобы всё было точно?
Не предлагайте округлять, 832 это просто тестовое число, в игре же могут быть абсолютно разные числа
UPD:
извиняюсь, IsUnitsInRange считает не по координатам, а по физ. размерам + дальность (я думал из за Range в GroupEnumUnitsInRange который считает по координатам), как раз то что надо и нагрузки меньше будет
короче, закрыл вопрос